Gradient Harmonized Single-stage Detector
摘要
GHM( gradient harmonizing mechanism)的提出是为了解决单阶段检测器存在的正负样本和难易样本间差异巨大的问题。本文指出这种差异可以用梯度进行衡量,并据此提出了梯度平衡的机制GHM,该模块可以嵌入分类损失(GHM-C)和边框回归损失(GHM-R)中,从而达到平衡梯度流的作用。与Focal loss+soft L1相比COCO数据集mAP提高了0.8。
介绍
类别不平衡可以归为难易不平衡,难易不平衡可以归为梯度范数分布不平衡。所以类别(pos/neg)、难易(easy/hard)分布不平衡可以统称为属性(attribute)分布不平衡。
此外,梯度范数的分布暗示了不同属性(hard/easy和pos/neg)的样本的不均衡性。
梯度密度曲线如上图所示,横坐标是梯度的范数,纵坐标是样本数量,从图中可以看出,梯度范数小的简单负样本的数量要远多于梯度范数大的困难正样本的数量,这样即使对于单个样本而言简单负样本的梯度要小于困难正样本,但在如此多的数量的积累下也会是训练变得不充分。此外,我们还发现梯度范数非常大的样本(非常难的样本)的密度略大于中等的样本的密度。我们把这些非常困难的样本看作是离群值,因为即使在模型收敛的情况下它们也会稳定地存在。由于离群值的梯度可能与其他常见的样本有较大的差异,因此可能会影响模型的稳定性。
梯度协调机制
问题描述
设分类分支的输出为 x x x,则分类概率 p = S ( x ) p=S(x) p=S(x),其中 S ( x ) S(x) S(x)是 S i g m o i d Sigmoid Sigmoid 激活函数。设分类的 G r o u n d T r u t h Ground Truth GroundTruth 为 p ∗ ∈ { 0 , 1 } p^*\in{\{0, 1\}} p∗∈{0,1}
分类交叉熵损失为:
L
C
E
(
p
,
p
∗
)
=
−
(
p
∗
×
l
o
g
(
p
)
+
(
1
−
p
∗
)
×
l
o
g
(
1
−
p
)
)
{L_{CE}}(p, p^*)=-(p^*\times log(p)+(1-p^*)\times log(1-p))
LCE(p,p∗)=−(p∗×log(p)+(1−p∗)×log(1−p))
从而有:
g
=
∣
∂
L
C
E
∂
x
∣
=
∣
p
−
p
∗
∣
g=|\frac{\partial{L_{CE}}}{\partial x}|=|p-p^*|
g=∣∂x∂LCE∣=∣p−p∗∣
g
g
g 的值代表了一个样本的属性(例如容易或困难),并暗示了这个样本对全局梯度的影响。虽然梯度的严格定义是在整个参数空间上的,也就是说
g
g
g 是一个样本梯度的相对范数,但为了方便起见,本文将
g
g
g 称为梯度范数。
上图展示的是一个收敛模型的梯度范数
g
g
g 分布曲线,可以看出,非常简单的样本的数量是非常大的,这对全局梯度有很大的影响。此外,我们可以看到,收敛模型仍然不能处理一些非常困难的样本,这些样本的数量甚至大于中等难度的样本。这些非常难的样本可以看作是离群值,因为它们的梯度方向与其他大量样本的梯度方向相差很大。也就是说,如果收敛的模型被迫学会更好地对这些离群值进行分类,那么对大量其他样本的分类就会变得不那么准确。
梯度密度
g
g
g 点的梯度密度定义为梯度范数落入以
g
g
g 为中心,长度为
ϵ
\epsilon
ϵ 的区间内的样本的数量,并用区间的实际长度进行归一化:
G
D
(
g
)
=
1
l
ϵ
(
g
)
∑
k
=
1
N
δ
ϵ
(
g
k
,
g
)
GD(g)=\frac{1}{l_\epsilon(g)}\sum_{k=1}^N\delta_\epsilon(g_k,g)
GD(g)=lϵ(g)1k=1∑Nδϵ(gk,g)
δ
ϵ
(
g
k
,
g
)
=
{
1
if
g
−
ϵ
2
≤
g
k
<
g
+
ϵ
2
0
otherwise
\delta_\epsilon(g_k,g)=\begin{cases} 1& \text{if $g-\frac{\epsilon}{2}\leq g_k < g+\frac{\epsilon}{2}$} \\ 0& \text{otherwise}\end{cases}
δϵ(gk,g)={10if g−2ϵ≤gk<g+2ϵotherwise
l
ϵ
(
g
)
=
m
i
n
(
g
+
ϵ
2
,
1
)
−
m
a
x
(
g
−
ϵ
2
,
0
)
l_\epsilon(g)=min(g+\frac{\epsilon}{2},1)-max(g-\frac{\epsilon}{2},0)
lϵ(g)=min(g+2ϵ,1)−max(g−2ϵ,0)
现在我们将梯度密度调和参数定义为:
β
i
=
N
G
D
(
g
i
)
=
1
G
D
(
g
i
)
/
N
\beta_i=\frac{N}{GD(g_i)}=\frac{1}{GD(g_i)/N}
βi=GD(gi)N=GD(gi)/N1
其中
N
N
N 是样本总数,
G
D
(
g
i
)
/
N
GD(g_i)/N
GD(gi)/N 是梯度范数密度,上式表明,密度大的例子将被归一化器相对向下加权。
GHM-C损失
L
G
H
M
−
C
=
1
N
∑
i
=
1
N
β
i
L
C
E
(
p
i
,
p
i
∗
)
=
∑
i
=
1
N
L
C
E
(
p
i
,
p
i
∗
)
G
D
(
g
i
)
L_{GHM-C}=\frac{1}{N}\sum_{i=1}^N\beta_iL_{CE}(p_i, p_i^*) =\sum_{i=1}^N\frac{L_{CE}(p_i, p_i^*)}{GD(g_i)}
LGHM−C=N1i=1∑NβiLCE(pi,pi∗)=i=1∑NGD(gi)LCE(pi,pi∗)
如上图所示,最佳参数配置的Focal Loss的梯度范数的密度趋势与GHM-C Loss相似,但GHM-C还具备一个Focal Loss忽略了的特征,即对离群点的梯度贡献进行降低权重的处理。
在我们的GHM-C损失中,大量非常简单的样本大部分是向下加权的,离群值也略微向下加权,这同时解决了属性不平衡问题和离群值问题。
从上图中可以看出,GHM-C协调了不同样本组的总梯度贡献。由于在每次迭代中都对梯度密度进行了计算,因此与Focal Loss不同,GHM-C的权重不是固定的,而是根据当前模型的状态和小批量数据进行动态调整的。GHM-C损失的动态特性使得训练更加有效和健壮。
Unit Region Approximation
复杂度分析
现在来回顾一下梯度范数调和系数 β i \beta_i βi的计算过程,首先模型输入一批N个样本,这里的样本指的是Anchors,N=图片数量*每张图片的预置Anchor数量,然后对于每个样本 a n c h o r i anchor_i anchori可以计算得到它的梯度范数 g i g_i gi,将计算得到的梯度范数g进行排序,然后按规定的区间长度 ϵ \epsilon ϵ计算各样本对应的梯度范数调和系数 β i \beta_i βi,总的复杂度为排序算法的 O ( N l o g N ) O(NlogN) O(NlogN)和逐个计算调和系数的 O ( N ) O(N) O(N)。可以看出直接计算梯度密度比较费时。因此,我们引入了另一种方法来近似地获得样本的梯度密度。
单位区域
我们将
g
g
g 的取值区间划分为长度为
ϵ
\epsilon
ϵ 的单位区间,则这样的单位区间有
M
=
1
ϵ
M=\frac{1}{\epsilon}
M=ϵ1 个,我们将第
j
j
j 个单位区间记为
r
j
=
[
(
j
−
1
)
ϵ
,
j
ϵ
)
r_j=[(j-1)\epsilon,j\epsilon)
rj=[(j−1)ϵ,jϵ),用
R
j
R_j
Rj 表示位于区间
r
j
r_j
rj 的样本数量,我们用方程
i
n
d
(
g
)
=
t
s
.
t
.
(
t
−
1
)
ϵ
≤
g
<
t
ϵ
ind(g)=t \space \space s.t. \space (t-1)\epsilon\le g<t\epsilon
ind(g)=t s.t. (t−1)ϵ≤g<tϵ 计算
g
g
g 所在的单位区间的序号,然后我们就可以将近似的梯度密度定义为:
G
D
^
(
g
)
=
R
i
n
d
(
g
)
ϵ
=
R
i
n
d
(
g
)
M
\hat{GD}(g)=\frac{R_{ind(g)}}{\epsilon}=R_{ind(g)}M
GD^(g)=ϵRind(g)=Rind(g)M
然后,我们有近似计算的梯度密度调和参数:
β
^
i
=
N
G
D
^
(
g
i
)
\hat{\beta}_i=\frac{N}{\hat{GD}(g_i)}
β^i=GD^(gi)N
最终GHM-C损失的计算如下:
L
^
G
H
M
−
C
=
1
N
∑
i
=
1
N
β
^
i
L
C
E
(
p
i
,
p
i
∗
)
=
∑
i
=
1
N
L
C
E
(
p
i
,
p
i
∗
)
G
D
^
(
g
i
)
\hat{L}_{GHM-C}=\frac{1}{N}\sum_{i=1}^N\hat{\beta}_iL_{CE}(p_i,p_i^*)=\sum_{i=1}^N\frac{L_{CE}(p_i,p_i^*)}{\hat{GD}(g_i)}
L^GHM−C=N1i=1∑Nβ^iLCE(pi,pi∗)=i=1∑NGD^(gi)LCE(pi,pi∗)
指数移动平均(EMA)
基于小批量统计的方法通常面临这样一个问题:当许多极端数据出现在同一个小批量中时,统计结果会产生严重的噪声,训练也会不稳定。指数移动平均(EMA)是解决这一问题的常用方法。由于在近似算法中梯度密度来自于单位区域的样本数量,我们可以在每个单位区域上应用EMA来获得更稳定的样本梯度密度。用
R
j
(
t
)
R_j^{(t)}
Rj(t) 表示第
t
t
t 次迭代的第
j
j
j 个单位区域内的样本数量,
S
j
(
t
)
S_j^{(t)}
Sj(t) 表示移动平均数,则
S
j
(
t
)
=
α
S
j
(
t
)
+
(
1
−
α
)
R
j
(
t
)
S_j^{(t)}=\alpha S_j^{(t)}+(1-\alpha)R_j^{(t)}
Sj(t)=αSj(t)+(1−α)Rj(t)
其中
α
\alpha
α 是动量参数,然后我们用移动平均数
S
j
S_j
Sj来代替
R
j
R_j
Rj计算梯度密度:
G
D
^
(
g
)
=
S
i
n
d
(
g
)
ϵ
=
S
i
n
d
(
g
)
M
\hat{GD}(g)=\frac{S_{ind(g)}}{\epsilon}=S_{ind(g)}M
GD^(g)=ϵSind(g)=Sind(g)M
使用EMA,梯度密度将更加平滑,达到对极端数据脱敏的目的。
GHM-R 损失
设边界框回归分支预测的编码后的边界框的偏移量为
t
=
(
t
x
,
t
y
,
t
w
,
t
h
)
t=(t_x,t_y,t_w,t_h)
t=(tx,ty,tw,th),由
g
r
o
u
n
d
−
t
r
u
t
h
ground-truth
ground−truth计算的目标偏移量为
t
∗
=
(
t
x
∗
,
t
y
∗
,
t
w
∗
,
t
h
∗
)
t^*=(t_x^*,t_y^*,t_w^*,t_h^*)
t∗=(tx∗,ty∗,tw∗,th∗),则
S
m
o
o
t
h
L
1
Smooth \space L_1
Smooth L1损失方程为:
L
r
e
g
=
∑
i
∈
{
x
,
y
,
w
,
h
}
S
L
1
(
t
i
−
t
i
∗
)
L_{reg}=\sum_{i\in{\{x, y,w,h\}}}SL_1(t_i-t_i^*)
Lreg=i∈{x,y,w,h}∑SL1(ti−ti∗)
S
L
1
(
d
)
=
{
d
2
2
δ
if
∣
d
∣
≤
δ
∣
d
∣
−
2
δ
otherwise
SL_1(d)=\begin{cases} \frac{d^2}{2\delta} &\text{if $|d|\le \delta$}\\ |d|-2\delta& \text{otherwise}\end{cases}
SL1(d)={2δd2∣d∣−2δif ∣d∣≤δotherwise
其中,
δ
\delta
δ 是二次部分和线性部分之间的分割点,通常在实践中设置为1/9。
因此,Smooth L1损失相对于
t
i
t_i
ti的损失计算如下:
∂
S
L
1
∂
t
i
=
∂
S
L
1
∂
d
∂
d
∂
t
i
=
{
d
δ
if
∣
d
∣
≤
δ
s
g
n
(
d
)
otherwise
\frac{\partial SL_1}{\partial t_i}=\frac{\partial SL_1}{\partial d}\frac{\partial d}{\partial t_i}=\begin{cases}\frac{d}{\delta}&\text{if $|d|\le \delta$}\\ sgn(d)&\text{otherwise}\end{cases}
∂ti∂SL1=∂d∂SL1∂ti∂d={δdsgn(d)if ∣d∣≤δotherwise
其中,
d
=
(
t
i
−
t
i
∗
)
d=(t_i-t_i^*)
d=(ti−ti∗),
s
g
n
sgn
sgn 是符号方程。
注意,所有 ∣ d ∣ > δ |d|>\delta ∣d∣>δ 的样本将具有统一的梯度范数 1 1 1,这使得依据梯度范数来区分具有不同特征(正负/难易)的样本变得不可能,一个替代想法是用 ∣ d ∣ |d| ∣d∣来表示梯度范数,但是 ∣ d ∣ |d| ∣d∣的取值理论上可达正无穷,这使得梯度密度单位区域的近似算法无法使用。
为了将GHM应用于回归损失,需要对原始的Smooth L1 损失进行改进,使其梯度范数的取值在0-1之间,从而可以用单位区域的近似算法来计算梯度密度。改进后的回归损失
A
S
L
1
ASL_1
ASL1损失的计算如下:
A
S
L
1
(
d
)
=
d
2
+
μ
2
−
μ
ASL_1(d)=\sqrt{d^2+\mu^2}-\mu
ASL1(d)=d2+μ2−μ
Smooth L1 Loss
Authentic Smooth L1 Loss
从图中可以看出ASL1 loss和SL1 loss的特性相近,当d取值小时,它近似于L2 loss,当d取值大时,它近似于L1 loss。与SL1相比,ASL1更加光滑(具有各阶导数)并且ASL1梯度的形式更加优雅:
∂
A
S
L
1
∂
d
=
d
d
2
+
μ
2
\frac{\partial ASL_1}{\partial d}=\frac{d}{\sqrt{d^2+\mu^2}}
∂d∂ASL1=d2+μ2d
可以看出梯度的取值范围为
[
0
,
1
)
[0,1)
[0,1),因此计算回归损失ASL1的梯度密度就和计算分类损失LCE的梯度密度一样简单。实际中我们设置
μ
=
0.02
\mu=0.02
μ=0.02来保持与Smooth L1 Loss表现的一致。
我们将ASL1的梯度范数定义为 g r = ∣ d d 2 + μ 2 ∣ gr=|\frac{d}{\sqrt{d^2+\mu^2}}| gr=∣d2+μ2d∣,收敛模型的梯度分布如下图所示:
可以看出存在大量离群样本,值得注意的是,回归只对正例进行回归,所以分类和回归的分布趋势不同是合理的。
基于此,GHM-R 损失的定义如下:
L
G
H
M
−
R
=
1
N
∑
i
=
1
N
β
i
A
S
L
1
(
d
i
)
=
∑
i
=
1
N
A
S
L
1
(
d
i
)
G
D
(
g
r
i
)
L_{GHM-R}=\frac{1}{N}\sum_{i=1}^N\beta_iASL_1(d_i)=\frac{\sum_{i=1}^NASL_1(d_i)}{GD(gr_i)}
LGHM−R=N1i=1∑NβiASL1(di)=GD(gri)∑i=1NASL1(di)
各损失的梯度贡献如下图所示:
上图的横坐标为
∣
d
∣
|d|
∣d∣,我们强调,在框回归中,并非所有“简单的样本”都是不重要的。一个简单的分类样本通常是预测概率非常低的背景区域,它肯定会被排除在最终候选区域之外。因此这类样本的改进对精度几乎没有贡献。但在框回归中,一个简单的样本仍然有对ground-truth位置的偏差。任何样本的更好预测都将直接提高最终候选框的质量。我们的GHM-R损失可以协调简单样本和困难样本对箱型回归的贡献,方法是增加简单样本中重要部分的权重,降低离群样本的权重。实验表明,该算法的性能优于SL1和ASL1。
实验部分
数据集
使用COCO2014数据集,划分为:
- trainval35k:80k(the whole training set)+35K(from the 40k validation set)张图像,用于训练。
- minival:5k张图像(from the 40k validation set),用于消融实验。
- test-dev:用于汇报主要的实验结果。
实施细节
网络设置:
- 网络结构:RetinaNet+ResNet+FPN
- Anchor设置:为了方便与Focal Loss进行对比,使用3 scales 和 3 aspect ratios
- 输入图像尺寸:800 pixels
- Backbone:所有消融实验使用ResNet-50,最终test-dev汇报使用ResNeXt-101
- 专门的偏置初始化:Focal Loss需要,我们的不需要。
优化:
- 优化算法:SGD
- Batch Size:8 GPU,2 imgs/GPU,Batch Size = 16
- Schedule:初始学习率设为0.01,在第9和第12个epoch学习率分别下降为原来的0.1倍,共训练14个epochs,权重衰减设为0.0001,动量设为0.9
- 数据增强:图像水平翻转
- 移动平均算法动量参数设置: α = 0.75 \alpha=0.75 α=0.75