人脸识别-损失函数改进方法之L-softmax loss center-loss A-softmax loss focal loss

1、Large Marge Softmax Loss 
ICML2016提出的Large Marge Softmax Loss(L-softmax)通过在传统的softmax loss公式中添加参数m,加大了学习的难度,逼迫模型不断学习更具区分性的特征,从而使得类间距离更大,类内距离更小。核心内容可以看下图:

这里写图片描述

什么意思呢?上面一行表示training set,下面一行表示testing set。每一行的第一个都是传统的softmax,后面3个是不同参数的L-softmax,看看类间和类内距离的差距!

因为L-softmax loss是在原来传统的softmax loss上改进的,因此还是先从softmax loss讲起: 
softmax loss的公式如下:

这里写图片描述

fj表示class score f向量的第j个元素。N表示训练数据的数量。log函数的括号里面的内容就是softmax,(如果不是很理解softmax,softmax loss,可以参看这篇博文:softmax,softmax-loss,BP的解释)简单讲就是属于各个类别的概率,因此fyi就可以理解为全连接层的输出,也就是:

这里写图片描述

上面这个式子就是W和x的内积,因此可以写成下面这样:

这里写图片描述

因此Li就变成下式:

扫描二维码关注公众号,回复: 1430162 查看本文章

这里写图片描述

那么Large Margin Softmax Loss是什么意思? 
假设一个2分类问题,x属于类别1,那么原来的softmax肯定是希望:

这里写图片描述

也就是属于类别1的概率大于类别2的概率,这个式子和下式是等效的:

这里写图片描述

那么Large Margin Softmax就是将上面不等式替换成下式:

这里写图片描述

因为m是正整数,cos函数在0到π范围又是单调递减的,所以cos(mx)要小于cos(x)。m值越大则学习的难度也越大,这也就是最开始Figure2中那几个图代表不同m值的意思。因此通过这种方式定义损失会逼得模型学到类间距离更大的,类内距离更小的特征。不过个人认为可能需要迭代次数多点才能看到效果。

这样L-softmax loss的Li式子就可以在原来的softmax loss的Li式子上修改得到:

这里写图片描述

Figure4是从几何角度直观地看两种损失的差别,L-softmax loss学习到的参数可以将两类样本的类间距离加大。通过对比可以看到L-softmax loss最后学到的特征之间的分离程度比原来的要明显得多。

这里写图片描述

因此L-softmax loss的思想简单讲就是加大了原来softmax loss的学习难度。借用SVM的思想来理解的话,如果原来的softmax loss是只要支持向量和分类面的距离大于h就算分类效果比较好了,那么L-softmax loss就是需要距离达到mh(m是正整数)才算分类效果比较好了。

2、Center Loss 
ECCV2016提出的center loss是通过将特征和特征中心的距离和softmax loss一同作为损失函数,使得类内距离更小,有点L1,L2正则化的意思。核心内容如下图所示:

这里写图片描述

接下来详细介绍center loss。如果你还是不熟悉传统的softmax loss,那么先来看看传统的softmax loss。首先区分softmax和softmax loss的区别,可以看博客:softmax,softmax-loss,BP的解释。下面公式1中log函数的输入就是softmax的结果(是概率),而Ls表示的是softmax loss的结果(是损失)。wx+b是全连接层的输出,因此log的输入就表示xi属于类别yi的概率。

这里写图片描述

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

这里写图片描述

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

这里写图片描述

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

这里写图片描述

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

作者文中用的损失L的包含softmax loss和center loss,用参数南木达(打不出这个特殊字符)控制二者的比重,如下式所示。这里的m表示mini-batch的包含的样本数量,n表示类别数。

这里写图片描述

具体的算法描述可以看下面的Algorithm1:

这里写图片描述

3、A-softmax Loss 
CVPR2017提出的A-softmax loss(angular softmax loss)用来改进原来的softmax loss。A-softmax loss简单讲就是在large margin softmax loss的基础上添加了两个限制条件||W||=1和b=0,使得预测仅取决于W和x之间的角度。核心思想可以参看下面这个图。

这里写图片描述

还是先从softmax loss开始讲起。假设一个二分类问题,那么下面的公式1和2分别表示样本x属于类别1和类别2的概率,这个计算的过程就是softmax。这里的W1和W2都是向量,二者合在一起组成全连接层的参数矩阵W,也就是W=[W1,W2],全连接层的输出也就是Wx。假设输出的尺寸是m*n,那么m就表示batch size,n表示类别数,所以这里的W1x和W2x就分别是Wx的两列。偏置b比较简单就不详细说了。因此如果p1大于p2,那么x属于类别1。

这里写图片描述

这个时候可以联想到文章前面提到的一个公式:

这里写图片描述

文章说这是softmax的decision boundary,怎么理解呢?其实就是p1=p2的情况,此时W1x+b1=W2x+b2。

公式1和2只是softmax,并不是softmax loss,这两者是有差别的,一个是概率,一个是损失。softmax loss的公式如下:

这里写图片描述

公式3的log函数的输入就是前面公式1和2的p1和p2,只不过不需要分开写成W1和W2,而是用W就行。这里yi表示某个类别,j表示所有类别。

公式4是将Li展开来写,并且引入了角度参数:

这里写图片描述

为什么公式4的上下两个等式是成立的?因为可以将矩阵相乘:

这里写图片描述

写成:

这里写图片描述

非常容易理解吧。

那么如果引入下面这两个限制条件呢?

这里写图片描述

这里写图片描述

那么公式3(结合公式4和上面两个限制条件看)就会变成:

这里写图片描述

那么为什么要引入这两个限制条件呢?原来的decision boundary是这样的:

这里写图片描述

如果有上面的两个限制条件,那么decision boundary就变成了:

这里写图片描述

也就是说变成只取决于角度了。

在这两个限制条件的基础上,作者又添加了和large margin softmax loss一样的角度参数,使得公式5变成如下的公式6:

这里写图片描述

这部分可以参考损失函数改进之Large-Margin Softmax Loss,基本一样。

公式6也就是作者文中最终使用的loss公式。因此A-softmax loss可以看成是large margin softmax loss的改进版,也就是在large margin softmax loss的基础上添加了两个限制条件。

Figure3表示从几何角度看A-softmax loss。

这里写图片描述

后面作者还通过数学公式证明了对于二分类,m的最小值要满足下面这个不等式:

这里写图片描述

对于多分类,m的最小值要满足下面这个不等式:

这里写图片描述

另外关于实验结果可以看论文,因为这篇博文主要是介绍这个A-softmax loss,实验结果就不贴了,不过在和large margin softmax loss,center loss的对比中还是提高了一些。

4、Focal Loss 

这是Facebook的RBG和Kaiming大神前天放在arxiv的新作,立马就引来了业界的围观,在COCO数据集上的AP和速度都有明显提升。核心思想在于概括了object detection算法中proposal-free一类算法准确率不高的原因在于:类别不均衡。于是在传统的交叉熵损失上进行修改得到Focal Loss

我们知道object detection的算法主要可以分为两大类:two-stage detector和one-stage detector。前者是指类似Faster RCNN,RFCN这样需要region proposal的检测算法,这类算法可以达到很高的准确率,但是速度较慢。虽然可以通过减少proposal的数量或降低输入图像的分辨率等方式达到提速,但是速度并没有质的提升。后者是指类似YOLO,SSD这样不需要region proposal,直接回归的检测算法,这类算法速度很快,但是准确率不如前者。作者提出focal loss的出发点也是希望one-stage detector可以达到two-stage detector的准确率,同时不影响原有的速度。

既然有了出发点,那么就要找one-stage detector的准确率不如two-stage detector的原因,作者认为原因是:样本的类别不均衡导致的。我们知道在object detection领域,一张图像可能生成成千上万的candidate locations,但是其中只有很少一部分是包含object的,这就带来了类别不均衡。那么类别不均衡会带来什么后果呢?引用原文讲的两个后果:(1) training is inefficient as most locations are easy negatives that contribute no useful learning signal; (2) en masse, the easy negatives can overwhelm training and lead to degenerate models. 什么意思呢?负样本数量太大,占总的loss的大部分,而且多是容易分类的,因此使得模型的优化方向并不是我们所希望的那样。其实先前也有一些算法来处理类别不均衡的问题,比如OHEM(online hard example mining),OHEM的主要思想可以用原文的一句话概括:In OHEM each example is scored by its loss, non-maximum suppression (nms) is then applied, and a minibatch is constructed with the highest-loss examples。OHEM算法虽然增加了错分类样本的权重,但是OHEM算法忽略了容易分类的样本。

因此针对类别不均衡问题,作者提出一种新的损失函数:focal loss,这个损失函数是在标准交叉熵损失基础上修改得到的。这个函数可以通过减少易分类样本的权重,使得模型在训练时更专注于难分类的样本。为了证明focal loss的有效性,作者设计了一个dense detector:RetinaNet,并且在训练时采用focal loss训练。实验证明RetinaNet不仅可以达到one-stage detector的速度,也能有two-stage detector的准确率。

focal loss的含义可以看如下Figure1,横坐标是pt,纵坐标是loss。CE(pt)表示标准的交叉熵公式,FL(pt)表示focal loss中用到的改进的交叉熵,可以看出和原来的交叉熵对比多了一个调制系数(modulating factor)。为什么要加上这个调制系数呢?目的是通过减少易分类样本的权重,从而使得模型在训练时更专注于难分类的样本。首先pt的范围是0到1,所以不管γ是多少,这个调制系数都是大于等于0的。易分类的样本再多,你的权重很小,那么对于total loss的共享也就不会太大。那么怎么控制样本权重呢?举个例子,假设一个二分类,样本x1属于类别1的pt=0.9,样本x2属于类别1的pt=0.6,显然前者更可能是类别1,假设γ=1,那么对于pt=0.9,调制系数则为0.1;对于pt=0.6,调制系数则为0.4,这个调制系数就是这个样本对loss的贡献程度,也就是权重,所以难分的样本(pt=0.6)的权重更大。Figure1中γ=0的蓝色曲线就是标准的交叉熵损失。

这里写图片描述

Figure2是在COCO数据集上几个模型的实验对比结果。可以看看再AP和time的对比下,本文算法和其他one-stage和two-stage检测算法的差别。

这里写图片描述

看完实验结果和提出算法的出发点,接下来就要介绍focal loss了。在介绍focal loss之前,先来看看交叉熵损失,这里以二分类为例,p表示概率,公式如下:

这里写图片描述

因为是二分类,所以y的值是正1或负1,p的范围为0到1。当真实label是1,也就是y=1时,假如某个样本x预测为1这个类的概率p=0.6,那么损失就是-log(0.6),注意这个损失是大于等于0的。如果p=0.9,那么损失就是-log(0.9),所以p=0.6的损失要大于p=0.9的损失,这很容易理解。

为了方便,用pt代替p,如下公式2:。这里的pt就是前面Figure1中的横坐标。

这里写图片描述

接下来介绍一个最基本的对交叉熵的改进,也将作为本文实验的baseline,如下公式3。什么意思呢?增加了一个系数at,跟pt的定义类似,当label=1的时候,at=a;当label=-1的时候,at=1-a,a的范围也是0到1。因此可以通过设定a的值(一般而言假如1这个类的样本数比-1这个类的样本数多很多,那么a会取0到0.5来增加-1这个类的样本的权重)来控制正负样本对总的loss的共享权重。

这里写图片描述

显然前面的公式3虽然可以控制正负样本的权重,但是没法控制容易分类和难分类样本的权重,于是就有了focal loss:

这里写图片描述

这里的γ称作focusing parameter,γ>=0。

这里写图片描述

称为调制系数(modulating factor) 
这里介绍下focal loss的两个重要性质:1、当一个样本被分错的时候,pt是很小的(请结合公式2,比如当y=1时,p要小于0.5才是错分类,此时pt就比较小,反之亦然),因此调制系数就趋于1,也就是说相比原来的loss是没有什么大的改变的。当pt趋于1的时候(此时分类正确而且是易分类样本),调制系数趋于0,也就是对于总的loss的贡献很小。2、当γ=0的时候,focal loss就是传统的交叉熵损失,当γ增加的时候,调制系数也会增加。 
focal loss的两个性质算是核心,其实就是用一个合适的函数去度量难分类和易分类样本对总的损失的贡献。

作者在实验中采用的是公式5的focal loss(结合了公式3和公式4,这样既能调整正负样本的权重,又能控制难易分类样本的权重):

这里写图片描述

在实验中a的选择范围也很广,一般而言当γ增加的时候,a需要减小一点(实验中γ=2,a=0.25的效果最好)

贴一下RetinaNet的结构图:Figure3。因为网络结构不是本文的重点,所以这里就不详细介绍了,感兴趣的可以看论文的第4部分。

这里写图片描述

实验结果: 
Table1是关于RetinaNet和Focal Loss的一些实验结果。(a)是在交叉熵的基础上加上参数a,a=0.5就表示传统的交叉熵,可以看出当a=0.75的时候效果最好,AP值提升了0.9。(b)是对比不同的参数γ和a的实验结果,可以看出随着γ的增加,AP提升比较明显。(d)通过和OHEM的对比可以看出最好的Focal Loss比最好的OHEM提高了3.2AP。这里OHEM1:3表示在通过OHEM得到的minibatch上强制positive和negative样本的比例为1:3,通过对比可以看出这种强制的操作并没有提升AP。(e)加入了运算时间的对比,可以和前面的Figure2结合起来看,速度方面也有优势!注意这里RetinaNet-101-800的AP是37.8,当把训练时间扩大1.5倍同时采用scale jitter,AP可以提高到39.1,这就是全文和table2中的最高的39.1AP的由来。

这里写图片描述

Figure4是对比forground和background样本在不同γ情况下的累积误差。纵坐标是归一化后的损失,横坐标是总的foreground或background样本数的百分比。可以看出γ的变化对正(forground)样本的累积误差的影响并不大,但是对于负(background)样本的累积误差的影响还是很大的(γ=2时,将近99%的background样本的损失都非常小)。

这里写图片描述

总结: 
原文的这段话概括得很好:In this work, we identify class imbalance as the primary obstacle preventing one-stage object detectors from surpassing top-performing, two-stage methods, such as Faster R-CNN variants. To address this, we propose the focal loss which applies a modulating term to the cross entropy loss in order to focus learning on hard examples and down-weight the numerous easy negatives.


猜你喜欢

转载自blog.csdn.net/u011808673/article/details/80491361
今日推荐