平均绝对误差损失(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} MAEMAE⟹MAE=N1i=1∑i=N∣y_truei−y_predi∣=N1i=1∑i=N∣yi−yi ∣=31[∣y1−y1 ∣+∣y2−y2 ∣+∣y3−y3 ∣]
其中,‘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 )
MAE
的Jacobian
矩阵(函数的一阶偏导数以一定方式排列而成的矩阵)为:
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} ⟹J⟹J⟹J= 3∣y1−y1 ∣−(y1−y1 )3∣y2−y2 ∣−(y2−y2 )3∣y3−y3 ∣−(y3−y3 ) =−31( y1−y1 y2−y2 y3−y3 / ∣y1−y1 ∣∣y2−y2 ∣∣y3−y3 ∣ )=−31∣y_true−y_pred∣y_true−y_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的优缺点

😀优点:由于MAE
计算的是绝对误差,无论是
(
y
_
true
i
−
y
_
pred
i
)
>
1
(y\_\text{true}_{i}-y\_\text{pred}_{i})>1
(y_truei−y_predi)>1还是
(
y
_
true
i
−
y
_
pred
i
)
<
1
(y\_\text{true}_{i}-y\_\text{pred}_{i})<1
(y_truei−y_predi)<1,没有平方项的作用,它们产生的惩罚力度相同,也不会被过度放大,因此MAE
无论对于什么样的输入值,都能产生稳定的梯度, 不会导致梯度爆炸,能得到较为稳健的解,同时对离群点不过分敏感,其鲁棒性更好。
☹️缺点:在我们需要关注模型对某些局外点的预测时不太适用。MAE
在训练中产生的梯度始终很大,且在0
点连续但不可导,这意味着即使对于小的MAE
损失值,其产生的梯度也是大的。这不利于函数的收敛,模型学习速度慢,同时也会导致在使用梯度下降训练模型时,在结束时可能会遗漏全局最小值。
MAE loss over.