Gradient Harmonizing Mechanism (AAAI 2019)
文章
Focal Loss之后又一篇针对one-stage detector中的imbalance问题发起挑战的论文。文章中方法与Focal Loss相同的地方在于会减小简单样本对于模型的梯度影响,但也有两个地方与Focal Loss不一样:1.针对过于困难的样本(即本文所说的gradient norm过大),该方法认为其实是outlier,也要减小梯度对模型的影响;2.不局限与对cross entropy的改进,还扩展到了regression部分的loss。

从上图可以看到,当模型converged时,很多样本的梯度是接近0(简单)的,也有挺多的样本梯度还比较大(困难),由于CE不对简单样本的梯度做抑制,所以由于简单样本的数量巨大,导致最后简单样本的grad norm之和会很大,主导了模型的训练,但这对模型其实并没有太大意义。Focal Loss则主动减小了简单样本的梯度,从而使模型更注重其它样本的训练,从而提升了性能。而本文的方法就是,希望每种难度的样本影响都能比较均衡,具体方法如下。
对于分类交叉熵损失,文章首先定义了loss关于输出x的gradient norm:

文章认为g代表了某个样本对于模型训练的影响,g越大,该样本对模型的训练影响也就越大。接下来就是本文的核心概念,gradient density:


其中N是本轮样本总数目,其实GD就代表了某个梯度g的一个邻域内的样本数目,那么接下来其实大家都能想到怎么做了,如果某块儿梯度的样本比较多,那么就应该减小这一部分梯度的大小,以减小它们共同带来的影响,所以得到一个harmonizing parameter

于是原本的CE损失就变成了:

但有一个问题是如果对每个样本都要单独求一个grad density的话,计算量是在太大了,因为对于one-stage detector来说,每轮的训练样本是非常多的(一个anchor就对应一个训练样本),因此文章采用了一种近似的方法:先将grad norm的取值区间(0,1)划分成几等份,然后grad norm位于相同range的样本梯度使用相同参数进行条件,而这个参数又由该range内的grad density决定,因此现在只需要进行一次排序和几个除法的时间复杂度就ok了,具体如下:


然后一个要注意的是,在统计每个range内的样本数目的时候,文章使用了exponential moving average方法来使得gradient density更加stable:


接着是将这个动态调节样本梯度的方法引入了regression,首先文章认为一般采用的smooth L1损失对于loss大一些的样本无法进行难度的区分,因为他们的grad norm都是1了,因此作者新设计了一个authentic smooth L1损失

和SL1相比如下图

其实还是比较像,但是在error较大时,样本之间仍然有区分性,然后继续像分类一样进行调节系数的计算就行了。
最后是一些实验结果

上表说明了本文的方法在精度上带来了提升,同时使用了近似方法之后可以不增加太多训练的时间。然后是下表和Focal Loss的比较,也是有一定提升的

其它的一些实验结果,有兴趣的朋友可以参考原论文。