一 总述
Focal loss主要是为了解决单阶段正负样本比例严重不均衡的问题,何凯明大神认为单阶段检测与双阶段检测精度差别的本质原因是由于前景、背景样本分布均匀造成的,想想双阶段检测如faster rcnn系列,有RPN罩着啊!先经过一轮粗分类,去掉了目标置信度比较低的候选框,然后再经过OHEM等方法在正负样本分布相对不那么大的情况下进行细分类,而单阶段一次就能产生100k+的候选框,这么多的框框其中真实有效的前景框也就那么几个,如果我们还采用交叉熵损失的话,将会train飞!因为这里面有太多容易区分的背景类了!分类器认为单纯将所有样本都标记为负样本即概率都接近0,也能取得较小的损失啊,于是乎就有了Focal loss,大大降低了简单负样本。
二 损失函数形式
在了解Focal loss前,先看一下我们在分类中经常使用的交叉熵损失吧。下图为基础的二分类交叉熵损失
其中y'是经过logistic或sigmoid激活过后的值,可以理解为概率吧。对于正样本而言,预测的y'越大,损失越低,对负样本,预测的y'越小,损失越低。此时损失函数在大量简单样本的趋势下降低缓慢并且很难达到最优,于是Focal Loss对其进行了一波改进。
首先加了一个影响因子,gamma(>0)指数的作用是增大难例样本对损失函数的贡献,减小简单样本对损失函数的贡献,从而使损失函数更关注那些难样本。
例如gamma=2,对于一个正样本,如果预测得到的概率为0.1 ,那么其产生的损失函数值将是巨大的,对于负样本也是如此,对于预测概率为0.5时,损失只减少了0.25倍,所以更加关注于这种难以区分的样本。这样减少了简单样本的影响,大量预测概率很小的样本叠加起来后的效应才可能比较有效。
此外,加入平衡因子alpha,用来平衡正负样本本身的比例不均:
只添加alpha虽然可以平衡正负样本的重要性,但是无法解决简单与困难样本的问题。
gamma调节简单样本权重降低的速率,当gamma为0时即为交叉熵损失函数,当gamma增加时,调整因子的影响也在增加。实验发现gamma为2是最优。
3. 总结
作者认为one-stage和two-stage的表现差异主要原因是大量前景背景类别不平衡导致。作者设计了一个简单密集型网络RetinaNet来训练在保证速度的同时达到了精度最优。在双阶段算法中,在RPN阶段,通过得分和nms筛选过滤掉了大量的负样本,然后在分类回归阶段又固定了正负样本比例,或者通过OHEM在线困难挖掘使得前景和背景相对平衡。而one-stage阶段需要产生约100k的候选位置,虽然有类似的采样,但是训练仍然被大量负样本所主导。