首发于机器学习

损失函数:L1 loss, L2 loss, smooth L1 loss

对于大多数CNN网络,我们一般是使用L2-loss而不是L1-loss,因为L2-loss的收敛速度要比L1-loss要快得多。

对于边框预测回归问题,通常也可以选择平方损失函数(L2损失),但L2范数的缺点是当存在离群点(outliers)的时候,这些点会占loss的主要组成部分。比如说真实值为1,预测10次,有一次预测值为1000,其余次的预测值为1左右,显然loss值主要由1000主宰。所以FastRCNN采用稍微缓和一点绝对损失函数(smooth L1损失),它是随着误差线性增长,而不是平方增长。

注意:smooth L1和L1-loss函数的区别在于,L1-loss在0点处导数不唯一,可能影响收敛。smooth L1的解决办法是在0点附近使用平方函数使得它更加平滑。

公式比较

L2 loss

\begin{equation} \begin{array}{lc}  L_2=\left| f(x)-Y \right|^2 \\ L_2^{'}= 2f^{'} (x)(f(x)-Y) \end{array} \end{equation}   ……………………………………………… (1)


L1 loss

\begin{equation} \begin{array}{lc}  L_1=\left| f(x)-Y \right| \\ L_1^{'}= \pm f^{'}(x) \end{array} \end{equation}   ……………………………………………… (2)

Smooth L1 loss

\begin{equation} \begin{array}{lc}  Smooth\quad L_1=  \begin{array}{lc}  0.5 x^2, \quad\left| x \right|<1 \\ \left| x \right|-0.5, \quad x<-1 \, or \, x>1 \end{array} \\ \\ Smooth\quad L_1^{'}= \begin{array}{lc}   x, \quad \left| x \right|<1 \\ -1, \quad x<-1 \\ 1, \quad x>1 \end{array}  \end{array} \end{equation} ………………………… (3)


Smooth L1 vs L2


根据fast rcnn的说法,"...... L1 loss that is less sensitive to outliers than the L2 loss used in R-CNN and SPPnet." 也就是smooth L1 loss让loss对于离群点更加鲁棒,即:相比于L2损失函数,其对离群点、异常值(outlier)不敏感,梯度变化相对更小,训练时不容易跑飞。

编辑于 2018-11-03

文章被以下专栏收录