人脸识别任务可以分为识别和核实两种。其中识别任务可以看作是一种分类任务,输入图片,输出人物身份类别;核实任务则是输入两张图片,输出判断这两人是否为同一个人。一方面,由于现实应用中更多的面对的是一个开集数据,也就是说应用中遇到的图片可能不是之前遇到的任何一个人;另一方面,可以通过对输入的测试图片与已知人物身份的图片进行核实来判断输入图片的身份。因此,当前的人脸识别研究更多的关注于核实任务。人脸核实任务通常通过将图片表示为一个向量(embedding),然后比较这两个向量的距离来判断两张图片是否是通过一个人。随着深度学习的兴起,人脸图片的向量表示通常通过神经网络学习得到。如此以来,模型性能的提升通常通过三个方面的改进来实现:训练数据及其预处理、网络结构设计以及损失函数设计。本文主要介绍近年来人脸识别方法再损失函数设计方面的发展。
人脸识别模型训练的损失函数主要分为基于分类的损失函数和基于triplet loss的损失函数两大类。其中基于分类的损失函数又因为是否对embedding或分类权重(W)做归一化以及是否增加额外的间隔(margin)等产生了多种变体;triplet loss则分为基于欧氏距离和基于角度距离两种。下面对这些损失及各种变体分别进行介绍。
基本的softmax分类通过将embedding输入一层全连接层以及softmax函数得到分类概率。用 x,W,bx,W,b分别表示网络输出的人脸embedding以及全连接层的权重和偏置。那么经过softmax得到的分类损失可以表示为:
Lsoftmax=−1N∑i=1NlogeWTyixi+byi∑nj=1eWTjxi+bjLsoftmax=−1N∑i=1NlogeWyiTxi+byi∑j=1neWjTxi+bj
其中,NN表示样本数量,nn表示类别总数,yiyi表示样本xixi的真实类别。
由于softmax的分母对embedding在各个类别上的结果进行了求和,因此最小化这一损失一定程度上能够使类间距离变大,类内距离变小。得益于此,使用基本的softmax损失在大规模人脸数据上对神经网络进行训练得到人脸表示(embedding)在人脸核实任务上也能取得较好的效果。
Sphereface Loss在softmax的基础上进一步引入了显式的角度间隔(angular margin),从而训练时能够进一步缩小类内距离,扩大类间距离。首先,将分类全连接层中的偏置bb置为0,那么可以得到下面的等式:
WTjxi=∥WTj∥∥xi∥cosθjWjTxi=‖WjT‖‖xi‖cosθj
其中θjθj表示WTjWjT与xixi的夹角。这样以来损失函数就变成了:
L′softmax=−1N∑i=1Nloge∥WTyi∥∥xi∥cosθyi∑nj=1e∥WTj∥∥xi∥cosθjLsoftmax′=−1N∑i=1Nloge‖WyiT‖‖xi‖cosθyi∑j=1ne‖WjT‖‖xi‖cosθj
进一步地,我们将权重WW归一化,使∥W∥=1‖W‖=1,那么损失函数进一步变为:
L′′softmax=−1N∑i=1Nloge∥xi∥cosθyi∑nj=1e∥xi∥cosθjLsoftmax″=−1N∑i=1Nloge‖xi‖cosθyi∑j=1ne‖xi‖cosθj
如此以来,分类结果仅与embedding地范数∥xi∥‖xi‖和夹角θjθj相关,在此基础上,进一步引入角度间隔(angular margin)mm,就可得到sphereface loss:
Lsphereface=−1N∑i=1Nloge∥xi∥cosmθyie∥xi∥cosmθyi+∑nj=1,j≠yie∥xi∥cosθjLsphereface=−1N∑i=1Nloge‖xi‖cosmθyie‖xi‖cosmθyi+∑j=1,j≠yine‖xi‖cosθj
Cosineface进一步对人脸表示(embedding)xx进行了归一化,从而使分类结果仅取决于WTjWjT与xixi的夹角余弦;并进一步引入了余弦间隔mm,用于扩大类间距离,缩小类内距离。由于余弦的取值范围较小,为了使类别间差别更显著,进一步引入一个超参数ss用于放大余弦值。从而得到Cosineface的损失如下:
Lcosineface=−1N∑i=1Nloges(cosθyi−m)es(cosθyi−m)+∑nj=1,j≠yiescosθjLcosineface=−1N∑i=1Nloges(cosθyi−m)es(cosθyi−m)+∑j=1,j≠yinescosθj
为了使人脸表示(embedding)的学习更符合超球体流形假设,Arcface进一步将Cosineface中的余弦间隔修改为角度间隔,得到如下损失:
Larcface=−1N∑i=1Nloges(cos(θyi+m))es(cos(θyi+m))+∑nj=1,j≠yiescosθjLarcface=−1N∑i=1Nloges(cos(θyi+m))es(cos(θyi+m))+∑j=1,j≠yinescosθj
总之,分类损失利用softmax函数的性质,促使模型学到的人脸表示(embedding)具有较小的类内距离,同时具有较大的类间距离。此类损失的改进大多是在softmax的基础上,引入不同类型的显式角度间隔,优化模型的分类边界,使得优化任务变得更难,限制更强,从而缩小人脸表示的类内距离,扩大类间距离。
上述四种分类损失得分类边界如下表所示:
损失函数分类边界
Softmax(W1−W2)x+b1−b2=0(W1−W2)x+b1−b2=0
SphereFace∥x∥(cosmθ1−cosθ2)=0‖x‖(cosmθ1−cosθ2)=0
CosineFaces(cosθ1−m−cosθ2)=0s(cosθ1−m−cosθ2)=0
ArcFaces(cos(θ1+m)−cosθ2)=0s(cos(θ1+m)−cosθ2)=0
对应的分类边界示意图如下所示:
可以看出,与原始的softmax分类边界相比,改进后的分类损失(SphereFace,CosFace,ArcFace)的分类边界之间具有更大的间隔。
与通过softmax优化使类内距离缩小,类间距离扩大不同,Triplet Loss直接对样本间的距离进行优化,使不同类样本间的距离比同类样本间的距离大出一个间隔。因此,计算Triplet Loss每次需要采样三个样本:anchor、positive 和 negative。其中,anchor 与 positive 样本属于同一类别,与 negative 样本属于不同类别。其公式表示如下:
Ltriplet=−1N∑i=1N(dist(xai,xpi)−dist(xai,xni)+m)Ltriplet=−1N∑i=1N(dist(xia,xip)−dist(xia,xin)+m)
其中,xx代表人脸表示(embedding),上标 a,p,na,p,n 分别表示 anchor,positive 和 negative。dist(x,y)dist(x,y) 表示 x,yx,y 的距离函数,mm 则表示不同类样本间距离比同类样本间距离大出的间隔。这里的距离函数和间隔既可以是欧氏距离也可以是角度距离等形式。
Triplet Loss直接对样本表示间的距离进行优化,在训练数据足够多,模型表示能力足够强的情况下,能够学得很好的结果。不过其缺点是,一方面训练时模型收敛速度较慢,另一方面在构造triplet时需要选择合适的正样本对和负样本对,因此需要设计triplet的构造选择机制,这一过程通常比较复杂。较好的训练方式是先用分类损失训练模型,然后再用 Triplet Loss 对模型进行finetune以进一步提升模型性能。