人脸识别损失函数(Center-Loss、A-Softmax、AM-Softmax、ArcFace)

最近在研究自编码器提取特征做分类和生成、重建。所以细致了解人脸识别的各种损失函数!

1、概要

人脸识别:输入一张图片,进行人脸检测,再提取关键点进行人脸对齐矫正,最后提取人脸特征,进行判别这个人是谁。判别这个人是谁,本质上是分类问题。

既然牵涉到分类,分类的目的就是不同类的类间间距够大,同一类的类内距离足够小。那么我们一步一步介绍人脸识别中常用的损失函数。

2、Softmax Loss

Softmax :将特征图扁平化后的输出映射到(0,1)之间,给出每个类的概率。假设最后一层特征图尺度是: 5*5*1000 。再将这些特征输入给扁平化 为 [ N * 1 ] 个向量(这里的 N5*5*1000=25000 )。下面扁平化的 [ N X 1 ] 的向量进入全连接层,全连接层的参数权重是 W ( T X N )(这里的 T 表示分类的类别数),经过全连接层处理就会得到一个 [ T x 1 ] 的向量,但是这个向量里面都每个数值的大小都没有限制,或许是无穷大,也有可能是无穷小,均有可能。因此多分类时候,往往在全连接层后面接个 Softmax 层。这个层的输入是 [ T x 1 ] 的向量,输出也是 [ T x 1 ] 的向量。但是输出的每个向量都归一化到 [0,1] 之间。这里的 Softmax 输出的向量是该样本属于每一类的概率

Softmax 公式:

P_j=\frac{e^{a_j}}{\sum_{k=1}^{T}{e}^{a_k}}

上面公式中的 a_j 表示这 [ T x 1 ] 个向量中的第 j 个值,而下面分母表示所有值的求和。上式成功的把 P_j 归一化到 (0,1) 之间。优化目标:属于正确标签的预测概率最高。

下面介绍 Softmax \ Loss

L=-\sum_{j=1}^{T}{y_i} \ {\log{p_j}}

上式中的 p_j 表示 Softmax 层输出的第 j 的概率值。 y 表示一个 [ 1 x T ] 的向量,里面的 T 列中只有一个为1,其余为0(真实标签的那个为1,其余不是正确的为0)。这个公式有一个更简单的形式是:

L=-\log p_j

其中的 j 是指当前样本的真实标签。 log 函数是个递增的函数,你预测错的概率会比你预测对的概率要大,因为前面加了一个负号。

图像分类里面常用 Softmax \ Loss

3、Center Loss

Center \ Loss 来自 ECCV2016 一篇论文:

<A \ Discriminative \ Feature \ Learning \ Approach \ for \ Deep \ Face \ Recognition>

MNIST 数据集进行分类,若损失函数采用上述介绍的 Softmax \ Loss (因为 Softmax \ Loss 能够使特征可分),那么最后每个类别数字学出来的特征分布下图,我们可以看出类间距离还是比较小,类内距离比较大的,虽然效果很好:

如果损失函数采用 Center \ Loss ,那么特征分布如下图,我们可以看出相比于 Softmax \ Loss 类间距离变大了,类内距离变小了:

所以我们可以看出 Center \ Loss 能够最小化类内距离的同时保证特征可分,来提高特征之间的可判别性!简单地说,给每一类( label )定义一个类中心( Center ),同一类的数据向类中心靠近,离得远要惩罚!于是 Center \ Loss 就出现了。

Center \ Loss = \frac{1}{2m}\sum_{i=1}^{m}{|x_i-c_{y_i}|_2^{2}}

其中 c_{y_i} 表示这个样本所对应的第 y_i 类别的特征中心m 表示每一个 batch 大小。上述公式的意义是:希望 batch 中的每个样本特征距离特征中心的距离的平方和越小越好,也就是负责类内差距。

那么上述的 c_{y_i} 每一 batch 怎么确定的呢?理想情况下, c_{y_i} 需要随着学习到的 feature 进行实时更新,也就是在每一次迭代的时候用整个数据集的 feature 来计算每个类的中心。但是这样时间复杂度高,于是:用 batch 来更新 center ,每一轮计算一下当前 batch 数据与 center 的距离,然后这个距离以梯度的形式叠加到 center 上。 我们下面对 x_i 求导:

\frac{\partial L_{c}}{\partial x_i}=\frac{1}{m}\sum_{i=1}^{m}{(x_i - c_{y_i})}

这里因为每个 batch 的数量 m 太小,那么每次更新 center 可能会引起 center 抖动。那么梯度上面加个限制 \alpha ,这个值在 0-1 之间:

\Delta c=\frac{\alpha}{m}{\sum_{i=0}^m{}(x_i-y_{i})}

为了最小化类内,最大化类间,即满足特征可分和特征可判别,论文中将 Softmax \ LossCenter \ Loss 结合。

有大牛在 Cifar10Cifar100 上测试过 Center \ Loss ,发现效果并不是很好,准确率明显低于单独的 Softmax ;在 MNIST 上测试加上 Center \ LossSoftmax 好于单独的 Softmax ;所以理解之所以 Center \ Loss 是针对人脸识别的 Loss 是有原因的,因为人脸的中心性更强一些,即一个人的所有脸取平均值之后的人脸我们还是可以辨识是不是这个人,所以 Center \ Loss 才能发挥作用。

4、A-Softmax Loss

A-Softmax 来自于 CVPR2017 。论文题目: 《SphereFace: Deep \ Hypersphere \ Embedding \ for \  Face \ Recognition》 拿图像分类来说。卷积神经网络提取特征,然后全连接层进行扁平化,再送入 Softmax 层实现分类。传统的 Softmax 很容易优化,因为它没有尽可能的扩大类间距离,缩小类内距离。

假设最后一层的输出特征向量为 x_i ,它对应的标签是 y_i ,那么 Softmax 又可以写成: L_{总}=\frac{1}{N}\sum_{i}L_{i}

其中L_{i}=-\log p_j, p_{j}=\frac{e^{a_j}}{\sum_{k=1}^{T}{e}^{a_k}}=\frac{e^{f_{y_i}}}{\sum_j{e^{f_j}}}

那么上式 L_{总} 可以表示为:

L_{总}=\frac{1}{N}\sum_{i}L_{i}=\frac{1}{N}\sum_{i}-\log(\frac{e^{f_{y_i}}}{\sum_je^{f_j}})

其中 f_{y_i} 可以用欧式空间的向量积来表示:

f_{y_i}=W_{y_i}x_i(卷积)=||W_{y_i}||||x_i||cos(\theta_{y_i})(乘积)

上式中 j 表示类别总数,上述公式再进一步限制, ||W_{y_{i}}||=1,偏置 b_{y_i}=0 (这是一个很重的点哦)。 那么上式又变为:

L_{总}=\frac{1}{N}\sum_{i}L_{i}

=\frac{1}{N}\sum_{i}-\log(\frac{e^{W_{y_i}{X_i}(卷积)}}{\sum_je^{W_{j}X_i(卷积)}})

=\frac{1}{N}\sum_{i}-\log(\frac{e^{||W_{y_i}||||x_i||cos(\theta_{y_i})(乘积)}}{\sum_je^{||W_{j}||||x_i||cos(\theta_{j})(乘积)}})

=\frac{1}{N}\sum_{i}-\log(\frac{e^{||x_i||cos(\theta_{y_i})(乘积)}}{\sum_je^{||x_i||cos(\theta_{j})(乘积)}})

上述公式更直白的解释为:二分类, p_1 p_2 进行分类,决策界面是 p_1=p_2 ,上面 ||W|| 归一化,且偏置 b 为 0,那么上述就为:

(W_1-W_2)x+b_1-b_2=cos(\theta_1)-cos(\theta_2)=0

那么我们可以得出:一个输入特征 x_i 属于 y_i 类,那么该 \theta y_i 的角度应该比所有的其他的类都要小(因为 cos(\theta) 是减函数)。

原始的 Softmax ,其中的 x 是类别中学习的特征, \theta 表示 xW_i角度。小结一下:原始 Softmax 的目的使得 W_1x>W_2x ,即 ∥W1∥∥x∥cos(θ1)>∥W2∥∥x∥cos(θ2) ,从而得到 x 正确的分类结果。如果我们使用 cos(m\theta_1)>cos(\theta_2) 时,才判为类别1,这样我们可以看出决策函数更严格,因为这边的 \theta_1<\frac{\theta_2}{m} 才会判定类别1;同理, cos(\theta_1)<cos(m\theta_2) 判断为类别2,也就是 \theta_2<\frac{\theta_1}{m} ,判断为类别2。很抽象,我一开始看的时候也很抽象,所以我们来个直观的解释,超球体解释:

上面的是二维平面,下面是三维超球体解释图。

A-Softmax 使 ||W_i||=0,{bias}_i=0 ,所以依靠的是样本 xW角度,这个角度越小就越有可能是这一类,而添加一个 m 的目的:使类间的距离足够大,使类内距离足够小。也就是放大了类间的距离,也因放大了不同类之间的间隔而使类内更聚拢。

但是,原来的 Softmax 里面的 \theta_{i,j}\in (0,\pi) ,如今 m\theta_{i,j}\in (0,m\pi) 超出了向量之间的夹角函数 cos 定义域范围 (0,\pi) 咋办?把 ncos 堆叠起来变成一个递减的连续的函数,详细见论文!

5、L-Softmax Loss

L-Softmax 来自于 ICML2016 的一篇论文: L-SoftmaxA-Softmax 的区别在于 ||W_i|| 没有归一化,偏置不必归0。 L-SoftmaxA-Softmax 的过程类似,我简单再介绍一下:

L_{总}=\frac{1}{N}\sum_{i}L_{i}

=\frac{1}{N}\sum_{i}-\log(\frac{e^{W_{y_i}{X_i}(卷积)}}{\sum_je^{W_{j}X_i(卷积)}})

=\frac{1}{N}\sum_{i}-\log(\frac{e^{||W_{y_i}||||x_i||cos(\theta_{y_i})(乘积)}}{\sum_je^{||W_{j}||||x_i||cos(\theta_{j})(乘积)}})

=\frac{1}{N}\sum_{i}-\log(\frac{e^{||x_i||cos(\theta_{y_i})(乘积)}}{\sum_je^{||x_i||cos(\theta_{j})(乘积)}})

上述公式更直白的解释为:二分类, x 属于类别1,我们就希望 W_1x>W_2x 。我们把它转成点积,得:

||W_1||||x||cos(\theta_1)>||W_2||||x||cos(\theta_2)

那么 L-Softmax 将上面表达式修改为:

||W_1||||x||cos(m\theta_1)>||W_2||||x||cos(\theta_2)

其中 0<\theta_1<\frac{\pi}{m}m 值越大则学习的难度也越大。因此通过这种方式定义损失会逼得模型学到类间距离更大的,类内距离更小的特征。

6、CosFace Loss

来自于 2018 论文: <CosFace: Large \ Margin \ Cosine \ Loss \ for \ Deep \ Face \ Recognition> LMCL 从余弦的角度思考 Softmax \ Loss

L_{总}=\frac{1}{N}\sum_{i}L_{i}=\frac{1}{N}\sum_{i}-\log(p_i)=\frac{1}{N}\sum_{i}-\log(\frac{e^{f_{y_i}}}{\sum_je^{f_j}})

其中 f_j=W_jx=||W_j||||x||*cos(\theta_j) ,其中余弦代表特征向量与权重向量的角度余弦值

人脸识别是根据两个特征向量之间的余弦相似度计算的。这表明,特征向量 x 的范数是对评分功能没有贡献,于是,通过 L2 归一化范式将 ||W_j|| 设定为1,将 ||x_j|| 设定为 s ,于是 Loss 公式变成了如下:

L_{总}=\frac{1}{N}\sum_{i}L_{i}=\frac{1}{N}\sum_{i}-\log(\frac{e^{{scos(\theta_{y_i},i)}}}{\sum_je^{scos(\theta_{j},i)}})

接下来,作者把余弦边缘项 m 加上去,与 A-Softmax 不同的是:此时的 m 不是乘积项,而是减法。

L_{总}=\frac{1}{N}\sum_{i}L_{i}=\frac{1}{N}\sum_{i}-\log(\frac{e^{{s(cos(\theta_{y_i},i)-m)}}}{{e^{s(cos(\theta_{j},i)-m)}}+{\sum_{j\neq y_i}e^{s(cos(\theta_{j},i)-m)}}})

同时满足:

W=\frac{W}{||W||}

s=x=\frac{x}{||x||}

W_jx_i=11cos(\theta_j,i)=cos(\theta_j,i)

所以,其特征会分布在一个超球面上。下图为二维和高维示意图:

7、AM-Softmax

这一部分主要参考下面链接,大牛写的特棒!blog.csdn.net/fire_ligh。 该损失函数来自于 2018 论文: <Additive \ Margin \ Softmax \ for \ Face \ Verification>

个人感觉 AM-SoftmaxCos-Face 撞车了,不管啦,那就解读一下上个没解释的一些问题。 首先再回顾一下 SoftmaxA-Softmax :

L_{总}=\frac{1}{N}\sum_{i}L_{i}

=\frac{1}{N}\sum_{i}-\log(\frac{e^{W_{y_i}{X_i}(卷积)}}{\sum_je^{W_{j}X_i(卷积)}})

=\frac{1}{N}\sum_{i}-\log(\frac{e^{||W_{y_i}||||x_i||cos(\theta_{y_i})(乘积)}}{\sum_je^{||W_{j}||||x_i||cos(\theta_{j})(乘积)}})

A-Softmax :

L_{总}=\frac{1}{N}\sum_{i}L_{i}

=\frac{1}{N}\sum_{i}-\log(\frac{e^{W_{y_i}{X_i}(卷积)}}{\sum_je^{W_{j}X_i(卷积)}})

=\frac{1}{N}\sum_{i}-\log(\frac{e^{||W_{y_i}||||x_i||cos(\theta_{y_i})(乘积)}}{\sum_je^{||W_{j}||||x_i||cos(\theta_{j})(乘积)}})

=\frac{1}{N}\sum_{i}-\log(\frac{e^{||x_i||cos(\theta_{y_i})(乘积)}}{\sum_je^{||x_i||cos(\theta_{j})(乘积)}})

=\frac{1}{N}\sum_{i}-\log(\frac{e^{||x_i||cos(\theta_{y_i})(乘积)}}{e^{||x_i||cos(\theta_{y_i})(乘积)}+\sum_{j\neq y_i}e^{||x_i||cos(\theta_{j})(乘积)}})

上式中的 cos(\theta_{y_i}) 可以替换成 (-1)^Ncos(m\theta_{y_i})-2N 。理由上面说明了哈! 然后 AM-Softmax cos-Face 出场了,把上面的 cos(\theta) 变成 cos(\theta)-m 。所以式子就变成了:

L_{总}=\frac{1}{N}\sum_{i}L_{i}=\frac{1}{N}\sum_{i}-\log(\frac{e^{{s(cos(\theta_{y_i},i)-m)}}}{{e^{s(cos(\theta_{j},i)-m)}}+{\sum_{j\neq y_i}e^{s(cos(\theta_{j},i)-m)}}})

同时满足:

W=\frac{W}{||W||}

s=x=\frac{x}{||x||}

W_jx_i=11*cos(\theta_j,i)=cos(\theta_j,i)

好处:在于 A-Softmax 的倍角计算是要通过倍角公式,反向传播时不方便求导,而只减m反向传播时导数不用变化。作者认为, A-softmax 是用 m 乘以 θ ,而 AM-Softmax 是用 cosθ 减去 m ,这是两者的最大不同之处:一个是角度距离,一个是余弦距离。使用传统的Softmax的时候,角度距离和余弦距离是等价的,即:

cos(\theta_1)=cos(\theta_2)-->\theta_1=\theta_2

但是当我们试图要推动决策边界的时候,角度距离和余弦距离就有所不同了。最终的决策边界是和余弦相关的,根据cos的性质,优化角度距离比优化余弦距离更有效果,因为余弦距离相对更密集。之所以选择 cosθ-m ,而不是 cos(θ-m) ,这是因为我们从网络中得到的是权重 W 和特征 x 的内积,如果要优化 cos(θ-m) 那么会涉及到 arccos 操作,计算量过大。论文里写的真棒!

8、ArcFace/Insight Face

来自于2018年论文: <ArcFace: \ Additive \ Angular \ Margin \ Loss \ for \ Deep \ Face \ Recognition>

也叫 Insight \ Face 。这个和 AM-Softmax 类似,前者是余弦角度,这边是变成角度问题。这么做的原因:角度距离比余弦距离在对角度的影响更加直接。 在二分类情况下,对于类别1, ArcFace 的边界决策函数为:

9、小结一下

决策界面:

10、参考链接

发布于 2019-04-17