一、为什么改进交叉熵?
Single stage detector不好的原因完全在于:
- 极度不平衡的正负样本比例: anchor近似于sliding window的方式会使正负样本接近1000:1,而且绝大部分负样本都是easy example,
- 这就导致下面一个问题:gradient被easy example dominant的问题:往往这些easy example虽然loss很低,但由于数量众多,对于loss依旧有很大贡献,从而导致收敛到不够好的一个结果。
作者认为one-stage和two-stage的表现差异主要原因是大量前景背景类别不平衡导致。
- 在双阶段算法中,在候选框阶段,通过得分和nms筛选过滤掉了大量的负样本,然后在分类回归阶段又固定了正负样本比例,或者通过OHEM在线困难挖掘使得前景和背景相对平衡。
- 而one-stage阶段需要产生约100k的候选位置,虽然有类似的采样,但是训练仍然被大量负样本所主导。
所以作者改进了交叉熵,解决one-stage目标检测中正负样本比例严重失衡的问题。该损失函数降低了大量简单负样本在训练中所占的权重,也可理解为一种困难样本挖掘。
二、以往的交叉熵损失函数
Focal loss是在交叉熵损失函数基础上进行的修改,首先回顾二分类交叉上损失:
L
=
−
y
l
o
g
y
^
−
(
1
−
y
)
l
o
g
(
1
−
y
^
)
=
{
−
l
o
g
(
y
^
)
y=1
−
l
o
g
(
1
−
y
^
)
y=0
L = -y log \hat{y}-(1-y)log(1-\hat{y})=\begin{cases} -log( \hat{y})& \text{y=1}\\ -log(1-\hat{y})& \text{y=0} \end{cases}
L=−ylogy^−(1−y)log(1−y^)={−log(y^)−log(1−y^)y=1y=0
其中
y
∈
0
,
1
y∈{0,1}
y∈0,1 是真实标签,
y
^
\hat{y}
y^是预测值。
可见普通的交叉熵对于正样本而言,输出概率越大损失越小。对于负样本而言,输出概率越小则损失越小。此时的损失函数在大量简单样本的迭代过程中比较缓慢且可能无法优化至最优。
三、Focal loss的改进
L
=
{
−
α
(
1
−
y
^
)
γ
l
o
g
(
y
^
)
y=1
−
(
1
−
α
)
y
^
γ
l
o
g
(
1
−
y
^
)
y=0
L =\begin{cases} -\alpha (1-\hat{y})^{\gamma}log( \hat{y})& \text{y=1}\\ -(1-\alpha){\hat{y}}^{\gamma}log(1-\hat{y})& \text{y=0} \end{cases}
L={−α(1−y^)γlog(y^)−(1−α)y^γlog(1−y^)y=1y=0
α
=
0.25
\alpha = 0.25
α=0.25
γ
=
2
\gamma = 2
γ=2
首先在原有的基础上加了一个因子,其中gamma>0使得减少易分类样本的损失。使得更关注于困难的、错分的样本。
- 例如gamma为2,对于正类样本而言,预测结果为0.95肯定是简单样本,所以(1-0.95)的gamma次方就会很小,这时损失函数值就变得更小。
- 对于正类样本而言,预测结果为0.1肯定是困难样本,所以(1-0.1)的gamma次方就会很大,这时损失函数值就变得更大。
- 对于负类样本而言同样,预测0.1的结果应当远比预测0.7的样本损失值要小得多。
- 所以更加关注于这种难以区分的样本。这样减少了简单样本的影响。
加入平衡因子alpha
注意在他的任务中,正样本是属于少数样本,也就是说,本来正样本难以“匹敌”负样本,但经过加入gamma的“操控”后,也许形势还逆转了,还要对正样本降权。
这是因为加入了gamma因子,使得正样本的损失变大了很多,负样本虽然很多个,但是损失还是相对减少了,所以需要加入平衡因子alpha=0.25,来调节一下正负样本损失。