简单谈谈Cross Entropy Loss

版权声明:本文为博主原创文章,未经博主允许不得转载。    https://blog.csdn.net/xg123321123/article/details/80781611
写在前面

分类问题和回归问题是监督学习的两大种类:分类问题的目标变量是离散的;回归问题的目标变量是连续的数值。 
神经网络模型的效果及优化的目标是通过损失函数来定义的。

回归问题解决的是对具体数值的预测。比如房价预测、销量预测等都是回归问题。这些问题需要预测的不是一个事先定义好的类别,而是一个任意实数。解决回顾问题的神经网络一般只有一个输出节点,这个节点的输出值就是预测值。对于回归问题,常用的损失函数是均方误差( MSE,mean squared error )。

分类问题常用的损失函数为交叉熵( Cross Entropy Loss)。

这篇博客我们简单谈谈交叉熵损失函数。

交叉熵描述了两个概率分布之间的距离,当交叉熵越小说明二者之间越接近。[关于交叉熵的原理,我这有一篇简单明白的博客]

尽管交叉熵刻画的是两个概率分布之间的距离,但是神经网络的输出却不一定是一个概率分布。为此我们常常用Softmax回归将神经网络前向传播得到的结果变成概率分布。

softmax常用于多分类过程中,它将多个神经元的输出,归一化到( 0, 1) 区间内,因此Softmax的输出可以看成概率,从而来进行多分类。

假设我们有一个包含k个元素的数组V,i
表示V中的第i
个元素,那么这i
个元素的softmax输出就是:
Si=ei∑kj=1ej
为了举一个具体例子,特意盗了一张图,如下:[关于Softmax更简单明白的原理阐述,特意负责任地推荐我这篇博客]

注:在TensorFlow中使用Cross Entropy Loss时,主要是使用tf.nn.softmax_cross_entropy_with_logits这类函数,但这类函数需要输入的是未经过Softmax的Logits。而所谓的unscaled logits就可以粗略理解为没有经过Softmax的变量。这一点要与数学上的logits ( 一个事件发生与该事件不发生的比值的对数) 进行区分。

进入主题

简单复习了Softmax,开始进入主题:损失函数为什么要用Cross Entropy Loss。

出于直觉,人们会觉得可以使用classification error来做损失函数:
classification−error=count−of−error−itemscount−of−all−items
我们不置可否,先来看两个模型:

以上两个模型,computed 是预测结果,targets 是预期结果。 二者的数字,都可以理解为概率。 correct 一栏表示预测是否正确。

模型 1 中,item 1 和 2 以非常微弱的优势判断正确,item 3 则彻底错误,计算其classification error:
classification−error=1/3=0.33

模型 2 中,item 1 和 2 的判断非常精准,item 3 判错,但比较轻,计算其classification error:
classification−error=1/3=0.33
如果仅仅从2 个模型的 classification error 来判断,那这两个模型性能相同,但实际情况是:模型 2 要明显优于模型 1。所以说,classification error 很难精确描述模型与理想模型之间的距离。

如果使用 ACE ( average cross-entropy error )?

首先,我们给出Cross Entropy Loss的公式:
Hy‘(y):=−∑iy′ilog(yi)
其中yi
是预测结果,y′i
是ground truth。
那么根据公式, 模型中 1 第一项的 cross-entropy 是:
−((ln(0.3)∗0)+(ln(0.3)∗0)+(ln(0.4)∗1))=−ln(0.4)

以此类推,模型1的 ACE ( average cross-entropy error ) 是:
−(ln(0.4)+ln(0.4)+ln(0.1))/3=1.38
模型 2 的 ACE 是:
−(ln(0.7)+ln(0.7)+ln(0.3))/3=0.64
这样一来ACE的结果准确的体现了模型 2 要优于模型 1的事实,所以说 Cross-Entropy Loss 更清晰的描述了模型与理想模型的距离。

为何不用 Mean Squared Error (平方和)

如果使用 MSE(mean squared error),则模型 1 第1项的 loss 是:
(0.3−0)2+(0.3−0)2+(0.4−1)2=0.09+0.09+0.36=0.54
模型 1 的 loss 是:
(0.54+0.54+1.34)/3=0.81
模型 2 的 loss 是:
(0.14+0.14+0.74)/3=0.34
MSE 看起来也是蛮不错的。为何不采用?

分类问题最后必须是 one hot 形式算出各 label 的概率, 然后通过 argmax 选出最终的分类。

在本篇博客最开始我们讲到,在计算各个 label 概率的时候,用的是 softmax 函数。

如果用 MSE 计算 loss, 通过 Softmax后 输出的曲线是波动的,有很多局部的极值点,即非凸优化问题 (non-convex),如下图 [ MSE是凸函数,logits先经过Softmax,再经过MSE形成的为非凸函数,姑且给个疑似解答链接]:

而用 Cross Entropy Loss 计算 loss,就还是一个凸优化问题,用梯度下降求解时,凸优化问题有很好的收敛特性。

注:TensorFlow中的loss函数定义在gen_nn_ops.py这个文件里,这个文件在源码里找不到,是编译时由C++文件生成的,如果真想看_softmax_cross_entropy_with_logits函数的源码,给你个链接:https://stackoverflow.com/questions/47987202/where-is-softmax-cross-entropy-with-logits-defined-in-tensorflow?noredirect=1&lq=1

最后的结论

分类问题用 One Hot Label + Cross Entropy Loss

Training 过程,分类问题用 Cross Entropy Loss,回归问题用 Mean Squared Error。

validation / testing 过程,使用 Classification Error更直观,也正是我们最为关注的指标。

题外话- 为什么回归问题用 MSE[可看可不看]

Cross Entropy Loss 对于神经网络的分类问题可以很好的应用,但是对于回归问题 [请自行翻阅上面的Cross Entropy Loss 公式],预测结果任意取一个值,比如 -1.5,就没法计算 log(-1.5),所以一般不用交叉熵来优化回归问题。

为什么用 MSE

最小二乘是在欧氏距离为误差度量的情况下,由系数矩阵所张成的向量空间内对于观测向量的最佳逼近点。

为什么用欧式距离作为误差度量 (即 MSE),09 年 IEEE Signal Processing Magzine 的 《Mean squared error: Love it or leave it?》这篇文章做了很好的讨论。这篇文章在 “WHY DO WE LOVE THE MSE?” 中说,MSE:

1. 它简单。

2. 它提供了具有很好性质的相似度的度量。

1)它是非负的;

2)唯一确定性。只有 x=y 的时候,d(x,y)=0;

3)它是对称的,即 d(x,y)=d(y,x);

4)符合三角性质。即 d(x,z)<=d(x,y)+d(y,z).

3. 物理性质明确,在不同的表示域变换后特性不变,例如帕萨瓦尔等式。

4. 便于计算。通常所推导得到的问题是凸问题,具有对称性,可导性。通常具有解析解,此外便于通过迭代的方式求解。

5. 和统计和估计理论具有关联。在某些假设下,统计意义上是最优的。

但 MSE 也有缺点 
并不是所有的问题都可以套用该准则,在“IMPLICIT ASSUMPTIONS WHEN USING THE MSE”说,它基于了以下几点对于信号的假设:

1. 信号的保真度和该信号的空间和时间顺序无关。即,以同样的方法,改变两个待比较的信号本身的空间或时间排列,它们之间的误差不变。例如,[1 2 3], [3 4 5] 两组信号的 MSE 和 [3 2 1],[5 4 3] 的 MSE 一样。

2. 误差信号和原信号无关。只要误差信号不变,无论原信号如何,MSE 均不变。例如,对于固定误差 [1 1 1],无论加在 [1 2 3] 产生 [2 3 4] 还是加在 [0 0 0] 产生 [1 1 1],MSE 的计算结果不变。

3. 信号的保真度和误差的符号无关。即对于信号 [0 0 0],与之相比较的两个信号 [1 2 3] 和[-1 -2 -3] 被认为和 [0 0 0] 具有同样的差别。

4. 信号的不同采样点对于信号的保真度具有同样的重要性。

本篇博客主要参考自以下文章: 
神经网络的分类模型 Loss 函数为什么要用 cross entropy 
详解softmax函数以及相关求导过程 
为什么分类问题用 cross entropy,而回归问题用 MSE 
Where is _softmax_cross_entropy_with_logits defined in tensorflow? 
looking for source code of from gen_nn_ops in tensorflow
--------------------- 
作者:时光杂货店 
来源:CSDN 
原文:https://blog.csdn.net/xg123321123/article/details/80781611 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(机器学习,深度学习)