这篇论文提出了Focal Loss(焦点损失),通过改进损失函数,从而获得更好地检测模型和更高的检测精度。
Motivation
(1)要清楚两个名词的含义;
- hard example,表示硬实例,比如二分类,正例为1,负例为0,那么训练过程中,预测结果接近0.5的,称为硬实例,通过硬实例,模型能学到更多有用的信息。
- easy example,与上面相反;
(2)传统one-stage相对于two-stage所存在的问题:
- 反例多,学不到有用信息;
- 简单反例(easy negatives)会导致模型退化;
(3)分析原因:
- one-stage不如two-stage,其中一个主要原因是训练类别平衡(imbalance);
- faster R-CNN等two-stage方法,先产生候选区域,然后可以对候选区域可以进行启发性的过滤,从而解决类别不平衡的问题(IOU>0.7视为正类,<0.3为反例,其余的不用于训练);
- 但YOLO和SSD是端到端的,产生多少个候选框,就要训练多少个候选框,不能再中间对候选框过滤,可行而知,在产生的众多候选框中,必定是有目标的远远小于没目标的,所以就产生了类别不均衡问题,从而产生了上述的问题。。
Solution
(1)传统解决方法:执行某种形式的hard negative mining,也就是在训练时,采样hard example 进行训练
(2)这篇文章采用的方法:改变loss function,通过改变权重,增加硬实例损失的权重,减少简单实例的损失权重,从而将焦点放在hard examples上
Focal Loss
Focal loss是在交叉熵损失函数基础上进行的修改,首先回顾二分类交叉上损失:
可见普通的交叉熵对于正样本而言,输出概率越大损失越小。对于负样本而言,输出概率越小则损失越小。此时的损失函数在大量简单样本的迭代过程中比较缓慢且可能无法优化至最优。那么Focal loss是怎么改进的呢?
首先在原有的基础上加了一个因子,其中γ>0使得减少易分类样本的损失,使得更关注于困难的、错分的样本。改变γ大小还可以调节简单样本权重降低的速率,当γ为0时即为交叉熵损失函数,当γ增加时,调整因子的影响也在增加。实验发现γ为2是最优。
此外,加入平衡因子alpha,用来平衡正负样本本身的比例不均:
RetinaNet
作者设计了一个简单密集型网络RetinaNet来训练在保证速度的同时达到了精度最优。
上图可见,在网络结构上并没有多少创新,但因为是用了Focal Loss,取得了不错的精度。