损失函数
何为损失函数
常见的损失函数
均方差(MSE)损失(Mean Squared Error Loss)
均方差(MSE)损失是机器学习、深度学习回归任务中最常用的一种损失函数,也称为L2 Loss,它是模型预测值 与真实样本值 之间差值的平方和。
令 n=1,以为横轴,MSE值为纵轴,得函数图形如下:
可见MSE函数曲线光滑连续且处处可导,便于使用梯度下降算法,并且随着误差的减小,梯度也在减小,有利于收敛。
由平方项可知,当 ,MSE给予较小的惩罚,缩小误差;当 ,MSE给予较大的惩罚,放大误差;可知MSE对离群点比较敏感,受其影响较大。
如果样本中存在离群点,MSE会给离群点更高的权重放大误差,这就会牺牲其他正常点数据的预测效果,最终降低整体的模型性能。如图:
平均绝对误差(MAE)损失(Mean Absolute Error Loss)
平均绝对误差(MAE)是另一种常用的回归损失函数,它是模型预测值 与真实样本值 之差绝对值的和,表示了预测值的平均误差幅度,而不需要考虑误差的方向,范围是0到∞,其公式如下所示:
令 n=1,以为横轴,MAE值为纵轴,得函数图形如下:
可见MAE函数曲线连续呈线性增长,但是在 处不可导,其他地方梯度值为常数,具有一定的稳定性,不会导致梯度爆炸问题,具有较为稳健性的解。
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。
$ x=y-\hat y$ 为真实样本值 与模型预测值 之差
smooth L1损失函数曲线如下图所示,作者这样设置的目的是想让loss对于离群点更加鲁棒,相比于L2损失函数,其对离群点(指的是距离中心较远的点)、异常值(outlier)不敏感,可控制梯度的量级使训练时不容易跑飞。
损失函数对x求导
其中 x 为预测框与ground truth之间的差异:
当 x 增大时,L2 Loss的损失也增大, 这就导致在训练初期,预测值与 groud truth 差异过于大时,损失函数对预测值的梯度十分大。
L1 Loss 对 x 的导数为常数,在训练的后期,预测值与ground truth差异很小时,L1 Loss 的导数的绝对值仍然为1,而 learning rate 如果不变,损失函数将在稳定值附近波动,难以继续收敛以达到更高精度。
Smooth L1,在 时,梯度随着 变小而变小。 而当 时,对 的梯度的上限为1,也不会太大以至于破坏网络参数。Smooth L1 完美的避开了 L1 Loss 和L2 Loss 作为损失函数的缺陷。
Huber Loss
Huber Loss 是 L1 Loss 和 L2 Loss 两者的结合,在误差很小的时候采用平方误差,误差很大的时候采用绝对误差,这个分界点由超参数 来控制。
误差损失在 之间时,Huber 等价为 MSE;误差损失在 之间时 Huber 等价为 MAE;这样,当误差较大时,使用MAE对离群点不那么敏感;在误差较小时使用MSE,能够快速的收敛;
Smooth L1其实就是Huber Loss 的特殊情况,可以看作超参数 的Huber函数。。
Log-Cosh Loss
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 分位数损失
该函数是一个分段函数, 为分位数系数, 为真实值, 为预测值。根据预测值和真实值的大小,分两种情况来开考虑。 为高估,预测值比真实值大; 为低估,预测值比真实值小,使用不同系数来控制高估和低估在整个损失值的权重,进而实现分位数回归 。
特别的,当 时,分位数损失退化为平均绝对误差 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)