损失函数:Center Loss

ECCV2016的文章《A Discriminative Feature Learning Approach for Deep Face Recognition》 主要为了进一步区分人脸。

code:https://github.com/ydwen/caffe-face
无法上github的可以在这里下载:https://download.csdn.net/download/duan19920101/12178594
Center Loss的Caffe实现:https://github.com/BOBrown/SSD-Centerloss

        Center Loss是通过将特征和特征中心的距离和softmax loss一同作为损失函数,使得类内距离更小,有点L1,L2正则化的意思。最关键是在训练时要使用2个Loss函数:Softmax Loss + lamda * Center Loss

损失函数:Center Loss_第1张图片

       和metric learning(度量学习)的想法一致,希望同类样本之间紧凑,不同类样本之间分散。现有的CNN最常用的softmax损失函数来训练网络,得到的深度特征通常具有比较强的区分性,也就是比较强的类间判别力。关于softmax的类内判别力,直接看图:

损失函数:Center Loss_第2张图片

      上面给的是mnist的最后一层特征在二维空间的一个分布情况,可以看到类间是可分的,但类内存在的差距还是比较大的,在某种程度上类内间距大于类间的间距。对于像人脸这种复杂分布的数据,我们通常不仅希望数据在特征空间不仅是类间可分,更重要的是类内紧凑(分类任务中类别较多时均存在这个问题)因为同一个人的类内变化很可能会大于类间的变化,只有保持类内紧凑,我们才能对那些类内大变化的样本有一个更加鲁棒的判定结果。也就是学习一种discriminative的特征。

下图就是我们希望达到的一种效果:

损失函数:Center Loss_第3张图片

考虑保持softmax loss的类间判别力,提出center loss,center loss就是为了约束类内紧凑的条件。相比于传统的CNN,仅改变了原有的损失函数,易于训练和优化网络。

下面公式中log函数的输入就是softmax的结果(是概率),而Ls表示的是softmax loss的结果(是损失)。wx+b是全连接层的输出,因此log的输入就表示xi属于类别yi的概率。

损失函数:Center Loss_第4张图片

Center Loss

       先看看center loss的公式LC。cyi表示第yi个类别的特征中心,xi表示全连接层之前的特征。实际使用的时候,m表示mini-batch的大小。因此这个公式就是希望一个batch中的每个样本的feature离feature 的中心的距离的平方和要越小越好,也就是类内距离要越小越好。

关于LC的梯度和cyi的更新公式如下:

损失函数:Center Loss_第5张图片

这个公式里面有个条件表达式如下式,这里当condition满足的时候,下面这个式子等于1,当不满足的时候,下面这个式子等于0。

       因此上面关于cyi的更新的公式中,当yi(表示yi类别)和cj的类别j不一样的时候,cj是不需要更新的,只有当yi和j一样才需要更新。

NNCC:当我们在更新yi类的特征中心cyi时,如果类别yi和该特征中心对应的类别不一样时不更新,即某类别的特征只负责更新它对应的类别中心cyi。

完整的loss function:

       作者文中用的损失L的包含softmax loss和center loss,用参数lamda控制二者的比重,如下式所示。这里的m表示mini-batch的包含的样本数量,n表示类别数。

损失函数:Center Loss_第6张图片

具体的算法实现:

损失函数:Center Loss_第7张图片

数据准备

与基于 Softmax Loss 的分类问题的数据格式一致,即:

img1 label1
img2 label2
img3 label3
...
...
...

其中,label 从 0 开始。

根据数据集 labels 的总数设置 CenterLossLayer 的 num_output。

 

网络训练

类似于分类问题的训练,进行网络训练即可。

 

CNN框架:

损失函数:Center Loss_第8张图片

总结:

        Center Loss损失函数对分类数不多的工程项目并没有明显的改善,如果你的分类任务中分类数大于1000,例如人脸识别,使用它效果会有明显提升。

       Center Loss使得类内距离缩小,类间距离扩大,有效的将各个类别区分开。

       使用了centerloss之后,每个类的样本更加聚合,因此类间的距离也随着增大。随着loss_weight的值越来越大,类间距越来越大。达到了增大类间距,缩小类内距离的效果。

损失函数:Center Loss_第9张图片

损失函数:Center Loss_第10张图片

 

参考文章:
https://blog.csdn.net/yang_502/article/details/72792786
https://blog.csdn.net/u014380165/article/details/76946339
https://blog.csdn.net/sinat_33486980/article/details/101214447
https://blog.csdn.net/u011808673/article/details/81050616

 

你可能感兴趣的:(深度学习与神经网络)