softmax是最常见的人脸识别函数,其原理是去掉最后的分类层,作为解特征网络导出特征向量用于人脸识别。softmax训练的时候收敛得很快,但是精确度一般达到0.9左右就不会再上升了,一方面是作为分类网络,softmax不能像metric learning一样显式的优化类间和类内距离,所以性能不会特别好,另外,人脸识别的关键在于得到泛化能力强的feature,与分类能力并不是完全等价的。
公式中N是batch size的大小,n是类别数目。如果训练进行了停滞,可以采用挑选hard sample(即那些预测错误但是预测值较高的样本,也就是比较难分类的样本)的办法进行帮助训练。具体的可以了解OHEM(Online hard example mining)技术, 比如说Focal loss一类的。
Triplet loss属于Metric Learning, 相比起softmax, 它可以方便地训练大规模数据集,不受显存的限制。缺点是过于关注局部,导致难以训练且收敛时间长
这里提一下Metric Learning的概念,它是根据不同的任务来自主学习出针对某个特定任务的度量距离函数。通过计算两张图片之间的相似度,使得输入图片被归入到相似度大的图片类别中去。通常的目标是使同类样本之间的距离尽可能缩小,不同类样本之间的距离尽可能放大。
首先我们看一张图:
可以看到,在separable features中,类内距离有的时候甚至是比内间距离要大的,这也是上问题到softmax效果不好的原因之一,它具备分类能力但是不具备metric learning的特性,没法压缩同一类别。在这个基础上,center loss被提出来,用于压缩同一类别。center loss的核心是,为每一个类别提供一个类别中心,最小化每个样本与该中心的距离:
左边是softmax, 右边则是约束各个样本到样本中心的距离。
原始的Softmax的目的是使得>,即 ,在这个基础上,L-softmax( Large-margin softmax) 希望可以通过增加一个正整数变量m,使得产生的决策边界可以更加严格地约束上述不等式,让类内的间距更加的紧凑,类间的间距更加具有区分性
L-Softmax的公式:
cos函数在(0,π)内是单调递减的,乘上正整数m后内积会减小,这样可以加大类间的差别,如图所示:
由于L-softmax有一个更加难的实现目标,所以说它更能避免过拟合。同时L-softmax不仅在分类问题上有优势,同样在识别问题上也有优势,因为它使得类内的距离更加的紧凑。 通过控制m的大小,调整类间距离。m越大,类间距离就越大,类内更加紧凑。
不同m带来的分类效果
SphereFace是在softmax的基础上将权重归一化,即使得 。它与前面提到的L-sofrmax最大的区别在于SphereFace将W权重归一化了。L-Softmax会同时从角度和权重长度上区分不同类别,而SphereFace只从角度上去区分不同类别,在数据集大小固定的条件下,L-softmax的精确度可能不如sphereFace。
在最近读的一篇论文The Devil of Face Recognition is in the Noise中,商汤认为A-Softmax使用在clean dataset的效果比之前描述的各种loss要好,但是在噪声极大的数据分布中,表现甚至不如Center Loss和Softmax。有关人脸数据集噪声的问题,可以参考之前写的博文:人脸识别常用数据集介绍(附下载链接)
CosFace的思想和SphereFace( A-softmax)的思想接近,其中主要做了以下三点的改进:
loss的形式做了稍微的改变,将超参数m由乘法运算变成了减法运算
不仅对权重进行了正则化,还对特征进行了正则化
再乘上一个scale参数,超球面过小时,分类映射到超球面上不好分类,这个scale参数可以扩大超球面体积,帮助分类
如下图所示,A-softmax存在一个问题,它的决策边界会随着 的变化而变化,当 为0的时候,margin=0, 而CosFace(即LMCL)克服了这个缺点,两个类别之间有一个明确的决策边界(margin>0), 相对来说有更好的鲁棒性
各大损失函数的决策边界
这里插播一下决策边界( Decision Boundaries)的概念,它表示的是在需要分类的数据中,如何区分不同类别的边界。
那么这么决策边界怎么计算呢,以二分类为例做一个简单说明。对于二分类而言,分类边界就是样本属于两个类别的概率相等。以softmax来距离,假设某个样属于类别1的概率是 中log函数的输入,那么属于类别2的概率只是将log函数输入的分子换成类别2而已,分母是不变的,又因为以e为底的指数函数又是递增函数,所以直接让两个类别的指数相等就能得到softmax的分类边界函数:
Arcface的思想和CosFace类似,主要区别是将m放入了cos中,角度距离比余弦距离对角度的影响更加直接:
论文中提供了大量对照实验:
想要研究softmax和triplet loss,可以参照google facenet的开源实现:davidsandberg/facenet(https://github.com/davidsandberg/facenet)
想要研究各种ArcFace、CosineFace等,可以参照deepinsight洞见实验室的开源代码:deepinsight/insightface(https://github.com/deepinsight/insightface)
从在数据集表现上来说,ArcFace优于其他几种loss, 著名的megaface赛事,在很长一段时间都停留在91%左右,在洞见实验室使用ArcFace提交后,准确率哗哗就提到了98%,之后再刷的团队也大同小异,多使用ArcFace, CosineFace等损失函数。
这两个开源算法我也都跑过,粗略地比较了一下,可以见insightface和facenet效果+性能比较(https://zhuanlan.zhihu.com/p/52560499)
最后吐槽一句,写这篇文章的时候发现不少技术博客文章的公式都错了,然后以讹传讹很多都是错的,我自己写的时候就算对着论文有些地方没注意也打错了,所以大家要对着公式实现的时候尽量回去看论文,第二手来源信息肯定没有一手信息可靠~
人脸识别Loss对比:L-Softmax, SphereFace, CosFace, ArcFace
ArcFace算法笔记 - AI之路 - CSDN博客
人脸识别论文再回顾之一:Center Loss
ArcFace: Additive Angular Margin Loss for Deep Face Recognition
@知乎:Slumbers
版权声明
本文版权归《Slumbers》,转载请自行联系。
历史文章推荐:
如何学会看arxiv.org才能不错过自己研究领域的最新论文?
你正在看吗?👇