在2D的图像检测的任务中,一种有一个比较明显的问题就是前后景数量上巨大的不平衡,背景一般远远多余前景(也就是目标),这就导致一个问题,就是背景相关的梯度几乎统治了梯度的传播过程,本文提出的Focal Loss 就是试图对损失函数的形态进行更改,从而达到平衡前后景相关的loss在梯度传播中的程度。
Abstract
在 目标检测的任务中,one-stage 的方法在规则、密集采样下拥有更快更简单的潜力,但是精度上目前还是略差于two-stage的方法。作者调查后发现,一个很重要的因素(central cause)就是由于foreground-background之间巨大的比例差异,因此作者针对这个问题,提出了Focal loss——一种基于交叉熵函数的改进的损失函数。同时为了验证其有效性,作者设计了一个简单的dense detector,称为RetinaNet。该网络在精度方面已经超过了当时的two-stage方法。
Introduction
该部分觉得有个帖子写的比较好,所以直接粘贴过来了,已经注明出处。
一、为什么单级结构的识别准确度低
作者认为单级结构准确度低是由类别失衡(class imbalance)引起的。在深入理解这个概念前我们先来强化下“类别”这个概念:计算Loss的bbox可以分为positive和negative两类。当bbox(由anchor加上偏移量得到)与ground truth间的IOU大于上门限时(一般是0.5),会认为该bbox属于positive example,如果IOU小于下门限就认为该bbox属于negative example。在一张输入image中,目标占的比例一般都远小于背景占的比例,所以两类example中以negative为主,这引发了两个问题:
1、negative example过多造成它的loss太大,以至于把positive的loss都淹没掉了,不利于目标的收敛;
2、大多negative example不在前景和背景的过渡区域上,分类很明确(这种易分类的negative称为easy negative),训练时对应的背景类score会很大,换个角度看就是单个example的loss很小,反向计算时梯度小。梯度小造成easy negative example对参数的收敛作用很有限,我们更需要loss大的对参数收敛影响也更大的example,即hard positive/negative example。
这里要注意的是前一点我们说了negative的loss很大,是因为negative的绝对数量多,所以总loss大;后一点说easy negative的loss小,是针对单个example而言。
Faster RCNN的两级结构可以很好的规避上述两个问题。具体来说它有两大法宝:1、会根据前景score的高低过滤出最有可能是前景的example (1K~2K个),因为依据的是前景概率的高低,就能把大量背景概率高的easy negative给过滤掉,这就解决了前面的第2个问题;2、会根据IOU的大小来调整positive和negative example的比例,比如设置成1:3,这样防止了negative过多的情况(同时防止了easy negative和hard negative),就解决了前面的第1个问题。所以Faster RCNN的准确率高。
OHEM是近年兴起的另一种筛选example的方法,它通过对loss排序,选出loss最大的example来进行训练,这样就能保证训练的区域都是hard example。这个方法有个缺陷,它把所有的easy example都去除掉了,造成easy positive example无法进一步提升训练的精度。
图1是hard positvie、hard negative、easy positive、easy negative四种example的示意图,可以直观的感受到easy negativa占了大多数。
作者:张磊_0503
链接:https://www.jianshu.com/p/204d9ad9507f
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
2 Related Work
- 该部分分别列举了不同方法的目标检测方法,分别为传统方法、Two-stage方法以及one-stage方法。略。
3 Focal Loss
- 上文已经提到,Focal Loss设计的初衷就是为了在one-stage方法中平衡前景和背景,在相信展开Focal Loss之前,先回顾一下传统使用的交叉熵损失函数。(cross entropy loss:以下简称CE)。
- CE详解:
- 在说交叉熵之前,不得不提logistic distribution。我们的最后一层的激活函数一般用的是logitic regression,也就是 11+ex
1+ex1?;这个函数就是logistic distribution的概率函数,假设x
- x在原空间服从平均分布,则经过激活函数后,其结果呈现的分布就是logistic distribution。
- 对于二分类任务,考虑条件概率函数:
- φ(xi)=P(y=1∣x)=11+ewx
- φ(xi?)=P(y=1∣x)=1+ewx1?
- 1?φ(xi)=P(y=0∣x)=1?11+ewx
-
- 1?φ(xi?)=P(y=0∣x)=1?1+ewx1?
- 对既有样本进行最大似然估计:w=∏ni=0φ(xi)yi(1?φ(xi))1?yi
- w=∏i=0n?φ(xi?)yi?(1?φ(xi?))1?yi?
- 取对数:log(w(x))=∑ni=0[yilogφ(xi))+(1?yi)log(1?φ(xi))]
-
- log(w(x))=∑i=0n?[yi?logφ(xi?))+(1?yi?)log(1?φ(xi?))]
- 以上就是交叉熵的由来了,上面的对数似然函数呈现的形式与交叉熵是等价的,也就是交叉熵最小的时候,最大似然函数取得极大值。
- 所以优化目标就变成了最小交叉熵。也就是论文中提到的形式。如下图:
3.1 Balanced Cross Entropy
- 平衡损失函数最直观的想法就是在正样本损失和负样本损失前面添加一个权重,即:
- balanced loss function: CE(pt)=?αlog(pt)
-
- CE(pt?)=?αlog(pt?)
3.2 Focal Loss Definition
- 3.1中提到的balanced CE通过给正负样本分配不同的权重,从而达到了平衡前后景损失在传递时候的imbalance,但是有一个问题就是,该损失并没有解决hard example和easy example的问题。为了解决这个问题就需要引入跟pt
pt?相关的一个参数,当ptpt?越大的时候,让其损失的比例稍微小一点(因为它易于区别,easy example);同理,当ptpt?越小的时候。那很显然1?pt1?pt?有这样的性质,因为ptpt?的值阈为[0,1],但是如果单单只用1?pt1?pt?就陷入了参数不可调的情况,则对其取一个可调整的指数,也就是(1?pt)γ
- (1?pt?)γ,从而实现了hard example 和 easy example的平衡。也就是focal loss的最终形式。
- Focal Loss:FL=?αt(1?pt)γlog(pt)
- FL=?αt?(1?pt?)γlog(pt?)
- 简单来说就是:通过αt
- αt? 来控制正负样本的imbalance,
- 通过(1?pt)γ
- (1?pt?)γ来调和easy example 和hard example的问题。
- 作者实验表明:αt<0.5
- αt?<0.5,γ=2
-
- γ=2的时候效果比较好(loss is scaled down by at most 4X)。
3.3 Class Imbalance and Model Initialization
在训练初始阶段因为positivie和negative的分类概率基本一致,会造成公式1起不到抑制easy example的作用,为了打破这种情况,作者对最后一级用于分类的卷积的bias(具体位置见图2)作了下小修改,把它初始化成一个特殊的值b=-log((1-π)/π)。π在论文中取0.01,这样做能在训练初始阶段提高positive的分类概率。
4 Experiment
- 略。整体是有一定的效果提升的,包括个人实践在其他的检测网络里
本文完
-