Focal Loss for Dense Object Detection

3. Focal Loss

Focal损失旨在解决单步检测场景中训练时前景和背景类的极度不平衡问题(比如1:1000)。我们从二元分类的交叉熵(cross entropy, CE)损失开始引入focal损失:

$$ \text{CE}(p,y)=\left\{\begin{array}{ll} {-\text{log}(p)} & {\text{if }y=1} \
{-\text{log}(1-p)} & {\text{otherwise}} \end{array}\right. \tag{1} $$

上述$y\in \{\plusmn 1\}$指定gt类别,$p\in [0,1]$是模型对标签$y=1$的类估计概率,为了符号方便,我们定义$p_{t}$:

$$ p_{t}=\left\{\begin{array}{ll} {p} & {\text{if }y=1} \
{1-p} & {\text{otherwise}} \end{array}\right. \tag{1} $$

并重写$\text{CE}(p,y)=\text{CE}(p_{t})=-\text{log}(p_{t})$。

二分类交叉熵损失的另一种写法: $$ \text{CE}(p,y)=-[y*\text{log}(p)+(1—y)*\text{log}(1-p)] $$

CE损失可以被视为Fig.1中的蓝色曲线。从图中很容易看出,该损失的一个值得注意的特点是,即使是很容易分类($p_{t}>.5$)的例子也会导致不小的幅值的损失。当大量的easy example相加时,这些小的损失会压倒较少的类别。

focal > 我们提出一种新的损失Focal Loss,它在标准的CE准则上增加了一个因子$(1-p_{t})^{\gamma}$,设置$\gamma>0$减少容易分类的样例的相对损失($p_{t}>.5$),使注意力更多集中在难以分类的实例。正如我们的实验将证明的那样,focal损失可以在存在大量简单背景样例的情况下训练出高精度的密集型目标检测器

3.1. Balanced Cross Entropy

解决类不平衡的常用方法是为class 1引入权重因子$\alpha\in[0,1]$,为class -1引入权重因子$1-\alpha$。实际中$\alpha$可能通过相反的类别频率设置,或者被视超参数通过交叉验证(cross validation)的方式设置。为了方便,我们定义$\alpha_{t}$类似于我们定义$p_{t}$,我们将$\alpha$-balance CE损失写为:

$$ \text{CE}(p_{t})=-\alpha_{t}\text{log}(p_{t}). \tag{3} $$

这种损失是对CE的简单扩展,我们认为这是我们提出的focal损失的实验基线。

3.2. Focal Loss Definition

正如我们的实验所表明的那样,在密集型检测器训练过程中遇到的大量类不平衡压倒(overwhelm)CE损失,容易分类的负例包含了大部分损失并主导梯度。虽然$\alpha$平衡了positive/negative examples的重要性,但没有区分easy/hard examples。取而代之,我们建议调整损失函数以减小easy examples的权重,因此将训练集中在hard negatives。

正式而言,我们建议为CE损失增加一个调节因子$(1-p_{t})^{\gamma}$,其中调焦参数(tunable focusing parameter)$\gamma\geq0$,我们将focal损失定义为:

$$ \text{FL}(p_{t})=-(1-p_{t})^{\gamma}\text{log}(p_{t}) \tag{4} $$

上式的完整表达更容易理解: $$ \text{FL}(p,y)=\left\{\begin{array}{l} {-(1-p)^{\gamma}\text{log}(p)} & {\text{if }y=1} \
{-p^{\gamma}\text{log}(1-p)} & {\text{otherwise}} \end{array}\right. $$

Fig.1可视化了$\gamma\in[0,5]$的几个值对应的focal损失,我们注意到了focal损失的两个属性。1. 如果某个例被错误分类而且$p_{t}$很小,调节因子会接近1因而损失不受影响。因为$p_{t}\rarr1$时,调节因子会接近0,分类良好的例子的损失是低权重的。2. 调教参数$\gamma$平滑地调整easy examples权重减少的速率,当$\gamma=0$时,FL等价于CE,随着$\gamma$的增加,调节因子的影响会相应增加(我们发现$\gamma=2$在我们的实验中表现最好)。

直观而言,调节因子减少了easy examples的损失贡献,并扩展了样例获得低损耗的范围。比如,$\gamma=2$时,$p_{t}=0.9$的样例的损失比CE低100倍,$p_{t}=0.968$的损失低1000倍,这反过来又增加了校正被错误分类的样例的重要性(对于$p_{t}\leq0.5$和$\gamma=2$其损失减小了4倍)。

实际中我们使用focal损失的$\alpha$-balanced变种:

$$ \text{FL}(p_{t})=-\alpha_{t}(1-p_{t})^{\gamma}\text{log}(p_{t}). \tag{5} $$

上式的完整表达更容易理解: $$ \text{FL}(p,y)=\left\{\begin{array}{l} {-\alpha(1-p)^{\gamma}\text{log}(p)} & {\text{if }y=1} \
{-(1-\alpha)p^{\gamma}\text{log}(1-p)} & {\text{otherwise}} \end{array}\right. $$

我们在实验中采用这种形式,因为它比non-$\alpha$-balanced形式产生略高的准确性。*最后,我们注意到损失层的实现,通过将用于计算$p$的sigmoid操作和损失计算相结合,会产生更大的数值稳定性*。

虽然在我们的主要实验结果中,我们使用了上述focal损失定义,但是其精确形式并不重要。在附录中,我们考虑了focal损失的其他实例,并证明这些实例同样有效。

3.3. Class Imbalance and Model Initialization

默认情况下,二分类模型为输出$y=-1 or 1$初始化相同的概率。在这种初始化条件下,面对类别不平衡,损失由于被较频繁的类别主导而在训练早期造成不稳定。为了解决此问题,我们针对模型中的稀有类别(前景)所估计的$p$值引入了”先验”的概念。我们用$\pi$表示先验并将其设置为使得模型为稀有类别样例估计的$p$很小,比如0.01。我们注意到这是模型初始化的挑战而不是损失函数的挑战,我们发现这可以提升严重类别不平衡情况下交叉熵损失和focal损失的训练稳定性。

3.4. Class Imbalance and Two-stage Detectors

两步检测器通常用交叉熵损失来训练,而不使用$\alpha$-balanced或我们提出的损失。相应地,他们使用两步机制解决类不平衡问题:1. 两步级联;2. 带偏向的小批次采样。第一个级联阶段是一个目标提议机制,它将接近无限的潜在目标位置减少到一两千。重要的是,所选择的提议不是随机的,而可能对应于真实的目标位置,这消除了绝大多数easy negatives。在训练第二阶段时,带偏向的采样通常用于构造小批次包,其包含例如1:3比例的正反样例,该比例类似于通过采样实现的隐含的α平衡因子。我们提出的focal损失旨在通过损失函数直接在单步检测系统中解决这些机制。

4. RetinaNet Detector