基于交叉熵进行反向传递的推导和理解

这篇文本的主要内容是基于交叉熵代价函数 ( cross-entropy lose function) 的反向传递的公式推导以及一些自己的理解。因为在推导过程中遇到了许多问题,所以记录下来。一方面是总结,另一方面更希望帮助其他朋友绕过这些弯路。


交叉熵

交叉熵是两种分布间相似性的度量方式,定义如下。给定两个分布p, q,其交叉熵为:

Image

两分布的交叉熵越小,其相似性越大。在反向传递的计算过程中,p表示真实样本分布,q为估计出的分布。

相比于二次代价函数,交叉熵代价函数的训练速度更快,而且不会出现二次代价函数在离参数真实值越远时训练速度越慢的情况。


反向传递推导

介绍

接下来的内容是本文正片,即利用反向传递来更新神经网络参数的推导过程。

所谓反向传递,就是说利用输出结果,返回来更新参数W。具体过程如下。

首先将W随机初始化,为了最小化交叉熵代价函数,用参数W对交叉熵J求导,在得到W对应的梯度后,按梯度的反方向更新参数W(即减去梯度的值)。其中 eta 是学习率。

Image

这种梯度下降方法也被称为批量梯度下降,因为其使用的是所有训练样本;还有一种常用方法为随机梯度下降,每次迭代只使用一个样本。

符号

我们规定使用一个单隐层神经网络,输入值为X ,输入层到隐藏层的参数为W,隐藏层使用Sigmoid激活函数,经过激活函数的隐藏层输出值为Z=sigmoid(W^TX),隐藏层到输出层的参数为V,输出层线性变换的结果记为a=VZ,Softmax的输出值为y=Softmax(a)。这里注意,我们将误差项b也算进了参数矩阵W中,因此不单独提出。

Image

X是一个N*D维矩阵,N为样本量,D是feature的量。

Y是一个N*1维矩阵,是估计值。

T是一个N*1维矩阵,是真实值,只有一个值为1,其余都为0。

W是一个D*M维矩阵,M是隐藏层神经元的数量。

V是一个M*K维矩阵,K是输出类别的总数。

推导

Image

这一步是整个推导的总纲,其依据为链式法则,接下来将分别对右边的三个部分求导。
Image
这步同样是链式法则,之所以进一步拆分,是因为y=Softmax(a),对y的求导很有技巧。

这里要区分k1和k,对k求和是因为W_dm在隐藏层链接z_m,而z_m的变化与输出层的所有k个类都有关系。而k1只是在这一步需要求和,因为y=softmax(a),所有k1个类的y都与a有关。k1的求和在这步softmax的求导后会消失,因为它是隐藏层到输出层的,是内部的;而k的求和会保留到最后,因为它相当于是从输入层到输出层,是外部的。区分这里的k1和k是推导的一大难点和重点,需要认真理解。
Image
t_kn/y_kn就是J对y求导的结果,原理是d(lnx)/d(x)=1/x。

接下来要重点讨论y对a的求导,也就是Softmax的求导。这个求导的注意点有二,一是要分两种情况讨论,二是最后要进行一个小变形。
Image
第一种情况是k1=k。此时:
Image
注意最后面将分数重新变形为y。

第二种情况是k1 != k。此时:
Image

可见两种情况的唯一区别是括号中的0和1,因此加入一个指示函数δ,当k1=k时δ=1,当k1!=k时δ=0。因此:
Image
将以上两步求导结果放回总式:
Image
现在我们单独看中间的一项。这步化简要理解好分类结果是一个(0,0,0,..1,..0,0)的向量,且δ只有在一种情况下不为零。此时的n为一个定值,可得:
Image
由于此时k也为定值,可得:
Image
由于δ只有一种情况(k1=k)为1,其余都为0,因此前一项为t_nk;后一项中,因为K个分类中只有一个分类的真值为1,其余都为0,因此求和也为1。可得:
Image
至此,总式化简为:
Image
最后两部分的求导比较简单。其中a=VZ:
Image
再看z的求导:
Image
至此,证明基本完成,我们将所有的部分都放入总式,可得:
Image
基于交叉熵代价函数反向传递的公式推导到这里就完成了。

在实际应用中,依照上述公式,对参数W进行更新即可。

最后补充一点,在上式中包含了V_mk,其实V_mk也在不断更新,并且是v先更新,w再更新,这也是“反向传递”的表现。由此引申出另一种W的推导方式,就是先推出V的导数,再利用链式法则将V和W连接起来,得出最终W的导数。这种方法在证明上并无大的区别,故不再赘述。


由于本人能力有限,文中公式繁多,在角标上可能有些纰缪,且使用的博客系统不支持Latex公式,如带来阅读上的不便,敬请指正,万分感谢。

Comments
Write a Comment