交叉熵代价函数(作用及公式推导)

转自:http://m.blog.csdn.net/u014313009/article/details/51043064

                 http://blog.sina.com.cn/s/blog_80ce3a550102wko1.html

交叉熵代价函数(Cross-entropy cost function)是用来衡量人工神经网络(ANN)的预测值与实际值的一种方式。与二次代价函数相比,它能更有效地促进ANN的训练。在介绍交叉熵代价函数之前,本文先简要介绍二次代价函数,以及其存在的不足。


1. 二次代价函数的不足

        ANN的设计目的之一是为了使机器可以像人一样学习知识。人在学习分析新事物时,当发现自己犯的错误越大时,改正的力度就越大。比如投篮:当运动员发现自己的投篮方向离正确方向越远,那么他调整的投篮角度就应该越大,篮球就更容易投进篮筐。同理,我们希望:ANN在训练时,如果预测值与实际值的误差越大,那么在反向传播训练的过程中,各种参数调整的幅度就要更大,从而使训练更快收敛。然而,如果使用二次代价函数训练ANN,看到的实际效果是,如果误差越大,参数调整的幅度可能更小,训练更缓慢。

        以一个神经元的二类分类训练为例,进行两次实验(ANN常用的激活函数为sigmoid函数,该实验也采用该函数):输入一个相同的样本数据x=1.0(该样本对应的实际分类y=0);两次实验各自随机初始化参数,从而在各自的第一次前向传播后得到不同的输出值,形成不同的代价(误差):

交叉熵代价函数(作用及公式推导)_第1张图片

实验1:第一次输出值为0.82

     交叉熵代价函数(作用及公式推导)_第2张图片

实验2:第一次输出值为0.98

        

        在实验1中,随机初始化参数,使得第一次输出值为0.82(该样本对应的实际值为0);经过300次迭代训练后,输出值由0.82降到0.09,逼近实际值。而在实验2中,第一次输出值为0.98,同样经过300迭代训练,输出值只降到了0.20。

        从两次实验的代价曲线中可以看出:实验1的代价随着训练次数增加而快速降低,但实验2的代价在一开始下降得非常缓慢;直观上看,初始的误差越大,收敛得越缓慢

        其实,误差大导致训练缓慢的原因在于使用了二次代价函数。二次代价函数的公式如下:



        其中,C表示代价,x表示样本,y表示实际值,a表示输出值,n表示样本的总数。为简单起见,同样一个样本为例进行说明,此时二次代价函数为:



        目前训练ANN最有效的算法是反向传播算法。简而言之,训练ANN就是通过反向传播代价,以减少代价为导向,调整参数。参数主要有:神经元之间的连接权重w,以及每个神经元本身的偏置b。调参的方式是采用梯度下降算法(Gradient descent),沿着梯度方向调整参数大小。w和b的梯度推导如下:

交叉熵代价函数(作用及公式推导)_第3张图片


        其中,z表示神经元的输入,表示激活函数。从以上公式可以看出,w和b的梯度跟激活函数的梯度成正比,激活函数的梯度越大,w和b的大小调整得越快,训练收敛得就越快。而神经网络常用的激活函数为sigmoid函数,该函数的曲线如下所示:

交叉熵代价函数(作用及公式推导)_第4张图片


        如图所示,实验2的初始输出值(0.98)对应的梯度明显小于实验1的输出值(0.82),因此实验2的参数梯度下降得比实验1慢。这就是初始的代价(误差)越大,导致训练越慢的原因。与我们的期望不符,即:不能像人一样,错误越大,改正的幅度越大,从而学习得越快。

        可能有人会说,那就选择一个梯度不变化或变化不明显的激活函数不就解决问题了吗?图样图森破,那样虽然简单粗暴地解决了这个问题,但可能会引起其他更多更麻烦的问题。而且,类似sigmoid这样的函数(比如tanh函数)有很多优点,非常适合用来做激活函数,具体请自行google之。



2. 交叉熵代价函数

        换个思路,我们不换激活函数,而是换掉二次代价函数,改用交叉熵代价函数:



        其中,x表示样本,n表示样本的总数。那么,重新计算参数w的梯度:

交叉熵代价函数(作用及公式推导)_第5张图片


        其中(具体证明见附录):


        因此,w的梯度公式中原来的被消掉了;另外,该梯度公式中的表示输出值与实际值之间的误差。所以,当误差越大,梯度就越大,参数w调整得越快,训练速度也就越快。同理可得,b的梯度为:



        实际情况证明,交叉熵代价函数带来的训练效果往往比二次代价函数要好。



3. 交叉熵代价函数是如何产生的?

        以偏置b的梯度计算为例,推导出交叉熵代价函数:

交叉熵代价函数(作用及公式推导)_第6张图片


        在第1小节中,由二次代价函数推导出来的b的梯度公式为:



        为了消掉该公式中的,我们想找到一个代价函数使得:



        即:



        对两侧求积分,可得:



        而这就是前面介绍的交叉熵代价函数。




附录:

        sigmoid函数为:

交叉熵代价函数(作用及公式推导)_第7张图片

        可证:

交叉熵代价函数(作用及公式推导)_第8张图片

 KL 散度

相对熵(KL散度)

如何通俗的解释交叉熵与相对熵?

熵、KL散度、信息增益、互信息-学习笔记

KL距离,Kullback-Leibler Divergence 浅谈KL散度
entropy
分布的相似度(距离)用什么模型比较好?
GAN模型-分析角度
Kullback–Leibler divergence


对一个信息源编码,按照其本身的概率分布进行编码,每个字符的平均比特数目最少
交叉熵代价函数(作用及公式推导)_第9张图片
交叉熵代价函数(作用及公式推导)_第10张图片
交叉熵代价函数(作用及公式推导)_第11张图片

KL散度是非负的,不具有对称性。注意到KL散度是一个累加或者积分,因此不能只是看到一个点上pi和qi的值的大小,而是应该看到是整个积分区间内的差别。 虽然KL被称为距离,但是其不满足距离定义的三个条件:1)非负性;2)对称性(不满足);3)三角不等式(不满足)。
所谓的三角不等式就是:对一个三角形来说,任何两条边的和大于第三边,这就是三角不等式。通常的距离度量都满足这个要求,但是KL散度不满足。

但是KL散度满足下面的规则:也就是可以通过KL散度作为一个指标来衡量p,q的接近程度。
交叉熵代价函数(作用及公式推导)_第12张图片

KL算出的值并不是有限的,因此无法作相对对比。比如3个分布, P, Q, R 如果 KL(P||Q) > KL(R || Q), 并不能说明分布P比R更接近Q。这是针对没有overlap的时候说的,也就是说如果这些分布之间都没有overlap,那么KL的值是没有意义的,因此比较大小也是没有意义的。(KL的值无界)

相对熵可以衡量两个随机分布之间的距离,当两个随机分布相同时,它们的相对熵为零,当两个随机分布的差别增大时,它们的相对熵也会增,注意到KL散度的取值没有限制,因此如果两个分布p,q没有重叠或者说离得很远,那么KL散度的值就是没有意义的值。


                                             JS散度 (Jensen-Shannon divergence)
In probability theory and statistics, the Jensen–Shannon divergence is a method of measuring the similarity between two probability distributions。
JS散度解决了KL不对称的问题,JS是对称的。
很明显,如果P1,P2完全相同,那么JS =0, 如果完全不相同,那么就是1.

交叉熵代价函数(作用及公式推导)_第13张图片
JS散度是利用KL散度来得到的。JS是对称的而且值是有界的[0,1].
交叉熵代价函数(作用及公式推导)_第14张图片
P,Q和第三个分布进行KL计算(第三个分布:(P+Q)/2 )

JS散度是有界的:
交叉熵代价函数(作用及公式推导)_第15张图片


但是KL和JS散度来度量时候有一个问题:
如果两个分配P,Q离得很远,完全没有重叠的时候,那么KL值是没有意义的,而JS值是一个常数。这在学习算法中是比较致命的,这就意味这这一点的梯度为0。梯度消失了。

3. MMD距离
交叉熵代价函数(作用及公式推导)_第16张图片
4.  Earth Mover's Distance —— 推土机距离 又称为  Wasserstein距离

交叉熵代价函数(作用及公式推导)_第17张图片

交叉熵代价函数(作用及公式推导)_第18张图片



Wessertein距离相比KL散度和JS散度的优势在于,即使两个分布的支撑集没有重叠或者重叠非常少,仍然能反映两个分布的远近。而js散度在此情况下是常量,KL散度可能无意义。
这就为什么在GAN的变种中使用了这种距离作为度量的原因。
令人拍案叫绝的Wasserstein GAN
交叉熵代价函数(作用及公式推导)_第19张图片


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