何为损失函数

常见的损失函数

均方差(MSE)损失(Mean Squared Error Loss)

均方差(MSE)损失是机器学习、深度学习回归任务中最常用的一种损失函数,也称为L2 Loss,它是模型预测值 y^\hat y 与真实样本值 yy 之间差值的平方和。

L2(x)=(yy^)2L_2(x)=(y-\hat y)^2

JMSE=1Ni=1N(yiy^i)2J_{MSE}=\frac{1}{N}\sum_{i=1}^{N}(y_i-\hat y_i)^2

令 n=1,以yy^y-\hat y为横轴,MSE值为纵轴,得函数图形如下:

可见MSE函数曲线光滑连续且处处可导,便于使用梯度下降算法,并且随着误差的减小,梯度也在减小,有利于收敛。

由平方项可知,当 yy^<1y-\hat y < 1,MSE给予较小的惩罚,缩小误差;当 yy^>1y-\hat y > 1,MSE给予较大的惩罚,放大误差;可知MSE对离群点比较敏感,受其影响较大。

如果样本中存在离群点,MSE会给离群点更高的权重放大误差,这就会牺牲其他正常点数据的预测效果,最终降低整体的模型性能。如图:

平均绝对误差(MAE)损失(Mean Absolute Error Loss)

平均绝对误差(MAE)是另一种常用的回归损失函数,它是模型预测值 y^\hat y 与真实样本值 yy 之差绝对值的和,表示了预测值的平均误差幅度,而不需要考虑误差的方向,范围是0到∞,其公式如下所示:

L2(x)=yy^L_2(x)=\vert y-\hat y \vert

JMAE=1Ni=1Nyiy^iJ_{MAE}=\frac{1}{N}\sum_{i=1}^{N}\vert y_i-\hat y_i \vert

令 n=1,以yy^y-\hat y为横轴,MAE值为纵轴,得函数图形如下:

可见MAE函数曲线连续呈线性增长,但是在yy^=0y-\hat y = 0 处不可导,其他地方梯度值为常数,具有一定的稳定性,不会导致梯度爆炸问题,具有较为稳健性的解。

MAE 对于不同的差值惩罚是固定的,因此对离群点不太敏感,受离群点的影响小。如图:

MSE和MAE的选择

  • 从梯度的求解以及收敛上,MSE 是优于 MAE 的。MSE处处可导,而且梯度值也是动态变化的,能够快速的收敛;而 MAE 在 0 点处不可导,且其梯度保持不变。对于很小的损失值其梯度也很大,在深度学习中,需要使用变化的学习率,在损失值很小时降低学习率。
  • 对离群点需要处理时,MAE 优于 MSE。
L1 Loss L2 Loss
鲁棒性好 鲁棒性差
不稳定解 稳定解
可能多个解 唯一解

(1)鲁棒性
L1 Loss 之所以是鲁棒的,是因为它能处理数据中的异常值。这或许在那些异常值可能被安全地和有效地忽略的研究中很有用。如果需要考虑任一或全部的异常值,那么 L1 Loss 是更好的选择。
L2 Loss将误差平方化(误差大于1,会放大误差;误差小于1,会缩小误差),因此如果某个样本为异常值,模型就需要调整以适应某个的异常值,这会牺牲许多原来正常的样本,因为这些正常样本的误差比这个异常值的误差小得多。

(2)稳定性
L1 Loss 的不稳定性意味着对于数据集的一个小的水平方向的波动,回归线也许会跳跃很大(如,在转折点处求导)。在一些数据结构上,该方法有许多连续解;但是,对数据集的一个微小移动,就会跳过某个数据结构在一定区域内的许多连续解。在跳过这个区域内的解后,最小绝对值偏差线可能会比之前的线有更大的倾斜。
相反地,L2 Loss 的解是稳定的,因为对于一个数据点的任何微小波动,回归线总是只会发生轻微移动;也就说,回归参数是数据集的连续函数。

Smooth L1 Loss

Smooth L1 Loss 将 L1 原来的折点附近处进行光滑,在Faster R-CNN以及SSD中对边框的回归使用的损失函数都是Smooth L1。

SmoothL1(x)={0.5x2x<1x0.5otherwiseSmoothL_1(x)=\begin{cases} 0.5x^2 & \vert x \vert <1 \\[2ex] \vert x \vert -0.5 & otherwise \end{cases}

$ x=y-\hat y$ 为真实样本值 yy 与模型预测值 y^\hat y 之差

smooth L1损失函数曲线如下图所示,作者这样设置的目的是想让loss对于离群点更加鲁棒,相比于L2损失函数,其对离群点(指的是距离中心较远的点)、异常值(outlier)不敏感,可控制梯度的量级使训练时不容易跑飞。

损失函数对x求导

其中 x 为预测框与ground truth之间的差异:

L2(x)=x2L2(x)x=2xL_2(x)=x^2 \\[2ex] \frac{\partial L_2(x)}{\partial x}=2x

当 x 增大时,L2 Loss的损失也增大, 这就导致在训练初期,预测值与 groud truth 差异过于大时,损失函数对预测值的梯度十分大。

L1(x)=xL1(x)x={1x>01otherwiseL_1(x)=\vert x \vert \\[2ex] \frac{\partial L_1(x)}{\partial x}=\begin{cases}1 & x>0 \\[2ex] -1 & otherwise \end{cases}

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

SmoothL1(x)x={xx<1±1otherwise\frac{\partial SmoothL_1(x)}{\partial x}=\begin{cases} x & \vert x \vert <1 \\[2ex] \pm 1 & otherwise \end{cases}

Smooth L1,在 x<1\vert x \vert <1 时,梯度随着 x\vert x \vert 变小而变小。 而当x>1\vert x \vert > 1 时,对 xx 的梯度的上限为1,也不会太大以至于破坏网络参数。Smooth L1 完美的避开了 L1 Loss 和L2 Loss 作为损失函数的缺陷。

Huber Loss

Lδ(y,f(x))={12(yf(x))2yf(x)δδyf(x)12δ2yf(x)>δL_{\delta}(y,f(x))=\begin{cases}\frac{1}{2}(y-f(x))^2 & \vert y-f(x) \vert \leq \delta \\[2ex] \delta \vert y-f(x) \vert -\frac{1}{2} \delta^2 &\vert y-f(x) \vert > \delta \end{cases}

Huber Loss 是 L1 Loss 和 L2 Loss 两者的结合,在误差很小的时候采用平方误差,误差很大的时候采用绝对误差,这个分界点由超参数 δ\delta 来控制。

误差损失在 [0δ,0+δ][0-\delta,0+\delta] 之间时,Huber 等价为 MSE;误差损失在 (,δ)(δ,+)(-\infty,\delta)和(\delta,+\infty) 之间时 Huber 等价为 MAE;这样,当误差较大时,使用MAE对离群点不那么敏感;在误差较小时使用MSE,能够快速的收敛;

Smooth L1其实就是Huber Loss 的特殊情况,可以看作超参数 δ=1\delta=1 的Huber函数。。

Log-Cosh Loss

L(y,y^)=i=1nlog(cosh(y^iyi))L(y,\hat y)=\sum_{i=1}^{n}log(cosh(\hat y_i-y_i))

Log-Cosh Loss 是比 L2 Loss 更光滑的损失函数,是误差值的双曲余弦的对数。

对于较小的误差 $\vert y-f(x) \vert $ ,其近似于MSE,收敛下降较快;对于较大的误差$\vert y-f(x) \vert 其近似等于其近似等于\vert y-f(x) \vert -log(2)$,类似于MAE,不会受到离群点的影响。 Log-Cosh具有Huber 损失的所有有点,且不需要设定超参数。

相比于 Huber,Log-Cosh 求导比较复杂,计算量较大,在深度学习中使用不多。不过,Log-Cosh处处二阶可微,这在一些机器学习模型中,还是很有用的。例如 XGBoost,就是采用牛顿法来寻找最优点。而牛顿法就需要求解二阶导数(Hessian)。因此对于诸如 XGBoost 这类机器学习框架,损失函数的二阶可微是很有必要的。但 Log-cosh 损失也并非完美,其仍存在某些问题。比如误差很大的话,一阶梯度和 Hessian 会变成定值,这就导致 XGBoost 出现缺少分裂点的情况。

Quantile Loss 分位数损失

Lγ(y,y^)=i:yi<y^i(1γ)yiy^i+i:yiy^iγyiy^iL_\gamma(y,\hat y)=\sum_{i:y_i<\hat y_i}(1-\gamma) \vert y_i-\hat y_i \vert +\sum_{i:y_i \geq \hat y_i}\gamma \vert y_i-\hat y_i \vert

该函数是一个分段函数,γ\gamma 为分位数系数,yy 为真实值,y^\hat y 为预测值。根据预测值和真实值的大小,分两种情况来开考虑。y^>y\hat y > y 为高估,预测值比真实值大;y^<y\hat y < y 为低估,预测值比真实值小,使用不同系数来控制高估和低估在整个损失值的权重,进而实现分位数回归

特别的,当γ=0.5\gamma=0.5 时,分位数损失退化为平均绝对误差 MAE,也可以将 MAE 看成是分位数损失的一个特例:中位数损失。下图是取不同的中位点[0.25,0.5,0.7][0.25,0.5,0.7] 得到不同的分位数损失函数的曲线,也可以看出0.5时就是MAE。

回归损失函数1:L1 loss, L2 loss以及Smooth L1 Loss的对比 - Brook_icv - 博客园 (cnblogs.com)

(44条消息) L1、L2、smooth L1三类损失函数_happy1yao的博客-CSDN博客

六个深度学习常用损失函数总览:基本形式、原理、特点 - 腾讯云开发者社区-腾讯云 (tencent.com)

回归损失函数2 : HUber loss,Log Cosh Loss,以及 Quantile Loss - Brook_icv - 博客园 (cnblogs.com)