均方误差损失(MSE loss)—最常用的回归(Regression)损失
什么是均方误差损失?
假设我们有真实值:
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 Square Error)损失可以写为:
M S E = 1 N ∑ i = 1 i = N ( y _ true i − y _ pred i ) 2 M S E = 1 N ∑ i = 1 i = N ( y i − y i ^ ) 2 ⟹ M S E = 1 3 [ ( y 1 − y 1 ^ ) 2 + ( y 2 − y 2 ^ ) 2 + ( y 3 − y 3 ^ ) 2 ] \begin{aligned}MSE&=\frac{1}{N}\sum_{i=1}^{i=N}{(y\_\text{true}_i-y\_\text{pred}_i)^2}\\MSE&=\frac{1}{N}\sum_{i=1}^{i=N}{(y_i-\widehat{y_i})^2}\\\implies MSE&=\frac{1}{3}[(y_1-\widehat{y_1})^2+(y_2-\widehat{y_2})^2+(y_3-\widehat{y_3})^2]\end{aligned} MSEMSE⟹MSE=N1i=1∑i=N(y_truei−y_predi)2=N1i=1∑i=N(yi−yi )2=31[(y1−y1 )2+(y2−y2 )2+(y3−y3 )2]
在Python
中,利用Numpy
,均方误差损失可以写为:
import numpy as np
np.random.seed(2001716)
# defining MSE
def mse(y_true, y_pred):
return np.mean((y_true - y_pred) ** 2)
如何计算MSE的梯度?
真实值
y
_
true
y\_\text{true}
y_true固定,MSE
的值与
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 S E = f ( y 1 ^ , y 2 ^ , y 3 ^ ) MSE = f(\widehat{y_1},\widehat{y_2},\widehat{y_3}) MSE=f(y1 ,y2 ,y3 )
MSE
的Jacobian
矩阵(函数的一阶偏导数以一定方式排列而成的矩阵)为:
J = ∂ ( M S E ) ( y 1 ^ , y 2 ^ , y 3 ^ ) = [ ∂ ( M S E ) ∂ ( y 1 ^ ) ∂ ( M S E ) ∂ ( y 2 ^ ) ∂ ( M S E ) ∂ ( y 3 ^ ) ] J=\frac{\partial(MSE)}{(\widehat{y_1},\widehat{y_2},\widehat{y_3})}=\begin{bmatrix}\frac{\partial(MSE)}{\partial(\widehat{y_1})}\\\\\frac{\partial(MSE)}{\partial(\widehat{y_2})}\\\\\frac{\partial(MSE)}{\partial(\widehat{y_3})}\end{bmatrix} J=(y1 ,y2 ,y3 )∂(MSE)= ∂(y1 )∂(MSE)∂(y2 )∂(MSE)∂(y3 )∂(MSE)
分别计算Jacobian
矩阵中的每一个元素得到:
⟹ J = [ − 2 ( y 1 − y 1 ^ ) 3 − 2 ( y 2 − y 2 ^ ) 3 − 2 ( y 3 − y 3 ^ ) 3 ] ⟹ J = − 2 3 ( [ y 1 − y 1 ^ y 2 − y 2 ^ y 3 − y 3 ^ ] ) ⟹ J = − 2 3 ( [ y 1 y 2 y 3 ] − [ y 1 ^ y 2 ^ y 3 ^ ] ) ⟹ J = − 2 3 ( y _ true − y _ pred ) \begin{aligned} &\Longrightarrow J=\begin{bmatrix}\frac{-2(y_{1}-\widehat{y_{1}})}{3}\\\\\frac{-2(y_{2}-\widehat{y_{2}})}{3}\\\\\frac{-2(y_{3}-\widehat{y_{3}})}{3}\end{bmatrix} \\ &\implies J=-\frac23(\begin{bmatrix}y_1-\widehat{y_1}\\\\y_2-\widehat{y_2}\\\\y_3-\widehat{y_3}\end{bmatrix}) \\ &\implies J=-\frac23(\begin{bmatrix}y_1\\\\y_2\\\\y_3\end{bmatrix}-\begin{bmatrix}\widehat{y_1}\\\\\widehat{y_2}\\\\\widehat{y_3}\end{bmatrix}) \\ &\implies J=-\frac{2}{3}(y\_\text{true}-y\_\text{pred}) \end{aligned} ⟹J= 3−2(y1−y1 )3−2(y2−y2 )3−2(y3−y3 ) ⟹J=−32( y1−y1 y2−y2 y3−y3 )⟹J=−32( y1y2y3 − y1 y2 y3 )⟹J=−32(y_true−y_pred)
其中,‘3’代表 y _ true y\_\text{true} y_true和 y _ pred y\_\text{pred} y_pred中标量元素的个数。
在Python
中,利用Numpy
,均方误差损失的Jacobian
矩阵可以写为:
# defining MSE gradients
def mse_grad(y_true, y_pred):
N = y_true.shape[0]
return -2 * (y_true - y_pred) / N
MSE的优缺点
![8hp8qg.png](https://img-blog.csdnimg.cn/img_convert/3d709f4930808273a552a7cc3aeae923.png)
😀优点:MSE
由于存在(y_true - y_pred)
平方项,能够保证被训练的模型不会产生具有较大误差的预测;同时使用MSE
训练的模型收敛速度快。
☹️缺点:MSE
使得被训练的模型容易受到训练数据中局外点(outliers)的影响,模型的某一个无关紧要的小错误都会被MSE
的平方项放大,造成对模型本身严重的影响。在现实应用中,我们不需要关心那些局外点,只需要关心模型在数据集的主要部分上的性能。
MSE loss over.