object detection按其流程来说,一般分为两大类。一类是two stage detector(如非常经典的Faster R-CNN),另一类则是one stage detector(如SSD、YOLO系列)。
虽然one stage detector检测速度可以完爆two stage,但是mAP却干不过two stage。 So,Why? the Reason is:Class Imbalance(正负样本不平衡) one stage detector evaluate 10^4 - 10^5 candidate locations per image, but only a few locations contain objects.
这带来的问题就是:样本中会存在大量的easy examples,且都是负样本(属于背景的样本)。这样,en masse(这个词不错,以前在经济学人里学过)easy negative examples会对loss起主要贡献作用,会主导梯度的更新方向。
这样,网络学不到有用的信息,无法对object进行准确分类。
原文链接:https://blog.csdn.net/LeeWanzhi/article/details/80069592
首先回顾二分类交叉熵损失:
其中 y 是真实样本的标签(1正0负), y’ 是经过 sigmoid **函数的预测输出(数值在0-1之间)。可见普通的交叉熵对于正样本而言,输出概率越大损失越小。对于负样本而言,输出概率越小则损失越小。此时的损失函数在大量简单样本的迭代过程中比较缓慢且可能无法优化至最优。
交叉熵:
如下是未变化前的交叉熵(cross entropy) loss,以二分类为例:
为了便于表示,做如下变换:
最终形式为:
通过实验发现,即使是easy examples(Pt >> 0.5),它的loss也很高,如下图蓝线
因此,对于大量的easy negative examples,这些loss会主导梯度下降的方向,淹没少量的正样本的影响。
so,我们要降低easy examples的影响。
我们为交叉熵叫一个权重,其中权重因子的大小一般为相反类的比重。即负样本不是多吗,它越多,我们给它的权重越小。这样就可以降低负样本的影响。
这只是解决了正负样本的不平衡,但是并没有解决easy和hard examples之间的不平衡。
因此,针对easy和hard 样本,我们定义Focal loss:
作者由此提出Focal loss函数:
首先在原有的基础上加了一个因子,其中Gamma>0使得减少易分类样本的损失,使得模型更关注于困难的、错分的样本。
例如:Gamma为2时,对于正类样本而言,预测结果为0.95肯定是简单样本,所以(1-0.95)的gamma次方就会很小,这时损失函数值就变得更小。而预测概率为0.3的样本其损失相对很大。对于负类样本而言同样,预测0.1的结果应当远比预测0.7的样本损失值要小得多。对于预测概率为0.5时,损失只减少了0.25倍。
所以更加关注于这种难以区分的样本。这样减少了简单样本的影响,大量预测概率很小的样本叠加起来后的效应才可能比较有效。
在此基础上,再引入一个平衡因子 Alpha,用来平衡正负样本本身的数量比例不均(即类别不均衡):
只添加Alpha虽然可以平衡正负样本的重要性,但是无法解决简单与困难样本的问题,因此针对难分样本的Gamma也必不可少。
这里的两个参数α和γ协调来控制,本文作者采用α=0.25,γ=2效果最好。
Gamma调节简单样本权重降低的速率,当Gamma为0时即为交叉熵损失函数,当Gamma增加时,调整因子的影响也在增加。
Focal loss让one stage detecor也变的牛逼起来,解决了class imbalance的问题,同时解决了正负样本不平衡以及区分简单与复杂样本的问题。