损失函数:Center Loss

的文章《Afor Deep Face 》主要为了进一步区分人脸 。
code:https://github.com/ydwen/caffe-face无法上github的可以在这里下载:https://download.csdn.net/download/duan19920101/12178594Center Loss的Caffe实现:https://github.com/BOBrown/SSD-Centerloss
【损失函数:Center Loss】 Loss是通过将特征和特征中心的距离和 loss一同作为损失函数,使得类内距离更小,有点L1,L2正则化的意思 。最关键是在训练时要使用2个Loss函数: Loss+ lamda*Loss:
和 (度量学习)的想法一致,希望同类样本之间紧凑,不同类样本之间分散 。现有的CNN最常用的损失函数来训练网络,得到的深度特征通常具有比较强的区分性,也就是比较强的类间判别力 。关于的类内判别力,直接看图:
上面给的是mnist的最后一层特征在二维空间的一个分布情况,可以看到类间是可分的,但类内存在的差距还是比较大的,在某种程度上类内间距大于类间的间距 。对于像人脸这种复杂分布的数据,我们通常不仅希望数据在特征空间不仅是类间可分,更重要的是类内紧凑(分类任务中类别较多时均存在这个问题) 。因为同一个人的类内变化很可能会大于类间的变化,只有保持类内紧凑,我们才能对那些类内大变化的样本有一个更加鲁棒的判定结果 。也就是学习一种的特征 。
下图就是我们希望达到的一种效果:
考虑保持 loss的类间判别力,提出 loss,loss就是为了约束类内紧凑的条件 。相比于传统的CNN,仅改变了原有的损失函数,易于训练和优化网络 。
下面公式中log函数的输入就是的结果(是概率),而Ls表示的是 loss的结果(是损失) 。wx+b是全连接层的输出,因此log的输入就表示xi属于类别yi的概率 。
Loss
先看看 loss的公式LC 。cyi表示第yi个类别的特征中心,xi表示全连接层之前的特征 。实际使用的时候,m表示mini-batch的大小 。因此这个公式就是希望一个batch中的每个样本的离 的中心的距离的平方和要越小越好,也就是类内距离要越小越好 。

损失函数:Center Loss

文章插图
关于LC的梯度和cyi的更新公式如下:
这个公式里面有个条件表达式如下式,这里当满足的时候,下面这个式子等于1,当不满足的时候,下面这个式子等于0 。
因此上面关于cyi的更新的公式中,当yi(表示yi类别)和cj的类别j不一样的时候,cj是不需要更新的,只有当yi和j一样才需要更新 。
NNCC:当我们在更新yi类的特征中心cyi时,如果类别yi和该特征中心对应的类别不一样时不更新,即某类别的特征只负责更新它对应的类别中心cyi 。
完整的loss :
作者文中用的损失L的包含 loss和 loss,用参数lamda控制二者的比重,如下式所示 。这里的m表示mini-batch的包含的样本数量,n表示类别数 。
具体的算法实现:
数据准备
与基于Loss 的分类问题的数据格式一致,即:
img1 label1img2 label2img3 label3.........
其中,label 从 0 开始 。
根据数据集的总数设置的。
网络训练
类似于分类问题的训练,进行网络训练即可 。
CNN框架:
总结:
Loss损失函数对分类数不多的工程项目并没有明显的改善,如果你的分类任务中分类数大于1000,例如人脸识别,使用它效果会有明显提升 。
Loss使得类内距离缩小,类间距离扩大,有效的将各个类别区分开 。
使用了之后,每个类的样本更加聚合,因此类间的距离也随着增大 。随着的值越来越大,类间距越来越大 。达到了增大类间距,缩小类内距离的效果 。