当前所在位置:首页>新闻中心>媒体报道

人脸识别中Softmax-based Loss的演化史

时间:2019-08-05 小编: 点击:616

Softmax 简介


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

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

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

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

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

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

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

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


归一化(Normalization)


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

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

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


Weight Normalization


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

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

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

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

    如何让 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 模长的均值,并幅值给 α,然后再用下面的 loss 约束每一个 weight vector 靠近这个均值

    作者自己建立了一个人脸数据集,包含两部分,第一部分大概包含 20k 个 id,每个 id 有 50-100 张图片,第二部分包含 1k 个 id,每个 id 仅有 20 张图片。如果在这个数据集上使用不加 weight normalization 的 softmax,得到的结果如下。

    可以发现,上图最右侧,从 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 后在 LFW 上 report 得到的结果是 99.71%,已经远远超过了不做 weight normalizaton 的 baseline 98.88%。

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


Feature Normalization


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

    优化 softmax loss 需要增大 ,也需要增大 为了变大,根据上面的定义,优化会倾向于:

  1. 增大正确类别的 weight norm 。效果是样本多,简单的类别,weight norm 大。反之则小。证据见 [A-Softmax] 的附录。

  2. 增大样本的 feature norm 。效果是简单样本 norm 大,困难样本 norm 小。证据见很多 paper,例如本文下面 [L2-Softmax] 的 Figure。

  3. 缩小 feature 和 weight vector 的夹角。

    数学上,上面的三种变化会同时发生,导致最终的 feature 分布呈现出“扇形”形式。例如, [NormFace] 中给了这样一个例子,MNIST 上,feature 的维度限定为 2,10 个类别的 feature 分布可视化如。

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

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

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

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

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

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

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

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

  1. 为何 normalization 在 verification 中管用;

  2. 为何在训练中简单做 normalization 不 work 以及如何才能 work;

  3. 其他的 metric loss 如何做 normalization。

   [NormFace] 本身并没有提出新的 idea,只是全面系统的总结了前人关于 normalization 的经验和技巧,并给出了令人信服的分析。

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

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

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

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

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

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

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

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