在原始的CNN模型中,使用的是Softmax损失。Softmax是类别间的损失,对于人脸来说,每一类就是一个人。尽管使用Softmax损失可以区别出每个人,但其本质上没有对每一类的向量表示之间的距离做出要求。
举个例子,使用CNN对MNIST进行分类,设计一个特殊的卷积网络,让其最后一层的向量变为2维,此时可以画出每一类对应的2维向量(图中一种颜色对应一种类别),如下图所示:
上图是我们直接使用softmax训练得到的结果,它就不符合我们希望特征具有的特点:
(1)我们希望同一类对应的向量表示尽可能接近。但这里同一类(如紫色),可能具有很大的类间距离;
(2)我们希望不同类对应的向量应该尽可能远。但在图中靠中心的位置,各个类别的距离都很近;
对于人脸图像同样会出现类似的情况,对此,有很改进方法。这里介绍其中两种:一种是三元组损失函数(Triplet Loss),一种是中心损失函数。
三、三元组损失的定义三元组损失函数的原理:既然目标是特征之间的距离应该具备某些性质,那么我们就围绕这个距离来设计损失。具体的,我们每次都在训练数据中抽出三张人脸图像,第一张图像记为$x_{i}^{a}$,第二张图像记为$x_{i}^{p}$,第三张图像记为$x_{i}^{n}$。在这样的一个“三元组”中,$x_{i}^{a}$和$x_{i}^{p}$对应的是同一个人的图像,而$x_{i}^{n}$是另外一个不同的人的人脸图像。因此,距离$\left \| f(x_{i}^{a})-f(x_{i}^{p}) \right \|_{2}$应该较小,而距离$\left \| f(x_{i}^{a})-f(x_{i}^{n}) \right \|_{2}$应该较大。严格来说,三元组损失要求下面的式子成立:
$\left \| f(x_{i}^{a})- f(x_{i}^{p})\right \|_{2}^{2}+\alpha <\left \| f(x_{i}^{a})- f(x_{i}^{p})\right \|_{2}^{2}$
即相同人脸间的距离平方至少要比不同人脸间的距离平方小α(取平方主要是为了方便求导),据此,设计损失函数为:
$\left [ \left \| f(x_{i}^{a})-f(x_{i}^{p}) \right \|_{2}^{2}+\alpha -\left \| f(x_{i}^{a})-f(x_{i}^{n}) \right \|_{2}^{2} \right ]_{+}$
这样的话,当三元组的距离满足 $\left \| f(x_{i}^{a})- f(x_{i}^{p})\right \|_{2}^{2}+\alpha <\left \| f(x_{i}^{a})- f(x_{i}^{p})\right \|_{2}^{2}$时,不产生任何损失,此时$L_{i}=0$。当距离不满足上述等式时,就会有值为$\left \| f(x_{i}^{a})-f(x_{i}^{p}) \right \|_{2}^{2}+\alpha -\left \| f(x_{i}^{a})-f(x_{i}^{n}) \right \|_{2}^{2}$的损失。此外,在训练时会固定$\left \| f(x) \right \|_{2}=1$,以保证特征不会无限地“远离”。
三元组损失直接对距离进行优化,因此可以解决人脸的特征表示问题。但是在训练过程中,三元组的选择非常地有技巧性。如果每次都是随机选择三元组,虽然模型可以正确的收敛,但是并不能达到最好的性能。如果加入"难例挖掘",即每次都选择最难分辨率的三元组进行训练,模型又往往不能正确的收敛。对此,又提出每次都选择那些"半难"(Semi-hard)的数据进行训练,让模型在可以收敛的同时也保持良好的性能。此外,使用三元组损失训练人脸模型通常还需要非常大的人脸数据集,才能取得较好的效果。
四、中心损失的定义与三元组损失不同,中心损失(Center Loss)不直接对距离进行优化,它保留了原有的分类模型,但又为每个类(在人脸模型中,一个类就对应一个人)指定了一个类别中心。同一类的图像对应的特征都应该尽量靠近自己的类别中心,不同类的类别中心尽量远离。与三元组损失函数相比,使用中心损失训练人脸模型不需要使用特别的采样方法,而且利用较少的图像就可以达到与单元组损失相似的效果。下面我们一起来学习中心损失的定义:
还是设输入的人脸图像为$x_{i}$,该人脸对应的类别为$y_{i}$,对每个类别都规定一个类别中心,记作$c_{yi}$。希望每个人脸图像对应的特征$f(x_{i})$都尽可能接近其中心$c_{yi}$。因此定义中心损失为:
$L_{i}=\frac{1}{2}\left \| f(x_{i})-c_{yi}\right \|_{2}^{2}$
多张图像的中心损失就是将它们的值加在一起:
$L_{center}=\sum\limits_{i}L_i$