交叉熵代价函数(Cross-entropy cost function)是用来衡量人工神经网络(ANN)的预测值与实际值的一种方式。与二次代价函数相比,它能更有效地促进ANN的训练。在介绍交叉熵代价函数以前,本文先简要介绍二次代价函数,以及其存在的不足。算法
ANN的设计目的之一是为了使机器能够像人同样学习知识。人在学习分析新事物时,当发现本身犯的错误越大时,改正的力度就越大。好比投篮:当运动员发现本身的投篮方向离正确方向越远,那么他调整的投篮角度就应该越大,篮球就更容易投进篮筐。同理,咱们但愿:ANN在训练时,若是预测值与实际值的偏差越大,那么在反向传播训练的过程当中,各类参数调整的幅度就要更大,从而使训练更快收敛。然而,若是使用二次代价函数训练ANN,看到的实际效果是,若是偏差越大,参数调整的幅度可能更小,训练更缓慢。网络
以一个神经元的二类分类训练为例,进行两次实验(ANN经常使用的激活函数为sigmoid函数,该实验也采用该函数):输入一个相同的样本数据x=1.0(该样本对应的实际分类y=0);两次实验各自随机初始化参数,从而在各自的第一次前向传播后获得不一样的输出值,造成不一样的代价(偏差):函数
实验1:第一次输出值为0.82学习
实验2:第一次输出值为0.98google
在实验1中,随机初始化参数,使得第一次输出值为0.82(该样本对应的实际值为0);通过300次迭代训练后,输出值由0.82降到0.09,逼近实际值。而在实验2中,第一次输出值为0.98,一样通过300迭代训练,输出值只降到了0.20。.net
从两次实验的代价曲线中能够看出:实验1的代价随着训练次数增长而快速下降,但实验2的代价在一开始降低得很是缓慢;直观上看,初始的偏差越大,收敛得越缓慢。设计
其实,偏差大致使训练缓慢的缘由在于使用了二次代价函数。二次代价函数的公式以下:3d
其中,C表示代价,x表示样本,y表示实际值,a表示输出值,n表示样本的总数。为简单起见,一样一个样本为例进行说明,此时二次代价函数为:blog
目前训练ANN最有效的算法是反向传播算法。简而言之,训练ANN就是经过反向传播代价,以减小代价为导向,调整参数。参数主要有:神经元之间的链接权重w,以及每一个神经元自己的偏置b。调参的方式是采用梯度降低算法(Gradient descent),沿着梯度方向调整参数大小。w和b的梯度推导以下:token
其中,z表示神经元的输入,表示激活函数。从以上公式能够看出,w和b的梯度跟激活函数的梯度成正比,激活函数的梯度越大,w和b的大小调整得越快,训练收敛得就越快。而神经网络经常使用的激活函数为sigmoid函数,该函数的曲线以下所示:
如图所示,实验2的初始输出值(0.98)对应的梯度明显小于实验1的输出值(0.82),所以实验2的参数梯度降低得比实验1慢。这就是初始的代价(偏差)越大,致使训练越慢的缘由。与咱们的指望不符,即:不能像人同样,错误越大,改正的幅度越大,从而学习得越快。
可能有人会说,那就选择一个梯度不变化或变化不明显的激活函数不就解决问题了吗?图样图森破,那样虽然简单粗暴地解决了这个问题,但可能会引发其余更多更麻烦的问题。并且,相似sigmoid这样的函数(好比tanh函数)有不少优势,很是适合用来作激活函数,具体请自行google之。
换个思路,咱们不换激活函数,而是换掉二次代价函数,改用交叉熵代价函数:
其中,x表示样本,n表示样本的总数。那么,从新计算参数w的梯度:
其中(具体证实见附录):
所以,w的梯度公式中原来的被消掉了;另外,该梯度公式中的
表示输出值与实际值之间的偏差。因此,当偏差越大,梯度就越大,参数w调整得越快,训练速度也就越快。同理可得,b的梯度为:
实际状况证实,交叉熵代价函数带来的训练效果每每比二次代价函数要好。
以偏置b的梯度计算为例,推导出交叉熵代价函数:
在第1小节中,由二次代价函数推导出来的b的梯度公式为:
为了消掉该公式中的,咱们想找到一个代价函数使得:
即:
对两侧求积分,可得:
而这就是前面介绍的交叉熵代价函数。
sigmoid函数为:
可证: