L1和L2损失函数

一:均方误差(L2损失)

  1. 优点:便于梯度下降,误差大时下降快,误差小时下降慢,有利于函数收敛
  2. 缺点:受明显偏离正常范围的离群样本的影响较大

TensorFlow实现:

# Tensorflow中集成的函数
mse = tf.losses.mean_squared_error(y_true, y_pred)

# 利用Tensorflow基础函数手工实现
mse = tf.reduce_mean(tf.square(y_true -  y_pred))

Keras实现:

  1. model.compile(loss='mean_squared_error', optimizer='sgd') 

  2. 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损失)

  1. 优点:克服了 MSE 的缺点,受偏离正常范围的离群样本影响较小。
  2. 缺点:收敛速度比 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.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值