RetinaNet & Focal Loss 论文解读

论文:Focal Loss for Dense Object Detection

论文源代码链接:https://github.com/facebookresearch/Detectron

 

1. 论文动机

       目前利用深度学习的目标检测法主要分为单步法(one-stage detector) 和 两步法(two-stage detector)。两步法预测精度通常要比单步法要高(在这篇文章发表前是这样,但是EfficientDet(请看我写的EfficientDet博客)要比两步法高)但模型推断/预测速度慢,而单步法的模型推断/预测速度快,但是预测精度要差一些。单步法比两步法精度差一点的主要原因是,在单步法里,存在大量的被检测区域为阴性数据(即背景图片),而阳性数据(前景图片)的量远远少于阴性数据,即存在严重的类别不平衡,而在两步法里,由于事先对数据进行了筛选,所以不存在这种不平衡问题。本文就是要通过解决单步法中的数据类别不平衡问题使其精度提高,所采用的方法就是引入了Focal Loss。

2.Focal Loss介绍

        为简单起见,本文以二分类的交叉熵损失(Cross Entropy, CE)为例,详细介绍了Focal Loss。对于二分类的交叉熵损失可以用下面的公式来表示:

                                        CE(p,y) =\left\{\begin{matrix} -log(p) &if y=1&&&(1a)\\ & &&&&&&&(1)\\ -log(1-p)&otherwise&&&(1b) \end{matrix}\right.

其中 y\in \left \{ \pm 1 \right \} 表示的是类别标签,+1表示正样本(positive sample),-1 表示负样本(negative sample), p\in \left [ 0,1 \right ] 表示预测为正样本(y=1)的概率。各位,重点之处要敲黑板了:若p>0.5, 表示预测为正样本,若p<0.5表示预测为负样本,记住这一点对于后里面的focal loss公式理解很重要。实际上在程序里p的值是通过Sigmoid函数来决定的。

      为方便起见,定义p_{t} 如下:

                                         p_{t}=\left\{\begin{matrix} p & if y=1 & &&&(2a) \\ & & &&&&&&(2)\\ 1-p& otherwise & &&&(2b) \end{matrix}\right.

这样就可以把交叉熵公式重新写成: CE(p,y) = CE(p_{t}) = -log(p_{t})。对于单步法目标检测这类问题,由于存在大量的负样本(即背景),虽然单个负样本导致的损失并不大,但是这些负样本累积起来的损失是很大的,远远超过正样本(即前景)累积起来的损失。这样在反向传播时,对梯度贡献大的是负样本的损失。这样在参数更新时,更新的参数值主要是减少负样本的累积损失,使得负样本的正确率提高,对于正样本的判断的提升很有限(也有可能减弱??)。见下图1,仔细体会一下上面的表述:

图1,注意横轴为pt, 从图中公式可以判断得出来。图中公式表示交叉熵损失或Focal loss和 pt的关系。所以图中的曲线代表的就是这两个损失和pt(不是p)的关系。

       上图1的横坐标是pt, 模型的预测值是概率p。如果模型预测的概率值p<0.5, 且该图片的标签是-1, 即背景(负样本),则模型预测正确,那么pt由公式(2b)计算,即pt = 1-p 大于0.5,由图1中的交叉熵损失公式CE(pt) = -log(pt)可知,损失值较小。反之,若模型预测的概率p>0.5,且该图片的标签是+1, 即前景(正样本),则模型预测也正确,那么pt由公式(2a)计算,即pt = p 大于0.5,则损失也较小。因此图1中右端所说的well-classified examples 是指正确预测的前景和背景图片。由于背景图片远远多于前景图片数(比如其比例为 1000:1),那么虽然单个背景图片的损失很小,但是累积起来的损失就很大且会远远超过前景图片累积起来的损失。(注意,图1中横坐标不是训练周期,别搞错了哦)。

        那么,我们再仔细思考,如果我们的正负样本都没有被正确分类的话,损失值会怎么样呢?显而易见,分错了导致的损失值肯定会很大的。比如,输入图片是背景,即该图片的标签为-1, 但是模型预测的概率>0.5,回顾一下前面敲黑板的地方,这表示模型认为该图片是前景(正样本),这样的话,由于标签是-1,pt应该由公式(2b)计算, pt= 1-p 是小于0.5的,该值代入到交叉熵损失公式CE(pt) = -log(pt),则损失函数值是很大的。再比如,如果输入图片是前景,即该图片的标签为+1, 但是模型预测的概率<0.5, 也即模型认为该图是背景。这样,由于标签是+1,pt应该由公式(2a)计算,pt = p 也是小于0.5的,还是用一样的交叉熵损失公式CE(pt) = -log(pt)计算,得到的损失函数值也是很大的。(这里谈一下我个人观点,由于背景数目多,所以容易分类的背景数远远多于容易分类的前景数,那么较难分类的背景数也应该远远多于较难分类的前景数目,所以这里分类错误的损失函数也应该是由背景图片主导。也就是说对于图1中的交叉熵损失函数,不管pt为何值,损失函数值得贡献主要还是来自于背景。)

       根据对图1中交叉熵函数的详细的分析,我们可以看到采用交叉熵损失的两个弊端:(1)由于类别不平衡存在,损失函数的值主要是由背景图片贡献的;(2) 较难分类的样本的损失函数值太大了。对此,本文做了如下处理:

1) 平衡的交叉熵损失函数(Balanced Cross Entropy)

为解决类别不平衡问题,引入一个新的权重因子 \alpha \in [0,1],正样本的权重因子为\alpha,负样本的权重因子为 1-\alpha\alpha是一个超参数,可以人为设定,也可以根据某类别的样本数占总样本数的比例的倒数来设定。这样可以把交叉熵公式改写为:

                                 CE(p_{t}) = -\alpha _{t}log(p_{t})                                (3)

其中\alpha_{t}的定义和p_{t} 是一样的。

2)参数\alpha虽然可以解决样本不平衡问题,但是它不能区分简单的样本和难分的样本。而这一点就要靠Focal Loss来解决了。Focal  Loss是在交叉熵损失的基础上添加了调制因子(modulating factor) \left ( 1-p_{t} \right )^{\gamma }, 具体公式如下:

                               FL(p_{t}) = -\left ( 1-p_{t} \right )^{\gamma }log(p_{t})                     (4)

公式中的\gamma 大于等于0, 在本文中尝试了在[0,5]范围内取值。这个Focal Loss 有两个性质:(1)对于错误分类的样本,p_{t} 比较小(参考前面的分析),所以1-p_{t} 接近1,所以调制因子也接近1,因此它对最终的损失函数没有太大影响,但是对于容易分类的样本,p_{t}接近1, 所以1-p_{t}就很小,而调制因子则会变得更小,这就使得损失函数的值变得比没有这个调制因子时的值小得多。也就是说,对于Focal Loss, 那些容易分类的样本对总的损失的贡献比在交叉熵损失的情况要小得多,几乎可以忽略不计。这样总的损失主要是来自于那些难分的样本。整个模型的训练就集中在解决难分的样本上了。(2)参数\gamma 将那些容易分类的样本对损失的权重平稳的降低了。

在本文中,作者采用的Focal Loss 实际上是考虑了样本平衡因子\alpha的,它比没有考虑\alpha影响的Focal Loss精度更高一些。即:

                            FL(p_{t}) = -\alpha _{t}\left ( 1-p_{t} \right )^{\gamma }log(p_{t})                (5)

(个人认为:根据前面的分析,\alpha就应该要考虑的,它和\left ( 1-p_{t} \right )^{\gamma } 对于Focal Loss的作用是不同的)

从图1中可以看出,\gamma 增大,无论是难分的样本还是简单的样本,总的损失都是在减小的,并且当\gamma=5时,那些容易分类的样本的损失对总损失的贡献已经是非常小了,几乎可以忽略。在本文中,经过实际尝试,发现\gamma增大时,\alpha要适当的减小。

未完待续......

参考资料:

1.https://blog.csdn.net/meccaendless/article/details/87176932

2.https://cloud.tencent.com/developer/article/1347710

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值