为什么Faster-rcnn、SSD中使用Smooth L1 Loss 而不用Smooth L2 Loss

知乎上的一篇文章说的很详细:https://www.zhihu.com/question/58200555

这个必须看:目标检测回归损失函数简介:SmoothL1/IoU/GIoU/DIoU/CIoU Loss

首先看L1 loss 和 L2 loss 定义:

为什么Faster-rcnn、SSD中使用Smooth L1 Loss 而不用Smooth L2 Loss_第1张图片

 

写成差的形式,f(x) 为预测值, Y 为 groud truth 

 对于L2 Loss:当 x 增大时 L2 损失对 x 的导数也增大。这就导致训练初期,预测值与 groud truth 差异过于大时,损失函数对预测值的梯度十分大,训练不稳定。从下面的形式 L2 Loss的梯度包含 (f(x) - Y),当预测值 f(x) 与目标值 Y 相差很大时(此时可能是离群点、异常值(outliers)),容易产生梯度爆炸

 

 对于L1 Loss:根据方程 (5),L1 对 x 的导数为常数。这就导致训练后期,预测值与 ground truth 差异很小时, L1 损失对预测值的导数的绝对值仍然为 1,而 learning rate 如果不变,损失函数将在稳定值附近波动,难以继续收敛以达到更高精度。

 

 从上面的导数可以看出,L2 Loss的梯度包含 (f(x) - Y),当预测值 f(x) 与目标值 Y 相差很大时,容易产生梯度爆炸,而L1 Loss的梯度为常数,通过使用Smooth L1 Loss,在预测值与目标值相差较大时,由L2 Loss转为L1 Loss可以防止梯度爆炸。

Fast RCNN里提出了Smooth L1 Loss:

  对于smooth  L1 Loss :最后观察公式 (6),smooth L1 在 x 较小时,对 x 的梯度也会变小,而在 x 很大时,对 x 的梯度的绝对值达到上限 1,也不会太大以至于破坏网络参数。

smooth L1 loss在 |x| >1的部分采用了 L1 loss,当预测值和目标值差值很大时, 原先L2梯度里的 (f(x) - Y) 被替换成了 ±1,,这样就避免了梯度爆炸, 也就是它更加健壮。

smooth L1 完美地避开了 L1 和 L2 损失的缺陷。

其函数图像如下:       

 

为什么Faster-rcnn、SSD中使用Smooth L1 Loss 而不用Smooth L2 Loss_第2张图片

 

由图中可以看出,它在远离坐标原点处,图像 和 L1 loss 很接近,而在坐标原点附近,转折十分平滑,不像 L1 loss 有个尖角,因此叫做 smooth L1 loss。

按照作者最正统的解释: 因为回归的targets没有明确的限制,因此可能会出现较大的错误的偏移去主导 loss 的情况,最终造成梯度爆炸,使用 smooth L1 loss 能够更好地避免这种情况。

Smooth L1 Loss结合了L2 Loss收敛更快,且在0点有导数,便于收敛的好处。也在边界区域结合了L1 Loss的好处,让网络对异常值更加robust,能够在偏移值较大时还能拉回来。

Smooth L1 Loss相比于L2 Loss对于离群点、异常值(outliers)更不敏感,或者说是更加鲁棒,可控制梯度的量级使训练时不容易跑飞。(Fast R-CNN中的解释:L1 loss that is less sensitive to outliers than the L2 loss used in R-CNN and SPPnet)。

三个loss 图

为什么Faster-rcnn、SSD中使用Smooth L1 Loss 而不用Smooth L2 Loss_第3张图片

 

你可能感兴趣的:(AI之路,-,Face)