最近看了点人脸识别算法,发现ArcFace,CosFace,SphereFace的损失函数(Loss Function)设计得非常有意思,且设计理念都是相似的,因此今天就记一篇损失函数的设计。
ArcFace,出自英国帝国理工。文章全名是:ArcFace: Additive Angular Margin Loss for Deep Face Recognition。
这篇文章有公开源代码,B站有作者对论文的讲解,很仔细,网上甚至能搜到翻译好的论文,大家都可以去看。
CosFace,出自腾讯,文章全名是:CosFace: Large Margin Cosine Loss for Deep Face Recognition。
SphereFace,出自美国和中国的三所大学,文章全名是:SphereFace: Deep Hypersphere Embedding for Face Recognition。
文章先介绍Softmax,再介绍Softmax Loss,最后介绍ArcFace,嫌啰嗦可以直接看第三部分。
1. Softmax
ArcFace, CosFace, SphereFace的损失函数都是从Softmax-Loss演化来的,而Softmax-Loss是由Softmax和交叉熵(cross-entropy loss)而来。先看Softmax,这个概念参考[1]解释的非常仔细,这里只做简述,先上公式:
这公式是啥子意思呢?先看一个应用:
假如我们现在有一个分类任务,如果模型足够理想,输入一张猫图,输出[1, 0],输入一张狗图,输出[0, 1]。通常这种任务,前面会是一个深度卷积神经网络,最后会有一个全连接层,经过这个全连接层会得到图的特征向量(embedding),我自己喜欢管embedding叫特征向量。上图中最后得到的特征向量是[1.2, 0.3],再经过softmax:
得到了[0.71, 0.29],我们可以这样理解最后这个结果,这张图是猫的概率是0.71,是狗的概率是0.29,它们两加起来是1,不管softmax的输入向量为何,输出向量里的值相加一定是1,得到的结果可以理解为图在各个类上的概率分布,向量的长度即类别(class)的数量。Softmax主要用在多分类任务上。
2. Softmax Loss 和 Cross Entropy Loss
交叉熵度量的是两个概率分布的差异。
要理解交叉熵,有很多概念需要理解,一个一个来。
信息量,一个事件发生的概率越大,携带的信息量越小,发生的概率越小,这个事件携带的信息量越大。比如太阳从东边升起,这个事件如果发生了,我们可以从这个事件中获得的信息是几乎没有的。但是,如果哪天太阳从西边升起了,那么我们从这个事件中获得的信息量是极大的,一定发生了什么,或者即将发生什么,才造成了这个事件发生。
假设X是一个离散型随机变量,概率分布函数为:
则定义X = x0的事件为:
若p(x0)为0,也就是事件x0是不可能发生的事件,但是它却发生了,那么这个事件的信息量是无穷大的,I(x0)的值是无穷大的,如果p(x0)为1,也就是事件x0是一定会发生的事件,那么这个事件的发生是不带信息量的,I(x0)的值是0。
信息熵,则是信息量的期望值:
事件的概率不均,信息熵较小,若各个事件发生的概率一样,信息熵较大。
相对熵(relative entropy),又称之为KL散度(Kullback-Leibler (KL) divergence),公式:
相对熵的目标是:计算用P描述目标问题,比Q描述目标问题能获得的信息增量。
如果分布P和分布Q是一样的,那么相对熵是0,如果不一样,相对熵大于0,越大,表示两种分布之间的差距越大。
在机器学习的项目中,通常P表示真实的分布,即需要训练模型达到的分布,Q是现在的模型预测的分布。
交叉熵(Cross entropy),将相对熵公式变形:
前半部分是信息熵的负值,后半部分则是交叉熵,所以交叉熵的公式是:
因为P的信息熵是一定的,那么其实是可以省略这部分计算的,交叉熵和相对熵的意义是一样的。只是最后计算出的值,区间不一样。
Cross-Entropy Loss 和 Softmax Loss
毫无疑问,交叉熵可以用作损失函数,且比起MSE,MAE,要优秀不少,
… using the cross-entropy error function instead of the sum-of-squares for a classification problem leads to faster training as well as improved generalization. — Page 235, Pattern Recognition and Machine Learning, 2006.
结合上面猫狗分类的案例,假如有一张猫图输入,P是[1, 0], Q是[0.71, 0.29],交叉熵的计算为:
H(P, Q) = – (P(cat) * log(Q(cat)) + P(dog) * log(Q(dog)))
值得注意的是,在很多多分类问题中,不论有多少类,P不论有多少个元素,都只有一个为1,其他都为0,所以交叉熵的计算可以化简为,也就是说如果P(cat)为1,那么交叉熵的结果和Q(dog),Q(car),Q(any other)是无关的:
H(P, Q) = – log(Q(cat))
因此,如果Q(cat)是用Softmax Function计算出来的,那么H(P, Q)计算得到的就是该样本在该模型下的Softmax Loss。
Softmax Loss的完整公式如下:
N是样本数量,n是class的数量,特征向量的长度为d,Wj是W的第j列,和b一起是获得特征向量的全连接层,W是d*n的矩阵,bj的长度是n。log后面则是用Softmax Function计算出的‘Q(cat)’。
因此,其实本来没有什么Softmax Loss的概念,这个公式是在多分类任务中使用Softmax Function+Cross Entropy loss产生的。
3. SphereFace, CosFace和ArcFace
以上都是前情提要,因为SphereFace, CosFace和ArcFace的损失函数都是由Softmax Loss而来。
首先,令:
再做如下转换:
令:
再令||xi||的值为s,则之前的Softmax Loss可转换为如下表达:
这样转换,其实还是Softmax Loss只是换了个写法,接下来看本文介绍的三个方法分别是怎么定义的损失函数:
SphereFace:
CosFace:
ArcFace:
将上面三个公式融合一下还可以得到一个新的损失函数:
接下来看为什么做上述这些变化,是有意义的。其实这样变换的思路并不新奇,逻辑回归->SVM,Triplet-Loss的设计都用的是这样的设计理念。
即:
类内聚敛(Intra-class compactness)
类间分离(Inter-class discrepancy)
用大白话说一下就是,训练的时候我们就告诉模型,啊,这两个类呢,你得给我们分出来,而且呢,还得按一定距离分出来,再白话一点就是,不但要分出来,还得分得够开。那么怎么能够让模型把两个类分得够开呢?这里我们简单说一下Triplet Loss,这个损失函数常用于人脸识别。
比方说,你现在有以下一个任务:训练一个模型,认出吴恩达老师。因为人脸的类别多,每个类的数据不多,你采用Pairwise的训练方式,用的损失函数是Triplet Loss,即每组样本有三张图,分别是Anchor Image,Positive Image, 和Negative Image。
<div align=center></div>
长成Anchor Image这样的就是吴恩达老师,现在又分别有一张Positive Image,Negative Image,通过训练,希望模型可以缩小Anchor和Positive的距离,增大Anchor和Negative的距离,用更直观的图表现如下:
而训练的时候计算Triplet Loss如下:
上面公式分三部分,第一部分是Anchor和Positve的距离,第二部分是Anchor和Negative的距离,我们希望模型计算出的第一个距离小于第二个距离,但不是小就行了,还得小到一定量才行,公式中的第三部分的偏置值则告诉模型,要小多少,loss才能为零或者小于零。
这个理念搁在角向量里,则可以表达为:
即,Anchor的特征向量和Positve的特征向量的夹角得小于Anchor和Negative的夹角,而且得小m那么大。
假如是一个八分类的问题,a图是Softmax Loss的训练目标,而b图是ArcFace的训练目标,两个之间的不同不言而喻。
也就是说,我们不仅希望模型在角向量里可以将不同类区别开来,还可以按一定距离区别开来。SphereFace和CosFace设计理念也是一样的,至于它们三个的区别,看下图:
很多方法的设计理念是一致的,但变化是无穷的,精益求精。
就好像钢琴就那么一排键盘,却能弹出数不尽的曲子,而且,总会有更令人心动的曲子出现。
喜欢的话,关注,分享,点赞,点在看,赞赏吧。
除了文中的列出的三篇论文,还参考了:
[1] Thomas Wood,Softmax Function Definition, DeepAI
[2] Jason Brownlee,A Gentle Introduction to Cross-Entropy for Machine Learning,2019
[3] 史丹利复合田,一文搞懂交叉熵在机器学习中的使用,透彻理解交叉熵背后的直觉,CSDN,2018
[4] Daniel Godoy, Understanding binary cross-entropy / log loss: a visual explanation, Towards Data Science, 2018
[5] Softmax, Chaos-gravity, 2020
[6] Cross Entropy Loss, Chaos-gravity, 2020
[7] Susmith Reddy, Intuition of Triplet Loss, 2019
Comments