L1损失(MAE)、L2损失(MSE)

均绝对误差(MAE)和均方误差(MSE)是常见的模型损失函数。MAE对离群点不敏感,但不可导点可能导致收敛慢;MSE可导且利于快速收敛,但对离群点敏感。在深度学习中,MSE通常是首选,但若数据包含离群点,MAE可能是更好的选择。SmoothL1损失函数结合了两者的优点,对离群点不敏感且能更快收敛。
摘要由CSDN通过智能技术生成

均绝对误差(L1 Loss)

均绝对误差(Mean Absolute Error,MAE) 是指模型预测值f(x)和真实值y之间距离的均值,其公式如下:

忽略下标i ,设n=1,以f(x)−y为横轴,MAE的值为纵轴,得到函数的图形如下:

MAE曲线连续,但是在y−f(x)=0处不可导。而且 MAE 大部分情况下梯度都是相等的,这意味着即使对于小的损失值,其梯度也是大的。这不利于函数的收敛和模型的学习但是,无论对于什么样的输入值,都有着稳定的梯度,不会导致梯度爆炸问题,具有较为稳健性的解

相比于MSE,MAE有个优点就是,对于离群点不那么敏感。因为MAE计算的是误差y−f(x)的绝对值,对于任意大小的差值,其惩罚都是固定的。

针对上面带有离群点的数据,MAE的效果要好于MSE。

显然,使用 MAE 损失函数,受离群点的影响较小,拟合直线能够较好地表征正常数据的分布情况。

均方误差MSE (L2 Loss)

概念:

均方误差(Mean Square Error,MSE)是模型预测值f(x) 与真实样本值y 之间差值平方的均值,其公式如下

其中,yi和f(xi)分别表示第i个样本的真实值及其对应的预测值,n为样本的个数。

忽略下标i ,设n=1,以f(x)−y为横轴,MSE的值为纵轴,得到函数的图形如下:

MSE的函数曲线光滑、连续,处处可导,便于使用梯度下降算法,是一种常用的损失函数。 而且,随着误差的减小,梯度也在减小,这有利于收敛,即使使用固定的学习速率,也能较快的收敛到最小值。

当y和f(x)也就是真实值和预测值的差值大于1时,会放大误差;而当差值小于1时,则会缩小误差,这是平方运算决定的。MSE对于较大的误差(>1)给予较大的惩罚,较小的误差(<1)给予较小的惩罚。也就是说,对离群点比较敏感,受其影响较大。

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

可见,使用 MSE 损失函数,受离群点的影响较大,虽然样本中只有 5 个离群点,但是拟合的直线还是比较偏向于离群点。

代码实现方式:

MSELoss — PyTorch 2.2 documentation

loss = torch.nn.functional.mse_loss(target, pred, reduction='none')

参数:target(真实值)、pred(预测值)、reduction,这个参数决定了损失计算输出的最终形式。 

reduction 参数接受以下三个值之一:

  • 'none':不进行任何降维或聚合操作。如果输入targetpred的形状是(n, *),其中n是批量大小,*代表任意数量的额外维度,则输出损失的形状也会是(n, *)。每个元素代表对应预测值和真实值之间的MSE损失。【例如此时你计算一个target(128,512)和pred(128,512)的MSE loss,那么这种方式的输出维度也是(128,512),相当于是对所有样本的损失单独列出】
  • 'mean':计算所有损失的平均值。这将返回一个单一的标量值,代表整个输入批次的平均MSE损失。这是最常用的形式,适用于大多数情况,因为它提供了一个单一的、简单的衡量标准来评估模型的性能。【例如此时你计算一个target(128,512)和pred(128,512)的MSE loss,那么这种方式的输出维度也是(1),相当于是对所有样本的损失的求平均】
  • 'sum':计算所有损失的总和。这同样返回一个标量,但是是通过将所有单独的损失值加总起来得到的。这种方式可能在某些特定情况下有用,例如,当你想要手动平均不同大小的批次时。【例如此时你计算一个target(128,512)和pred(128,512)的MSE loss,那么这种方式的输出维度也是(1),相当于是对所有样本的损失的求和】

MSE和MAE的选择

  • 从梯度的求解以及收敛上,MSE是由于MAE的。MSE处处可导,而且梯度值也是动态变化的,能够快速的收敛;而MAE在0点处不可导,且其梯度保持不变。对于很小的损失值其梯度也很大,在深度学习中,就需要使用变化的学习率,在损失值很小时降低学习率。

  • 对离群(异常)值得处理上,MAE要明显好于MSE。

如果离群点(异常值)需要被检测出来,则可以选择MSE作为损失函数;如果离群点只是当做受损的数据处理,则可以选择MAE作为损失函数。

总之,MAE作为损失函数更稳定,并且对离群值不敏感,但是其导数不连续,求解效率低。另外,在深度学习中,收敛较慢。MSE导数求解速度高,但是其对离群值敏感,不过可以将离群值的导数设为0(导数值大于某个阈值)来避免这种情况。

在某些情况下,上述两种损失函数都不能满足需求。例如,若数据中90%的样本对应的目标值为150,剩下10%在0到30之间。那么使用MAE作为损失函数的模型可能会忽视10%的异常点,而对所有样本的预测值都为150。这是因为模型会按中位数来预测。而使用MSE的模型则会给出很多介于0到30的预测值,因为模型会向异常点偏移。

这种情况下,MSE和MAE都是不可取的,简单的办法是对目标变量进行变换,或者使用别的损失函数,例如:Huber,Log-Cosh以及分位数损失等。

总结

对于大多数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 点附*使用平方函数使得它更加平滑。

Smooth L1的优点

  • 相比于L1损失函数,可以收敛得更快。
  • 相比于L2损失函数,对离群点、异常值不敏感,梯度变化相对更小,训练时不容易跑飞。

https://www.cnblogs.com/wangguchangqing/p/12021638.html

损失函数:L1 loss, L2 loss, smooth L1 loss - 知乎

  • 23
    点赞
  • 132
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马鹏森

太谢谢了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值