本文来自《A Discriminative Feature Learning Approach for Deep Face Recognition》,时间线为2016年。采用的loss是Center loss。网络
一般使用CNN进行特征学习和标签预测的架构,都是将输入数据映射到深度特征(最后一层隐藏层的输出),而后到预测的标签,如图1.
架构
而对于人脸识别任务来讲,学到的深度特征不止具备可分性,也具备辨识性。由于不可能在训练集中收集到全部预测的ID类别,CNN输出的特征并不老是可用的。须要让训练出来的特征具备辨识性,且可以足够泛化到那些未见过的人ID的类别。辨识性即须要特征可以保证类内变化的紧凑性和类间不一样的可分性。如图1所示,辨识性特征能够很容易的经过KNN去划分。然而,softmax loss只保证了特征的可分性,生成的特征还不足够用于人脸识别。函数
在CNN中,构建让特征具备高度辩识性的loss函数是颇有意义的。在CNN中的SGD一般是基于mini-batch,其不能很好的反映深度特征的全局分布。由于训练集自己很大,也无法每次迭代的时候把整个训练集都放进去迭代。做为一种解决方法,contrastive loss和triplet loss各自构建了基于图片二元组和图片三元组构建loss函数。然而相比于图片样本,须要投入的训练图片二元组和三元组的数量会急剧增加,同时也不可避免的会减慢收敛和增大不稳定性。经过仔细的选择图片二元组和三元组,虽然这些问题能够部分解决。不过也明显增长了计算复杂度,且也让训练过程变得不够方便。性能
这里做者提出了一个新的loss函数,叫center loss,能够有效的加强深度特征的辨识性。特别的,对每一个类别的深度特征,会学到一个中心(和特征有着同样维度的一个向量)。在训练中,会同时更新该中心,且最小化深度特征与对应中心向量的距离。因此该CNN是基于softmax loss和center loss联合训练的,经过一个超参数去权衡这两个loss。直观的,softmax loss强制不一样类别的深度特征保持分离。center loss有效的将同一个类别的其余特征往其对应的中心紧推。经过联合训练,不止让类间特征的区别变大,同时让类内特征的变化减少。所以让学到的深度特征辨识性能够加强。学习
这里先经过一个例子介绍下深度特征的分布,而后基于该分布提出了center loss来提高深度特征的辨识性。测试
本部分是基于MNIST数据集进行呈现的。经过将LeNet网络修改的更深更宽,不过减小最后一层隐藏层的神经元个数为2(即学到的深度特征维度为2)。因此能够直接在2D坐标系上呈现学到的特征。网络结构的详细部分如表1。
大数据
- 基于softmax loss的监督之下,学到的深度特征具备可分性;
- 深度特征不具备足够的判别性,由于仍然有明显的类内变化
因此还不能直接将softmax学到的特征直接用在人脸识别上。spa
因此,如何提出一个有效的loss函数去提高深度特征的辨识性呢?直观的,是减少类内变化的同时保持不一样类特征的可分性。因此,这里提出一个center loss函数:
\[L_C=\frac{1}{2}\sum_{i=1}^m||\mathbf{x}_i-\mathbf{c}_{y_i}||_2^2\]
其中\(\mathbf{c}_{y_i}\in R^d\)表示深度特征的第\(y_i\)个类中心。该式子能够有效的表达类内变化。理想状况下,\(\mathbf{c}_{y_i}\)能够随着深度特征的改变而更新。换句话说,须要将整个训练集都考虑在内,并在每次迭代中对每一个类别的特征进行平均,这在实际实践中不具备可操做性。所以,center loss不能直接使用,这也可能就是在CNN中center loss一直没有应用的一个缘由吧。
为了解决该问题,提出两个必须的修改:3d
- 不直接基于整个训练集合更新center,而是基于mini-batch进行操做。在每次迭代中,经过平均对应的类别特征来计算center(这时候,一些center可能并不会被更新);
- 为了不误标记样本带来的较大扰动,使用一个标量\(\alpha\)来控制center的学习率。
\(L_C\)关于\(\mathbf{x}_i\)的梯度和更新\(c_{y_i}\)的式子以下:
\[\frac{\partial L_C}{\partial \mathbf{x}_i}=\mathbf{x}_i-\mathbf{c}_{y_i}\]
\[\Delta \mathbf{c}_j=\frac{\sum_{i=1}^m\delta(y_i=j)\cdot (\mathbf{c}_j-\mathbf{x}_i)}{1+\sum_{i=1}^m\delta (y_i=j)}\]
当\(condition\)知足的时候\(\delta (condition)=1\),反之\(\delta (condition)=0\),\(\alpha\)取值在[0,1]之间。经过将softmax loss和center loss 联合训练CNN以保证辨识性特征学习,对应的式子为:
\[ \begin{align} L&= L_S+\lambda L_C \\ & = -\sum_{i=1}^m\log\frac{e^{\left ( W_{y_i}^T \, \mathbf{x}_i+b_{y_i}\right )}}{\sum_{j=1}^n e^{\left ( W_j^T\, \mathbf{x}_j+b_j\right )}}+\frac{\lambda}{2}\sum_{i=1}^m||\mathbf{x}_i-\mathbf{c}_{y_i}||_2^2 \end{align} \]
能够看到,由center loss监督的CNN是可训练的,能够经过标准SGD进行迭代,标量\(\lambda\)能够用来权衡这两个loss函数。传统的softmax loss能够当作该联合loss的一个特殊状况,即\(\lambda =0\)。
blog
- 若是只是用softmax loss,则会致使较大的类内变化;若是只用center loss,则深度特征和center就会降低为0(此时center loss是很小的);
- 相比于contrastive loss和triplet loss,它们都须要对数据进行扩展成二元组或者三元组,而center loss不须要对训练样本进行组合操做,于是CNN网络可以更直接的训练。
这里介绍下实现的一些细节和个别超参数的影响对比。
- 基于MTCNN先对人脸数据集进行人脸检测和对齐,人脸检测框统一裁剪成112x96大小,而后经过每一个像素值减去127.5并处以128进行大体的归一化。
- 使用网络上收集了的数据集如CASIA-WebFace,CACD2000,Celebrity+,在移除了出如今测试集中的ID图片,大概有0.7百万张,17,189个ID。而且作了简单的水平翻转以数据加强。
- 采用caffe库进行实现,网络结构如图
为了公平对比,只在loss函数层作了不一样的设定,如softmax loss(model A);softmax+contrastive(model B);softmax+center(model C)。这些模型的batchsize都为256,在两块TitianX上完成。对于模型A和模型C,学习率始于0.1,而后在16K和24K迭代次数时分别除以10。大体须要28K次迭代14小时完成整个训练。对于模型B,发现收敛的更慢,其以0.1初始化学习率,而后在24K和36K进行变化。一共42K次迭代,大体22小时。- 将第一层全链接层的输出做为深度特征,经过提取每一个图片的该特征并对图片进行左右翻转并再次提取特征,将这2个特征进行合并以此来表示该图片。先经过PCA进行降维,而后采用cos距离来计算两个特征的距离。最近邻和阈值对比分别用来做为人脸识别和验证。
超参数\(\lambda\)控制着类内变化,\(\alpha\)控制着模型C中center c的学习率。他们对网络的训练都很重要。