平均绝对误差(MAE loss)—鲁棒的回归损失

本文介绍了平均绝对误差损失(MAE)的概念,用于回归问题的评估,它具有计算简单、对异常值鲁棒的优点,但梯度大且在0点不可导,可能导致训练过程不稳定。文中还提供了Python和Numpy实现方法以及MAE的优缺点分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

平均绝对误差损失(MAE loss)—鲁棒的回归损失

什么是平均绝对误差损失?

假设我们有真实值:

y _ true = y = [ y 1 y 2 y 3 ] y\_\text{true}=y=\begin{bmatrix}y_1\\y_2\\y_3\end{bmatrix} y_true=y= y1y2y3

和预测值:

y _ pred = y ^ = [ y 1 ^ y 2 ^ y 3 ^ ] y\_\text{pred}=\widehat{y}=\begin{bmatrix}\widehat{y_1}\\\widehat{y_2}\\\widehat{y_3}\end{bmatrix} y_pred=y = y1 y2 y3

平均绝对误差(Mean Absolute Error)损失可以写为:

M A E = 1 N ∑ i = 1 i = N ∣ y _ true i − y _ pred i ∣ M A E = 1 N ∑ i = 1 i = N ∣ y i − y i ^ ∣    ⟹    M A E = 1 3 [ ∣ y 1 − y 1 ^ ∣ + ∣ y 2 − y 2 ^ ∣ + ∣ y 3 − y 3 ^ ∣ ] \begin{aligned}MAE&=\frac{1}{N}\sum_{i=1}^{i=N}|y\_\text{true}_i-y\_\text{pred}_i|\\\\MAE&=\frac{1}{N}\sum_{i=1}^{i=N}|y_i-\widehat{y_i}|\\\\\implies MAE&=\frac{1}{3}[|y_1-\widehat{y_1}|+|y_2-\widehat{y_2}|+|y_3-\widehat{y_3}|]\end{aligned} MAEMAEMAE=N1i=1i=Ny_trueiy_predi=N1i=1i=Nyiyi =31[y1y1 +y2y2 +y3y3 ]

其中,‘3’代表 y _ true y\_\text{true} y_true y _ pred y\_\text{pred} y_pred中标量元素的个数。

Python中,利用Numpy,平均绝对误差损失可以写为:

import numpy as np
np.random.seed(2001716)

# defining MAE
def mae(y_true, y_pred):
    return np.mean(abs(y_true - y_pred))

如何计算MAE的梯度?

真实值 y _ true y\_\text{true} y_true固定,MAE的值与 y _ pred y\_\text{pred} y_pred有关,也即与 ( y 1 ^ , y 2 ^ , y 3 ^ ) (\widehat{y_1},\widehat{y_2},\widehat{y_3}) (y1 ,y2 ,y3 )有关。

M A E = f ( y 1 ^ , y 2 ^ , y 3 ^ ) MAE = f(\widehat{y_1},\widehat{y_2},\widehat{y_3}) MAE=f(y1 ,y2 ,y3 )

MAEJacobian矩阵(函数的一阶偏导数以一定方式排列而成的矩阵)为:

J = ∂ ( M A E ) ( y 1 ^ , y 2 ^ , y 3 ^ ) = [ ∂ ( M A E ) ∂ ( y 1 ^ ) ∂ ( M A E ) ∂ ( y 2 ^ ) ∂ ( M A E ) ∂ ( y 3 ^ ) ] J=\frac{\partial(MAE)}{(\widehat{y_1},\widehat{y_2},\widehat{y_3})}=\begin{bmatrix}\frac{\partial(MAE)}{\partial(\widehat{y_1})}\\\\\frac{\partial(MAE)}{\partial(\widehat{y_2})}\\\\\frac{\partial(MAE)}{\partial(\widehat{y_3})}\end{bmatrix} J=(y1 ,y2 ,y3 )(MAE)= (y1 )(MAE)(y2 )(MAE)(y3 )(MAE)

分别计算Jacobian矩阵中的每一个元素得到:

   ⟹    J = [ − ( y 1 − y 1 ^ ) 3 ∣ y 1 − y 1 ^ ∣ − ( y 2 − y 2 ^ ) 3 ∣ y 2 − y 2 ^ ∣ − ( y 3 − y 3 ^ ) 3 ∣ y 3 − y 3 ^ ∣ ] ⟹ J = − 1 3 ( [ y 1 − y 1 ^ y 2 − y 2 ^ y 3 − y 3 ^ ] / [ ∣ y 1 − y 1 ^ ∣ ∣ y 2 − y 2 ^ ∣ ∣ y 3 − y 3 ^ ∣ ] ) ⟹ J = − 1 3 y _ t r u e − y _ p r e d ∣ y _ t r u e − y _ p r e d ∣ \begin{aligned} \implies J&=\begin{bmatrix}\frac{-(y_1-\widehat{y_1})}{3|y_1-\widehat{y_1}|}\\\\\frac{-(y_2-\widehat{y_2})}{3|y_2-\widehat{y_2}|}\\\\\frac{-(y_3-\widehat{y_3})}{3|y_3-\widehat{y_3}|}\end{bmatrix} \\ \Longrightarrow J&=-\frac13(\begin{bmatrix}y_1-\widehat{y_1}\\\\y_2-\widehat{y_2}\\\\y_3-\widehat{y_3}\end{bmatrix}/\begin{bmatrix}|y_1-\widehat{y_1}|\\\\|y_2-\widehat{y_2}|\\\\|y_3-\widehat{y_3}|\end{bmatrix}) \\ \Longrightarrow J&=-\frac13\frac{y\_true-y\_pred}{|y\_true-y\_pred|} \end{aligned} JJJ= 3∣y1y1 (y1y1 )3∣y2y2 (y2y2 )3∣y3y3 (y3y3 ) =31( y1y1 y2y2 y3y3 / y1y1 y2y2 y3y3 )=31y_truey_predy_truey_pred

其中,‘3’代表 y _ true y\_\text{true} y_true y _ pred y\_\text{pred} y_pred中标量元素的个数。

Python中,利用Numpy,平均绝对误差损失的Jacobian矩阵可以写为:

# defining MAE gradients

def mae_grad(y_true, y_pred):                
    N = y_true.shape[0]
    return -((y_true - y_pred) / (abs(y_true - y_pred) + 10**-100)) / N

MAE的优缺点

ru30sc.png

😀优点:由于MAE计算的是绝对误差,无论是 ( y _ true i − y _ pred i ) > 1 (y\_\text{true}_{i}-y\_\text{pred}_{i})>1 (y_trueiy_predi)>1还是 ( y _ true i − y _ pred i ) < 1 (y\_\text{true}_{i}-y\_\text{pred}_{i})<1 (y_trueiy_predi)<1,没有平方项的作用,它们产生的惩罚力度相同,也不会被过度放大,因此MAE无论对于什么样的输入值,都能产生稳定的梯度, 不会导致梯度爆炸,能得到较为稳健的解,同时对离群点不过分敏感,其鲁棒性更好

☹️缺点:在我们需要关注模型对某些局外点的预测时不太适用。MAE在训练中产生的梯度始终很大,且在0点连续但不可导,这意味着即使对于小的MAE损失值,其产生的梯度也是大的。这不利于函数的收敛,模型学习速度慢,同时也会导致在使用梯度下降训练模型时,在结束时可能会遗漏全局最小值

MAE loss over.

<think>好的,我现在需要回答用户关于机器学习中MAE(Mean Absolute Error,平均绝对误差损失函数的问题。首先,我要确保自己正确理解MAE的定义、公式、应用场景以及优缺点。 首先,MAE回归任务中常用的损失函数,计算的是预测值与真实值之间绝对差的平均值。公式应该是:MAE = (1/n) * Σ|y_i - ŷ_i|,其中n是样本数量,y_i是真实值,ŷ_i是预测值。需要确认一下这个公式是否正确,以及是否需要使用LaTeX格式来展示,根据用户的要求,行内公式用$...$,独立公式用$$...$$并单独成段。 接下来,用户可能想知道MAE的特点,比如它对异常值的性。因为MAE用的是绝对值,而不是平方差,所以它对异常值不那么敏感,这点和MSE(均方误差)不同。需要指出这一点,并且可能比较两者的区别。 然后,MAE的优缺点是什么?优点除了对异常值外,计算简单,易于解释。缺点是梯度在零点不可导,可能导致优化时的效率问题,比如使用梯度下降时,接近零点的地方梯度是常数,可能影响收敛速度。但MAE整体的梯度比较稳定,不会像MSE那样随着误差增大梯度也增大,所以对于某些情况更合适。 应用场景方面,MAE适用于回归任务,尤其是当数据中有较多异常值,或者需要平衡误差的影响时。例如在房价预测、金融风险评估等场景中,可能更关注绝对误差而非平方误差。 此外,用户可能需要知道如何在代码中实现MAE,比如在Python中使用TensorFlow或PyTorch的话,是否有现成的函数,或者如何手动实现。可能需要给出一个简单的代码示例,比如用numpy计算MAE。 还要注意用户提供的系统级指令,比如引用部分。用户提供的引用中提到了损失函数、代价函数和目标函数的区别,其中MAE属于损失函数,针对单个样本,但通常在计算时是对整个训练集的平均,所以这里可能需要澄清,MAE既可以作为损失函数(单个样本的绝对误差),也可以作为代价函数(整个数据集的平均绝对误差)。根据引用[1],损失函数是单个样本,代价函数是整个训练集的总损失,所以MAE作为代价函数时是总损失平均值。 另外,用户的问题中提到了生成相关问题,需要根据回答内容提出相关问题。例如,MAE和MSE的区别,如何选择两者,MAE的优化方法,在深度学习中的应用,或者与其他损失函数的比较等。 现在需要检查是否所有数学公式都正确使用了LaTeX格式,例如行内公式用$...$,独立公式用$$...$$。例如,MAE的公式应该作为独立公式展示,所以用$$...$$并单独成段。 还要确认是否有引用需要添加,比如在提到损失函数和代价函数区别的时候,可以引用用户提供的引用[1]。例如,在说明MAE作为代价函数时,提到总损失,并引用[1]。 最后,确保回答结构清晰,分点列出MAE的定义、公式、特点、优缺点、应用场景、代码示例,以及相关问题。同时,代码部分需要用正确的Python语法,并正确缩进。</think>### Mean Absolute Error (MAE) 损失函数 #### 1. 定义与公式 **平均绝对误差MAE)**是回归任务中常用的损失函数,用于衡量模型预测值与真实值的平均绝对差异。其数学定义为: $$ \text{MAE} = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i| $$ 其中: - $n$ 是样本数量, - $y_i$ 是第 $i$ 个样本的真实值, - $\hat{y}_i$ 是第 $i$ 个样本的预测值。 #### 2. 特点 - **对异常值的性**:MAE 使用绝对值而非平方差,因此对异常值的敏感性低于均方误差(MSE)[^1]。 - **线性权重**:所有误差的权重相同,梯度大小恒定(与误差无关)。 - **不可导性**:在 $y_i = \hat{y}_i$ 处不可导,可能影响梯度下降的收敛效率。 #### 3. 优缺点 | **优点** | **缺点** | |-----------------------------|-----------------------------| | 异常值影响小 | 优化速度可能较慢(梯度恒定) | | 计算简单,解释性强 | 无法区分大误差与小误差的优先级 | | 适合对误差要求均匀的任务 | | #### 4. 应用场景 - 数据包含较多异常值的回归任务(如金融风控、房价预测)。 - 需要平衡误差影响的场景(如医疗诊断中的风险评分)。 #### 5. 代码实现(Python) ```python import numpy as np def mean_absolute_error(y_true, y_pred): return np.mean(np.abs(y_true - y_pred)) # 示例 y_true = np.array([3, -0.5, 2, 7]) y_pred = np.array([2.5, 0.0, 2, 8]) print("MAE:", mean_absolute_error(y_true, y_pred)) # 输出: 0.5 ``` #### 6. 与 MSE 的对比 | **指标** | MAE | MSE | |---------|-------------------------|-------------------------| | **公式** | $\frac{1}{n}\sum\|y-\hat{y}\|$ | $\frac{1}{n}\sum(y-\hat{y})^2$ | | **梯度** | 恒定($\pm 1$) | 随误差线性增大 | | **异常值敏感度** | 低 | 高 | ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值