背景
目标检测中,one-stage相比two-stage,要在更稠密的样本中进行筛选和学习(即Dense Predict),由于后者基于region proposal的思想,已经初筛掉大部分easy background(在RCNN和Fast RCNN中使用selective search,在Faster RCNN中使用RPN)。
因此前景背景(foreground-background)的不平衡(imbalance)是one-stage训练时的主要问题。
one-stage在训练时都会面临class-imbalance的问题,会导致两个弊端:
- 训练不高效,大多数位置都是Easy Negative,贡献很少的有用学习信号(useful learning signal)
- Easy Negative 会主导(overwhelm)训练,导致退化的模型(degenerate models)
常用的解决思路是用难分类负样本挖掘(hard negative mining),即按照正负样本的比例,挑选Loss值最大的负样本,与正样本进行训练。
例如当前图像中,正样本有3,提前设置的正负比例为7:1,则挑选21个Loss最大的负样本,与这3个正样本进行训练(共24个)。
而focal loss能根据每个Sample置信度的大小,动态地缩放其对应权重。随着正确类别的置信度提高,它的尺度因子会衰减置零。也就是说,这个尺度因子能自动降低训练时easy samples的贡献占比,让模型专注于hard samples。
Cross Entropy Loss
常用的CELoss为:
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) = \left\{ \begin{aligned} &-\log(p) && if \ y=1 \\ &-\log(1-p) && otherwise. \end{aligned} \right.
CE(p,y)={−log(p)−log(1−p)if y=1otherwise.
为方便标记,记
p
t
p_t
pt:
p
t
=
{
p
i
f
y
=
1
1
−
p
o
t
h
e
r
w
i
s
e
.
p_t= \left\{ \begin{aligned} &p && if \ y=1 \\ &1-p && otherwise. \end{aligned} \right.
pt={p1−pif y=1otherwise.
重写CELoss为:
C
E
(
p
,
y
)
=
C
E
(
p
t
)
=
−
log
(
p
t
)
CE(p, y) = CE(p_t)=-\log(p_t)
CE(p,y)=CE(pt)=−log(pt)
当大量的easy samples loss叠加,这些小的损失值可以主导那些稀少的、缺乏训练的类。
Balanced Cross Entropy
针对class imbalance的常用方法是用一个权重参数α∈[0,1]对类别进行权重的倾斜。
对y=1(数量较少)的类别提供较大的权重,对背景(数量较多)的类别提供较小的权重。
Balanced CELoss:
α
t
=
{
α
i
f
y
=
1
1
−
α
o
t
h
e
r
w
i
s
e
.
\alpha_t= \left\{ \begin{aligned} &\alpha && if \ y=1 \\ &1-\alpha && otherwise. \end{aligned} \right.
αt={α1−αif y=1otherwise.
C
E
(
p
t
)
=
−
α
t
log
(
p
t
)
CE(p_t) = -\alpha_t\log(p_t)
CE(pt)=−αtlog(pt)
然而这种权重方式太依赖超参数α的选定,且只能缓解样本数量的不平衡问题,不能缓解样本难易程度的问题。
例如某个背景样本缺很难学,这种情况则无法优化。
Focal Loss
因此作者从难易的角度入手,旨在为学得好的样本提供更小的权重(Loss小),学得糟糕的样本提供更大的权重(Loss大)。
这种学习的角度,即能有效较低易样本对模型训练的主导,又能缓解样本类别数量不平衡的问题。因为类别数量的不平衡,通常情况下也会让模型对数量多的类别学得更好(因为拥有足够的训练),Focal Loss就能对易且量大的samples降低影响力。
Focal Loss:
F
L
(
p
t
)
=
−
(
1
−
p
t
)
γ
log
(
p
t
)
FL(p_t)=-(1-p_t)^\gamma\log(p_t)
FL(pt)=−(1−pt)γlog(pt)
下图为γ取不同值时的loss值:
当label为正样本,模型预测为正的置信度很低时,这可以理解为难样本,
p
t
=
p
p_t=p
pt=p就很小。
当label为负样本,模型却预测为正的置信度很高,这也可以理解为难样本,同时
p
t
=
1
−
p
p_t=1-p
pt=1−p也是很小。
所以我们可以用
p
t
p_t
pt的大小来统称难易样本,且不论正负样本。
p
t
p_t
pt小代表难样本,
p
t
p_t
pt大代表易样本。
那么显而易见,难样本有更大的权重
(
1
−
p
t
)
γ
(1-p_t)^\gamma
(1−pt)γ,易样本有更小的权重。
举个例子,当γ=2时, p t = 0.9 p_t=0.9 pt=0.9的样本损失比CELoss的损失要小100倍,大大降低了高置信度样本的影响力。
结合α-balanced的focal loss变体:
F
L
(
p
t
)
=
−
α
t
(
1
−
p
t
)
γ
log
(
p
t
)
FL(p_t)=-\alpha_t(1-p_t)^\gamma\log(p_t)
FL(pt)=−αt(1−pt)γlog(pt)
α
t
\alpha_t
αt和
(
1
−
p
t
)
γ
(1-p_t)^\gamma
(1−pt)γ共同平衡loss的权重,论文作者建议:α=0.25,γ=2.0。
当γ取2时,难样本的权重已经相对较大,再用α=0.25来平衡一下过大的损失。
综上,在focal loss中,α的作用可以理解为不让难样本的权重过大,γ的作用则是不让易样本主导模型的训练。
参考文献
知乎文章,含focal loss和RetinaNet训练细节:读Focal Loss