平均绝对值误差(L1_Loss)和 均方误差(L2_Loss)

一、 Mean Absolute Error

平均绝对误差(MAE)也是一种常用的回归损失函数,它是目标值 y j y_{j} yj与预测值 y j ^ \hat{y_{j}} yj^之差绝对值的和,表示了预测值的平均误差幅度,而不需要考虑误差的方向,其公式如下所示:
M A E = 1 N ∑ i = 1 N ∣ y j − y j ^ ∣ MAE= \frac{1}{N} \sum_{i =1}^{N} |y_{j} - \hat{ y_{j} } | MAE=N1i=1Nyjyj^

二、 Mean Square Error

均方误差(MSE)用于计算预测值 y j ^ \hat{y_{j}} yj^与真实值 y j y_{j} yj之间差的平均值,其公式如下所示:
M S E = 1 N ∑ i = 1 N ( y j − y j ^ ) 2 MSE = \frac{1}{N}\sum_{i=1}^{N}(y_{j}-\hat{y_{j}})^2 MSE=N1i=1N(yjyj^)2

三、 代码实现MAE和MSE

import numpy as np
import matplotlib.pyplot as plt

def MAE_Loss(act, pred):
    diff = act - pred
    diff_abs = np.absolute(diff)
    mae = diff_abs.mean()
    return mae

def MSE_Loss(act, pred):
    diff = act - pred
    diff_square = diff ** 2
    mse  = diff_square.mean()
    return mse

'''
create an array containning 500 numbers, 
the value range is between -1 and 1.
'''
pred = np.linspace(-1., 1., 500)   
# the actual value is 0
target = 0.
l1_y = []
l2_y = []
for x in pred:
    y = MAE_Loss(target, x)
    l1_y.append(y)

for x2 in pred:
    y2 = MSE_Loss(target, x2)
    l2_y.append(y2)
plt.plot(pred, l1_y, label="L1_loss")
plt.plot(pred, l2_y, label="L2_loss")
plt.legend()

结果图:
在这里插入图片描述

四、 MAE与MSE的比较

通常来说,利用均方差更容易求解,但平方绝对误差则对于局外点更鲁棒。
在机器学习的模型通常是用来找到使目标函数最小的点。在最小值处每一种损失函数都会得到最小值。
在这里插入图片描述
MAE优于MSE的情况
由上图可知,当预测值与目标值很接近,误差与方差都很小,而由于局外点的存在使得 MSE误差变得很大。
由于均方误差(MSE)在误差较大点时的损失远大于平均绝对误差(MAE),它会给局外点赋予更大的权重,模型会致力减小局外点造成的误差,从而使得模型的整体表现下降。
所以当训练数据中含有较多的局外点时,平均绝对误差(MAE)更为有效。当我们对所有观测值进行处理时,如果利用MSE进行优化则我们会得到所有观测的均值,而使用MAE则能得到所有观测的中值。与均值相比,中值对于局外点的鲁棒性更好,这就意味着平均绝对误差对于局外点有着比均方误差更好的鲁棒性。
** MSE优于MAE的情况**
在这里插入图片描述
但MAE也存在一个问题,特别是对于神经网络来说,它的梯度在极值点处会有很大的跃变,及时很小的损失值也会长生很大的误差,这不利于学习过程。为了解决这个问题,需要在解决极值点的过程中动态减小学习率。MSE在极值点却有着良好的特性,及时在固定学习率下也能收敛。MSE的梯度随着损失函数的减小而减小,这一特性使得它在最后的训练过程中能得到更精确的结果。

总结

L1损失对于局外点更鲁棒,但它的导数不连续使得寻找最优解的过程低效;L2损失对于局外点敏感,但在优化过程中更为稳定和准确。
但现实中还存在两种损失都很难处理的问题。例如某个任务中90%的数据都符合目标值——150,而其余的10%数据取值则在0-30之间。那么利用MAE优化的模型将会得到150的预测值而忽略的剩下的10%(倾向于中值);而对于MSE来说由于局外点会带来很大的损失,将使得模型倾向于在0-30的方向取值。这两种结果在实际的业务场景中都是我们不希望看到的。

参考的博客:
https://zhuanlan.zhihu.com/p/376024235

  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值