【深度学习】:回归 & 分类任务的Loss函数分析

#回归Loss

1.L1 & L2 loss

代码
import tensorflow as tf
import matplotlib.pyplot as plt
sess = tf.Session()
x_val = tf.linspace(-1.,-1.,500)
target = tf.constant(0.)

#计算L2_loss
l2_y_val = tf.square(target - x_val)
l2_y_out = sess.run(l2_y_val)#用这个函数打开计算图

#计算L1_loss
l1_y_val = tf.abs(target - x_val)
l1_y_out = sess.run(l1_y_val)#用这个函数打开计算图

#打开计算图输出x_val,用来画图
#用画图来体现损失函数的特点
x_array = sess.run(x_val)
plt.plot(x_array, l1_y_out, 'b--', lable = 'L1_loss')
plt.plot(x_array, l2_y_out, 'r--', lable = 'L2_loss')
对L1和L2损失的分析
  • 用L1能够对异常值更鲁棒。

  • 用L2能够更快的收敛。
    L2比L1能更快速的收敛的原因在于接近与目标值的时候,L2曲线更加平滑。
    L1比L2对异常值更加鲁棒的原因,是因为当出现异常值时,L2对异常值反应后的error会比L1大,因为一个是平方级的,一个是绝对值。这会导致用L2更新参数时,由于异常值的Loss大导致参数更新方向往异常值偏。所以说L1对异常值更加鲁棒。

  • L1和L2都存在的问题
    若我们的真实目标集中有90%是150,10%是030。若我们用L1来做,会使得大部分的预测值为150(趋向于中位数)。而用L2来做,会使得有很多的预测值在030之间,这两种情况都不是我们希望见到的。

###2.Huber loss
因此提出了huber loss,其相当于利用超参数delta的范围将L1和L2组合起来。当残差比delta大时,HuberLoss就趋向于L1loss。当残差比delta小时,HuberLoss就趋向与L2loss。因此当delta趋向0时候,为L1loss;当delta趋向很大时,为L2loss。HuberLoss的好处就是结合了L1/L2的好处,但有个问题是要去学习或定义它的超参数delta。
##插入一个图

3.Log_cosh Loss

预测误差的双曲余弦的对数 l o g ( c o s h ( y i p − y i ) ) log(cosh(y_{i}{p}-y_{i})) logcoshyipyi,该loss的优点在于当x很小时,函数接近与x^2/2;当x很大时,函数接近与abs(x)-log(2)。所以说这个loss有Huberloss的所有的优点且不像Huberloss不仅要有超参数且并不是处处二次可微。为什么需要2d derivative呢?因为类似于XGBoost这种算法利用2d 可微函数对优化更有利。但这种loss函数对非常大的异常值仍然存在不友好的问题。

4.Quantile Loss

用来回归interval(间隔)而不是精准的回归到一个point(点)。

分类Loss

  • Hinge
hige_y_val = tf.maxmim(0., 1.-tf.mul(target,x_vals))
  • 两类交叉熵损失函数
xentropy_y_val = tf.mul(target,tf.log(x_vals)) - tf.mul((1. - target), tf.log(1. - x_vals))
xentropy_y_out = sess.run(xentropy_y_val)
  • sigmod交叉熵损失函数
  • 加权交叉熵损失函数
  • softmax交叉熵损失函数
  • 稀疏softmax交叉熵损失函数

你可能感兴趣的:(深度学习Trick)