这篇有关Focal Loss的paper是何恺明大神提出的又一经典paper,除了提出Focal Loss还提出了RetinaNet,这里就先不对RetinaNet做介绍,单纯讲讲Focal Loss
目录
- 背景
- 简单介绍
- 核心思想
- 论文
背景
- 我们知道目标检测的算法主要可以分为两大类:
two-stage
和one-stage
。前者的代表算法是R-CNN系列,可以达到很高的准确率,但是速度较慢。后者是指像YOLO这样直接回归的检测算法,这类算法速度很快,但是准确率不如前者。作者提出Focal Loss的出发点也是希望one-stage的算法可以达到two-stage算法的准确率,同时不影响原有的速度。
简单介绍
- 作者剖析了现在one-stage算法准确率低的原因,作者认为是样本不均衡导致的。我们知道在目标检测中,一张图像可能生成千上万的候选框,但是其中只有很少一部分是包含目标的,这就带来了类别不均衡(eg:1:1000)。正因为此导致了:
(1) training is inefficient as most locations are easy negatives that contribute no useful learning signal;
(2) en masse, the easy negatives can overwhelm training and lead to degenerate models.
- 翻译过来就是在目标检测中有很多容易分类的负样本贡献了大部分的loss,所以模型优化得就没有那么理想。
- 因此针对类别不均衡问题,作者提出一种新的损失函数:
Focal Loss
,这个损失函数是在标准交叉熵损失基础上修改得到的。这个函数可以通过减少易分类样本的权重,使得模型在训练时更专注于优化难分类的样本。为了证明Focal Loss的有效,作者设计了一个新的检测网络:RetinaNet,并且在训练时采用Focal Loss训练。实验证明RetinaNet不仅可以达到one-stage detector的速度,也能有two-stage detector的准确率。
核心思想
交叉熵
-
既然Focal Loss是从标准交叉熵而来,那我们就从标准交叉熵说起:
C E ( p , y ) = { − log ( p ) i f y = 1 − log ( 1 − p ) o t h e r w i s e CE(p,y)=\begin{cases}{-\log(p)}&{if y=1 }\\\ -\log(1-p) & otherwise \end {cases} CE(p,y)={−log(p) −log(1−p)ify=1otherwise(1) -
以二分类为例,其中 y ∈ − 1 , + 1 y\in{-1,+1} y∈−1,+1, P ∈ [ 0 , 1 ] P\in[0,1] P∈[0,1],P即是该类别的置信度,为了方便,用 P t P_t Pt替代 P P P,公式如下:
p t = { p i f y = 1 1 − p o t h e r w i s e p_t=\begin{cases} p & if y=1 \\\ 1-p & otherwise\end{cases} pt={p 1−pify=1otherwise(2) -
为了方便,我们用 p t p_t pt表示样本属于正样本的概率,所以(1)式可以写成:
C E ( p , y ) = C E ( p t ) = − l o g ( p t ) CE(p,y)=CE(p_t)=-log(p_t) CE(p,y)=CE(pt)=−log(pt)(3)
简单改进的交叉熵
- 既然正负样本的数量不平衡,那么一种常见的做法就是给正负样本加上权重,对出现次数少的正样本赋予更高的权重,对出现次数多的负样本赋予低的权重。因此可以通过设定
α
∈
[
0
,
1
]
\alpha\in[0,1]
α∈[0,1]的值来控制正负样本对总的loss的权重。公式如下:
C E ( p t ) = − α t l o g ( p t ) CE(p_t)=-\alpha_tlog(p_t) CE(pt)=−αtlog(pt) (4) - 但是这种形式并没有解决问题,因为正负样本中还分难易,而在目标检测中大量的候选目标都是易分样本,示意图如下:
- 由于数量极不平衡,易分样本的数量相对来讲太多,最终主导了总的损失。而作者认为,易分样本对模型的提升效果非常小,模型应该主要关注那些难分样本。类似于上面改进的思想,那我们降低易分样本的权重即可,所以Focal Loss就提出了。
Focal Loss
- Focal Loss的形式如下:
F L ( p t ) = − ( 1 − p t ) γ l o g ( p t ) FL(p_t)=-(1-p_t)^{\gamma}log(p_t) FL(pt)=−(1−pt)γlog(pt) (5) - 其中, ( 1 − p t ) γ (1-p_t)^{\gamma} (1−pt)γ称为调制系数,那为什么加了这个调制系数就可以平衡难易样本呢,我们通过两个例子来感受:
- 对于正样本来说,预测出的 p t p_t pt为0.9这样比较大的为易分样本,那么调制系数 ( 1 − p t ) γ (1-p_t)^{\gamma} (1−pt)γ接近于0,整个式子的值就比较小,对总体的loss基本无贡献(影响);若预测出的 p t p_t pt为0.1这样比较小的为难分样本,那么调制系数 ( 1 − p t ) γ (1-p_t)^{\gamma} (1−pt)γ接近于1,损失和原来交叉熵几乎一样,负样本同理。这样减少了易分样本的影响,让模型更加关注难分样本。
- 我们通过一个具体的数字来感受一下:假如 γ \gamma γ取2,这时预测出的 p t p_t pt为0.9,那么损失将比原来衰减 ( 1 − 0.9 ) 2 = 0.01 (1-0.9)^2=0.01 (1−0.9)2=0.01,也就是这个易分样本的损失衰减了一百倍。
- 当然我们可以发现,当 γ = 0 \gamma=0 γ=0的时候,focal loss就是传统的交叉熵损失,当γ增加的时候,调制系数也会增加。 γ增大能增强调制因子的影响,实验发现γ取2最好。调制因子减少了易分样本的损失贡献,拓宽了样例接收到低损失的范围。
- 到了这里我们就解决了难易样本不均衡的问题,再结合式(4)解决正负样本问题的思路,Focal Loss就可以解决正负样本不均衡以及难易样本不均衡两个问题,最后形式如下:
F L ( p t ) = − α ( 1 − p t ) γ l o g ( p t ) FL(p_t)=-\alpha(1-p_t)^{\gamma}log(p_t) FL(pt)=−α(1−pt)γlog(pt) - 作者实验后发现, γ \gamma γ取2, α \alpha α取0.25效果最好。
论文
[https://arxiv.org/abs/1708.02002
](https://arxiv.org/abs/1708.02002)