一:均方误差(L2损失)
- 优点:便于梯度下降,误差大时下降快,误差小时下降慢,有利于函数收敛
- 缺点:受明显偏离正常范围的离群样本的影响较大
TensorFlow实现:
# Tensorflow中集成的函数
mse = tf.losses.mean_squared_error(y_true, y_pred)
# 利用Tensorflow基础函数手工实现
mse = tf.reduce_mean(tf.square(y_true - y_pred))
Keras实现:
-
model.compile(loss='mean_squared_error', optimizer='sgd')
-
from keras import losses model.compile(loss=losses.mean_squared_error, optimizer='sgd')
(定义稍有不同def mean_squared_error(y_true, y_pred): return K.mean(K.square(y_pred - y_true), axis=-1)#最终多了平均的操作)
二:平均绝对值误差(也称L1损失)
- 优点:克服了 MSE 的缺点,受偏离正常范围的离群样本影响较小。
- 缺点:收敛速度比 MSE 慢,因为当误差大或小时其都保持同等速度下降,而且在某一点处还不可导,计算机求导比较困难
TensorFlow实现:
maes = tf.losses.absolute_difference(y_true, y_pred)
maes_loss = tf.reduce_sum(maes)
Keras实现:
model.compile(loss='mean_squared_error', optimizer='sgd')
(def mean_squared_error(y_true, y_pred): return K.mean(K.square(y_pred - y_true), axis=-1)#也多了取平均值的操作)
三:两者的对比
MSE对误差取了平方(令e=真实值-预测值),因此若e>1,则MSE会进一步增大误差。如果数据中存在异常点,那么e值就会很大,而e则会远大于|e|。所以MSE容易被异常数据带 “跑偏” ,所以如果数据被污染,则选MAE更合适。然而MAE存在一个严重的问题(特别是对于神经网络):更新的梯度始终相同,也就是说,即使对于很小的损失值,梯度也很大。这样不利于模型的学习。为了解决这个缺陷,我们可以使用变化的学习率,在损失接近最小值时降低学习率。而MSE在这种情况下的表现就很好,即便使用固定的学习率也可以有效收敛。MSE损失的梯度随损失增大而增大,而损失趋于0时则会减小。这使得在训练结束时,使用MSE模型的结果会更精确。
总结来说,如果需要检测出异常数据则用L2,如异常数据只将其当作受损数据,则选L1.