主要是针对类别不平衡设计了初始化和loss函数。
初始时将rare类的prior设置的比较低。
引入了alpha和gamma参数,分别用于平衡正负例和难易例。
设计了RetinaNet检测器来考察以上设置效果。
给定两个概率分布:p(理想结果即正确标签向量)和q(神经网络输出结果即经过softmax转换后的结果向量),则通过q来表示p的交叉熵为:
H ( p , q ) = − ∑ x p ( x ) l o g q ( x ) H(p,q)=−∑_xp(x)logq(x) H(p,q)=−x∑p(x)logq(x)
注意:既然p和q都是一种概率分布,那么对于任意的x,应该属于[0,1]并且所有概率和为1
∀ x , p ( X = x ) ∈ [ 0 , 1 ] 且 ∑ x p ( X = x ) = 1 ∀x,p(X=x)\in[0,1]且∑_xp(X=x)=1 ∀x,p(X=x)∈[0,1]且x∑p(X=x)=1
交叉熵刻画的是通过概率分布q来表达概率分布p的困难程度,其中p是正确答案,q是预测值,也就是交叉熵值越小,两个概率分布越接近。
在本篇论文中,所用的交叉熵公式是二分类的交叉熵,可以类比着上一节的多类别交叉熵进行查看。
C E ( p , y ) = { − l o g ( p ) y = 1 − l o g ( 1 − p ) o t h e r w i s e . CE(p, y)= \begin{cases} −log(p) & y =1\\ −log(1 − p) & otherwise. \end{cases} CE(p,y)={−log(p)−log(1−p)y=1otherwise.
其中 y ∈ { ± 1 } y \in\{±1\} y∈{±1}代表正确类别, p ∈ [ 0 , 1 ] p \in [0, 1] p∈[0,1]代表着模型预测出的y=1的概率。
为了公式的简洁,做如下定义。
p t = { p y = 1 1 − p o t h e r w i s e . p_t =\begin{cases} p& y =1\\ 1-p & otherwise. \end{cases} pt={p1−py=1otherwise.
这样上述的二分类交叉熵公式就可以表示为: 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)
然而这个loss有一个问题:即使有些例子能被很容易的归类( p t ≫ 0.5 p_t\gg 0.5 pt≫0.5),这些例子的loss也不是很小。当把很多的easy例的loss加起来的时候,这些小loss值可能会影响rare类的loss值。
普遍使用的方式是引入权值参数 α ∈ [ 0 , 1 ] \alpha\in [0,1] α∈[0,1],类别1的loss乘上 α \alpha α,类别-1的loss乘上 1 − α 1-\alpha 1−α。实践中 α \alpha α可以被设置为类别频数的逆或者被当作超参数通过交叉验证得到。为了更好的表示,定义了 α t \alpha_t αt。
α t = { α y = 1 1 − α o t h e r w i s e . \alpha_t =\begin{cases} \alpha & y=1\\ 1-\alpha & otherwise. \end{cases} αt={α1−αy=1otherwise.
这样 α − b a l a n c e \alpha-balance α−balance的CE损失就可以表示为:
C E ( p t ) = − α t l o g ( p t ) CE(p_t)=-\alpha_t log(p_t) CE(pt)=−αtlog(pt)
α − b a l a n c e \alpha-balance α−balance的CE损失在一定程度上处理了类别数量不平衡,但是其没有平衡easy例和hard例。也就是大量的概率高的easy例会占了loss中的大部分,从而主导了梯度。所以本文引入了参数来降低easy例的权重,从而更集中训练hard negatives.。
引入了调节参数 ( 1 − p t ) γ , γ ≥ 0 (1-p_t)^\gamma, \gamma\ge 0 (1−pt)γ,γ≥0。定义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)
focal loss的可视化如图, γ \gamma γ使得被很好分类的实例的loss降低,从而能更加关注不好分类的实例的训练。当一个实例被误分类,那么其 p t p_t pt会很小,那么调节参数 ( 1 − p t ) γ (1-p_t)^\gamma (1−pt)γ接近于1,所以此时loss几乎不受影响。 γ \gamma γ很好的调节了easy例被降低权重的比例。(在实验中 γ = 2 \gamma=2 γ=2效果最好)
在实验中使用 α − b a l a n c e \alpha-balance α−balance的focal loss:
F L ( p t ) = − α t ( 1 − p t ) γ l o g ( p t ) FL(p_t)=-\alpha_t(1-p_t)^\gamma log(p_t) FL(pt)=−αt(1−pt)γlog(pt)
二分类模型默认被初始化为y=-1和1的类别有相同的初始概率。然而由于类别不平衡,整体的loss会被比较多的类别主导。所以引入了“prior”概念来表示在训练初始化时rare类的概率,用 π \pi π表示。初始时将rare类的 π \pi π设置的比较低。(此处我理解是将概率设置的比较低之后,loss就会相应变大,从而使得rare类更加主导训练过程。不是十分确定)
检测器的结构如图,由backbone网络和两个subnet组成,backbone用于得到特征图,两个自网络分别用于目标分类和候选框回归(矫正)。
其中backbone由ResNet+FPN组成。结构如下:
这个结构和Feature pyramid networks for object detection一文中有些不同,然而具体是哪里不同并不是此文的重点,所以不在此赘述。
在本文中,利用P3、P4、P5、P6、P7层得到的金字塔特征图,图中的C1到C5分别是ResNet的5个阶段的最后一层输出,圆圈之间进行的是2x上采样。(附录中有ResNet的网络结构,如果不理解C1到C5是什么,可以看一下那个网络结构。)每个金字塔层都有 C = 256 C=256 C=256个通道。
每层的特征图(P3到P7)共享参数,但是和候选框回归网络不共享参数。在实验中设置通道数C=256,每个位置锚框数A=9,目标类别数K。
为每个位置的A=9个锚框生成4个回归结果,这部分和RCNN系列相似。如果想要了解原理可以看一文读懂Faster RCNN的2.4节bounding box regression原理。
参考: