一、前言
在以往的目标检测任务中,一阶段的方法往往会比两阶段的检测算法精度要低,造成一阶段检测效果不佳的原因如下:
1、负样本的数量过多,导致正样本的loss被覆盖,就算正样本的loss非常大也会被数量庞大的负样本中和掉,从而导致整个样本集的损失值较小,而这些正样本才是我们要检测的前景区域;
2、难样本往往是前景和背景区域的过渡部分,这类样本难以被区分,所以称难样本。剩下的易样本往往较好计算,导致模型非常容易就收敛了。但是损失函数收敛了并不代表模型效果好,因为我们更需要把那些难样本训练好,这样才能增强模型过的泛化能力和鲁棒性。
针对上述两个问题,何恺明等人提出一个新的损失函数Focal Loss(FL)。FL是一个尺度动态可调的交叉熵损失函数,在FL中有两个参数α和 λ,其中α主要作用是解决正负样本的不平衡,λ主要是解决难易样本的不平衡。
二、通过交叉熵损失(BC)引出Focal Loss
在介绍FL损失函数之前,首先介绍一下交叉熵损失函数,本文以二值交叉熵为例,其表达式如下:(交叉熵可参考本人博文 交叉熵损失函数(信息量、信息熵、KL散度)_Focal Loss__℡ヾNothing-_哥的博客-CSDN博客)
公式可简写为以下形式:
其中,
其中,p表示预测样本属于1的概率,取值范围为[0,1];y表示标签,取值为{0,1}。
当y=1时,假如某个样本x预测为1这个类的概率p=0.6,那么损失就是-log(0.6),注意这个损失是大于等于0的。如果p=0.9,那么损失就是-log(0.9),所以p=0.6的损失要大于p=0.9的损失,这很容易理解。这里仅仅以二分类为例,多分类以此类推。
三、Focal Loss
首先,承接上一节的交叉熵(BC), Focal Loss(FL)实际上就是在交叉熵损失函数(BC)的基础上进行改进的,在BC中引入了两个参数(α和 λ)对不同的样本进行权重的重新分配。其中,FL的表达式如下:
3.1 参数α:用于解决正负样本不均衡的问题
作者引入参数α是为了解决正负样本不均衡的问题,其原理十分简单,也很符合何凯明大神的风格。α的取值范围为[0,1],当y=1时,αt取值为α;当y=-1时,αt取值为1-α 我们使用和pt类似的方法将αt进行表示,可得:
因此,如果仅仅对正负样本进行不同权重的分配,这可以将交叉熵改造成如下形式:
如果数据中正样本超级多,则将α设置相对小一点,α的值往往需要根据验证集进行调整,原论文中给出的是0.25。
3.2 参数λ:用于解决难易样本不均衡的问题
绘制图看如下Figure1表示预测概率与loss之前的关系,横坐标是pt,纵坐标是loss。
FL(pt)表示focal loss中用到的改进的交叉熵;当λ=0时,FL就退化成CE(pt)标准的交叉熵公式了。 图中曲线中我们可以看出对于易样本的loss可以收敛到很小,但是由于它们的数量过于庞大,把一些难样本的loss覆盖掉,导致求和之后他们依然会支配整个批次样本的收敛方向。
一个简单的策略就是缩小易样本的训练权重。前面引入的α只能解决正负样本不均衡问题,但是没法控制容易分类和难分类样本的权重,于是作者有引入了参数λ对权重进行控制,λ的取值范围为[0,正无穷),包含λ的整个项表达如下:
其中,这里的参数lamda被称作focusing parameter,整项被称为称为调制系数(modulating factor)。由于易样本的预测概率往往接近1,即pt接近于1,那么调制系数项(1-pt)λ的值就会比较小,因此易样本得到了抑制,相对的难样本得到了放大,例如图1中λ>0 的那四条曲线。
举个栗子:当γ=0的时候,focal loss就是传统的交叉熵损失,当γ增加的时候,调制系数也会增加。当γ=2时,对于正类样本而言,预测结果为0.95肯定是简单样本,所以(1-0.95)的gamma次方就会很小,这时损失函数值就变得更小。而预测概率为0.3的样本其损失相对很大。对于负类样本而言同样,预测0.1的结果应当远比预测0.7的样本损失值要小得多。对于预测概率为0.5时,损失只减少了0.25倍,所以更加关注于这种难以区分的样本。
(大量实验表明:当γ增加的时候,a需要减小一点。原文最佳的搭配:γ=2,a=0.25的效果最好)
本文主要参考两位大佬的博文: