Softmax-based Loss的演化史

Apr 25, 2024
2 views
Computer Vision

近期,人脸识别研究领域的主要进展之一集中在了 Softmax Loss 的改进之上;本文从两种主要的改进方式——做归一化以及增加类间 margin——展开梳理,介绍了近年来基于 Softmax 的 Loss 的研究进展。

Softmax简介

Softmax Loss 因为其易于优化,收敛快等特性被广泛应用于图像分类领域。然而,直接使用 softmax loss 训练得到的 feature 拿到 retrieval,verification 等“需要设阈值”的任务时,往往并不够好。

这其中的原因还得从 Softmax 的本身的定义说起,Softmax loss 在形式上是 softmax 函数加上交叉熵损失,它的目的是让所有的类别在概率空间具有最大的对数似然,也就是保证所有的类别都能分类正确,而 retrievel 和 verification 任务所需要的是一个泛化性能更好的度量空间(metric space)。保证分类正确和保证一个泛化性优良的 metric space 这两者之间虽然相关性很强,但并不直接等价。

因此,近年来,face recognition 领域的主要技术进展集中在如何改进 softmax 的 loss,使得既能充分利用其易于优化,收敛快的优良性质,又使得其能优化出一个具有优良泛化性的 metric 空间。而这些技术改进主要又能被归为两大类别,做归一化以及加 margin。以下从这两个方面进行一些梳理。

从一个简单的基于 Softmax Loss 的例子出发。下图描述了基于 softmax loss 做分类问题的流程。输入一个训练样本,倒数第二层的 feature extraction layer 输出 feature x,和最后一层的classification layer 的类别权重矩阵\(W=\{W_1, W_2,...,W_K\}\) 相乘,得到各类别的分数,再经过 softmax function 得到 normalize 后的类别概率,再得到 cross-entropy loss。

image

类别 weight \(W_k\)可看作是一个类别所有样本的代表。\(f_i^k\)是样本\(i\) feature 和类别\(k\) weight 的点积,可以认为是样本和类别的相似度或者分数。通常这个分数被称为 logit。

Softmax 能够放大微小的类别间的 logit 差异,这使得它对这些微小的变化非常敏感,这往往对优化过程非常有利。我们用一个简单的三分类问题以及几个数值的小实验来说明这个问题。假设正确的类别为 1。如下表的情况(d)所示,正确类别的概率才 1/2,并不高。

如果要进一步提高正确类别概率,需要正确类别分数远高于其它类别分数,需要网络对于不同样本(类别)的输出差异巨大。网络要学习到这样的输出很困难。然而,加了 softmax 操作之后,正确类别概率轻松变为\(\frac{e^{10}}{e^{10}+e^5+e^5}=98.7\%\),已经足够好了。

image

可见,softmax 中的指数操作,可以迅速放大原始的 logit 之间的差异,使得“正确类别概率接近于 1”的目标变得简单很多。这种效应可以称为“强者通吃”。

归一化(Normalization)

归一化(normalization),是人脸识别领域中一个重要的方法。它的做法实际上非常简单。归一化的定义如下:

  • 对 feature 做归一化(feature normalization)的定义为
    image

  • 对 weight 做归一化(weight normalization)的定义为
    image

Weight Normalization

为了搞清楚为什么需要做 weight normalization,这首先要从数据不均衡的问题说起,这一问题在常见的人脸识别数据集中很普遍。下图展示了在几个常用的人脸识别数据集上类别与 sample 数量的统计分布。

image

在 "SphereFace"的附录部分,给出了关于训练数据不均衡如何影响 weight 的 norm 的一个经验分析。左边两张图是 MNIST 上的实验结果,右边两张图是 WebFace 上的实验结果。可见,对于样本数多的类别,它的 weight 的 norm 会更大。

image

再举一个非常极端的例子。假设有一个三个人的分类问题,其中 A,B 两个人各有 100 张照片,而另外一个人 C 的照片只有 5 张,那么训练这个三分类问题,最终将其 weight 的每一列在二维空间上做一个可视化,就应该是下图这个样子。

image

对于数据量大的 A,B 两个人,他们的 weight 的 norm 很大,几乎瓜分了整个特征空间,而 C 由于照片数量少,他的 weight 的 norm 很小。而我们当然知道,实际情况下,A,B,C 三个人绝对应该是处于一个平等的地位的,换言之,在特征空间里面,他们也应该处于一个“三足鼎立”的模式,就像下图所示。

image

如何让 A,B,C 这三个人在训练时受到平等对待呢?这个时候,Weight Normalization 就起作用了。Weight Normalization 的想法被 2016 年 NIPS 的 "WeightNorm" 提出。这篇paper通过大量的实验表明了 Weight normalization 相比 batchnormalization 能减少计算量,并且能使得网络更快的收敛。

不过这篇 paper 并没有提到 weight normalization 可以用来改善数据不均衡的问题。最早把 weight normalization 和数据不均衡问题联系起来的是 Guo Dongyao 等人的工作。Guo Dongyao 等人在 2017 年提出了一种做 weight normalization 的方法变种 "UPLoss",他们首先计算所有 weight 模长的均值,并幅值给 \(\alpha\)

image

然后再用下面的 loss 约束每一个 weight vector 靠近这个均值

image

其中\(C_n,C_b\)代表novel和base数据类别,作者自己建立了一个人脸数据集,包含两部分,第一部分大概包含 20k 个 id,每个 id 有 50-100 张图片(base set),第二部分包含 1k 个 id,每个 id 仅有 20 张图片(novel set)。如果在这个数据集上使用不加 weight normalization 的 softmax,得到的结果如下。

image

可以发现,上图最右侧,从 2 到 2.1 这个区间,也就是最后的 1k 个 id 的 weight 的 norm 明显小于前 20k 个。并且,最后 1k 个 id 在训练集上的 recall 只有 30%。而在增加了作者提供的 weight normalization 方法后,最后 1k 个 id 的 weight norm 和前 20k 个 id 的 weight norm 之间的差距明显变小了。作者提到在训练集上的 recall 一下子提升到了 70%。

所以说来说去, weight normalization 本质上就做了一件事,在网络中引入一个先验,即告诉网络,无论类别本身的 sample 数量是多还是少,所有类别的地位都应该是平等的,因此它们的 weight 的 norm 也是相似的。

Feature Normalization

为了搞清楚为什么需要做 feature normalization,我们首先看看 Softmax Loss 在优化的过程中会发生什么。

优化 softmax loss 需要增大\(p_i\),也需要增大\(f_i\)。为了变大\(f_i^k\),根据上面的定义,优化会倾向于:

  1. 增大正确类别的 weight norm  \(||W_{y_i}||\)。效果是样本多,简单的类别 weight norm 大。反之则小。
  2. 增大样本的 feature norm  \(||X_i||\)。效果是简单样本 norm 大,困难样本 norm 小。证据见很多 paper,例如下图
  3. 缩小 feature 和 weight vector 的夹角。
    数学上,上面的三种变化会同时发生,导致最终的 feature 分布呈现出“扇形”形式。例如, "NormFace" 中给了这样一个例子,MNIST 上,feature 的维度限定为 2,10 个类别的 feature 分布可视化如下:

image

尽管分类的精度可以很高,但是这样的 feature 分布,对于困难样本是敏感的,推广性不好。上面的例子中,\(f_2\)(困难样本,norm 小)和\(f_3\) 属于同一类,但由于 norm 相差太大,反而和 norm 差不多的\(f_1\)(另外一类的困难样本)在欧式空间下距离更近,于是分错了。这个例子也说明 feature norm 小的样本更不稳定。

同时也说明了,使用欧氏距离作为 feature 和 feature 之间的度量是不稳定的,因为它依赖于 feature 的 norm。而如果我们用角度作为 feature 和 feature 之间差异的度量,就可以不受 norm 不稳定的影响。因此,我们希望网络更多的从第 3 点“缩小 feature 和 weight vector 的夹角”这个方向去学习。

L2-Softmax

为了让网络从“缩小 feature 和 weight vector 的夹角”这个方向去学习,我们自然就需要把另外两条路给堵死。最理想的情况也就是 weight normalization 和 feature normalization 都做。2017 年,"CrystalLoss"(也就是 "L2-Softmax")提出了 feature normalization,并做了大量的分析和实验证明这个简单的 trick 对分类问题极其有效。

在 "CrystalLoss" 中,作者在 MNIST 上和一个简单的 3 个人的分类问题进行了可视化实验。在 MNIST 上,每个类变得更“窄”,在人脸实验上,每个类的 feature 变得更加集中。这些实验都证明了,使用 feature normalization 确实能让不同的类学出的 embedding,在角度方向上更具有可区分性。

image

image

不过,如果只是单纯的对 feature 做 normalization,那么极有可能陷入一个网络难以收敛的窘境,这个现象在 "L2-Softmax" 和 "NormFace" 中都提到了,并且 "NormFace" 还从数值上给出了这个现象的解释,这里不再阐述这些细节。不过解决方法也很简单,只需要在对 feature 做归一化后,再乘上一个大于 1 的伸缩系数,绝大多数情况下都能获得不错的收敛性。

在 "L2-Softmax" 中,对如何如何选取这个伸缩系数进行了分析和实验。一个好消息是,"L2-Softmax" 的实验结果确实表明,网络对这个系数的选取还是非常鲁棒的。下图展示了,伸缩系数 α 的选取,从 10 左右,到 50 左右,网络都有不错的表现。

image

不过遗憾的是 "L2-Softmax" 并没有把两种 normalization 都加上,而只是单纯加了 feature normalization。

在 "L2-Softmax" 的基础上,“NormFace“ 进一步把两种 normalization 都做了,并做了更详尽的分析,对 normalization 中的三个问题进行了全面系统的回答:

  1. 为何 normalization 在 verification 中管用;
  2. 为何在训练中简单做 normalization 不 work 以及如何才能 work;
  3. 其他的 metric loss 如何做 normalization。
    ”NormFace“ 本身并没有提出新的 idea,只是全面系统的总结了前人关于 normalization 的经验和技巧,并给出了令人信服的分析。

CCL

除了这些主流的两种做 normalization 的方法,还有一些它们的变体。在 2017 年的 "DeepVisage" 中,提出了一种对 feature 做白化,而不是单纯的 normalization 的方法。在 2018 年的 "CCL" 中对这个想法进行了更加细致的分析和实验。对 feature 做白化的定义如下:

\[ f^N = \frac{f^p-\mu}{\sqrt{\sigma^2}} \]

与单纯的 feature normalization 相比,对 feature 做白化的效果是希望使得所有的 feature 尽可能均匀分布在空间中,同时每一维发挥的作用尽量相似,不要浪费空间和维度。

作者做了一个简单的实验来展示这种归一化方式的效果,左边表示的是原始的 Softmax 训练后所得样本的 feature 在二维空间可视化后的分布,右边是使用白化后的效果。很明显能看出白化后的 feature 能更好地利用整个 feature 空间。

image

不过在实验部分,文章还是承认了,白化这种归一化方式,在实际使用时,由于均值很大,而方差又极小,在数值上基本上就和 feature normalization 很接近。

Ring Loss

2018 年 CVPR 的另一篇讨论 feature normalization 的工作是 "RingLoss"。"RingLoss" 的 Motivation 是传统的 hard 方式的归一化可能带来 non-convex 的优化问题,提出的 solution 很简单,直接加 soft normalization constraint 到优化里面就可以了。

不过作者并没有很严格地给出传统 hard 方式归一化是属于 non-convex 以及新的 soft 方式的 normalization 是 convex 的证明,只是从一个数值实验上表面了 Ring Loss 具有优良的收敛性。

image

Ring loss 的具体形式很简单:

image

其中,R 是需要学习的 feature norm 的参数(类似于 [L2-Softmax] 的 α 和 [NormFace] 中的 l,λ 是控制 Ring loss 项的权重。

到现在为止,我们基本上已经明白了 feature normalization 或者 weight normalization 能在一定程度上控制网络对简单或者难样本的关注程度。具体一点就是,如果不加约束,网络总是希望让简单的样本的 feature 模长和 weight 模长变大,让难的样本的 feature 和 weight 的模长变小,这个现象在 "SphereFace"、"NormFace" 以及 "RingLoss" 中均有分析。

现在,我们知道应该把两种 normalization 都加上,让网络去学习角度方向上的差异性。不过如果两种 normalization 都做了,而不加别的处理,网络会非常难 train。在 "NormFace" 中,对这种现象进行了数值上的分析,指出在 weight 和 feature 都归一化到 1 之后,在类别数较多时,即使是正确分类的 sample,都将获得与分错的样本在数值上差不多大小的梯度,而这自然就会影响网络去关注那些更需要学习的样本。

Heated-up Softmax

"NormFace" 的给出的解决方法和 "L2-Softmax" 几乎一样,就是引入一个 scale 参数(对应 "L2Softmax" 中的 \(\alpha\) )。而 scale 参数又是如何具体的影响网络优化的过程呢?针对这个问题,"HeatedUpSoftmax" 做了非常完整的分析。并提出在两种 normalization 都做时,在训练的不同阶段,通过人为的控制这个 scale 系数 \(\alpha\),能达到控制网络关注简单样本还是难样本的目的。

"HeatedUpSoftmax" 中的 Softmax 形式如下。

image

文章给出的结论是,\(\alpha\) 从 0 变大的过程中

  1. hard 样本的梯度越来越大。
  2. easy 样本的梯度先小,后大,再小。
    选择不同的 \(\alpha\) 会影响这些样本在优化过程中的运动速度和分布情况。

下面是一个 MNIST 上的很好的 toy example,显示选择不同 \(\alpha\) 时的影响。

image

因此,文章提出的一种称为“HeatedUp”的训练策略,就是希望在开始的阶段,使用大的 \(\alpha\) 让网络关注简单样本,从而迅速收敛,在训练的后期使用小的 \(\alpha\) 让网络开始重点关注难样本。

  • 情况 (a):\(\alpha\) 太小是不好的。此时所有样本都走的很慢,分类都分不开;
  • 情况 (d):\(\alpha\) 太大也是不好的。此时处于分类外面很远的最hard样本走的很快,能够分对。但是位于分类面附近的模棱两可的 boundary 样本走的不快。最终的分类面不够 compact;
  • 情况 (b, c):合适的 \(\alpha\) 能让各类样本(主要是 hard 和 boundary)都获得合适的梯度,得到比较 compact 的分类面。
    据此,本文提出动态调整 \(\alpha\) 的策略:刚开始优化时使用大的 \(\alpha\),让 hard 样本迅速变成 boundary 样本。然后逐渐变小 \(\alpha\),让 boundary 样本也能获得足够的梯度,进一步缩小分类面。

逐渐变小 \(\alpha\) 的过程,也就是逐渐把分类面附近的样本往类中心挤压的过程。对应地,temperature 逐渐增大,也就是本文的“heated up”。

最后再总结一下,无论是早期的 weight normalization,feature normalization,还是后期这些形式的一些变体以及一些 trick,它们归根结底,都是为了以下三点:

  1. 防止网络在长尾问题上“顾此失彼”。
  2. 防止网络一旦把样本分对就“浅尝辄止”。
  3. 防止网络在难样本问题上“掩耳盗铃”。

增加类间 angular margin

在真实任务中,例如 face verification,我们需要计算未知类别的样本的相似度,此时仅仅保证“已知类别分类正确”是不够的。为了更好的泛化性能,我们还需要诸如“类内样本差异小”“类间样本差异大”这样的良好性质,而这些并不是 softmax loss 的直接优化目标。(尽管,softmax loss 优化的好可以间接的达成这些目标。)

换而言之,除了好的 classification probability,一个好的 metric space 更加重要。前者成立并不意味着后者成立。如上面 Figure 的例子,在该 metric space 内,Euclidean distance 的性质是很差的。