转载请注明出处:http://www.codelast.com/

反向传播的4个基本方程这部分内容开始,《Neural Networks and Deep Learning》一书基本上是满屏的数学公式了,然而,得益于作者强大的、深入浅出的表述能力,理解起来并不会让人感觉那么难。
本文将描述反向传播的4个基本方程中的第一个——输出层误差的方程

\delta _j^L = \frac{{\partial C}}{{\partial a_j^L}}\sigma '\left( {z_j^L} \right)
就算完全看不懂这个公式的含义,也千万不要被吓到,毕竟它才如此之短。
本文将解释一下这个公式的含义。但我必须得说,如果没有上下文的话,再怎么看解释也是没用的,毕竟这些符号是什么意思都是作者定义的,所以,必须结合原书来理解。
其中:
(1) \delta _j^L  代表神经网络的第 L 层、第 j 个神经元产生的误差。
(2)C 代表代价函数(cost function),a 代表神经网络的输出激活(activation)值,由于每一个神经元都有一个输出激活值,所以 a 是一个向量。把 a 看成一个变量, \frac{{\partial C}}{{\partial a}} 就表示用代价函数对输出激活值求导。
(3) \sigma 是作者书中所说的“向量化函数”,其实就是激活函数,因为作者在书的前面章节中已经定义过  {a^l} = \sigma ({w^l}{a^{l - 1}} + {b^l}) ,所以输出激活值就是把带权输入再应用一个  \sigma ,这就是激活函数。
(4)z 代表的是带权输入,即  {z^l} = {w^l}{a^{l - 1}} + {b^l} ,把 z 看作变量,所以  \sigma '\left( {z_j^L} \right) 表示的就是激活函数对带权输入求导。数学公式已经忘得差不多的话,一定要注意这里不是表示两个式子相乘,而是一个表示求导的式子。
文章来源:http://www.codelast.com/
现在先看(1):为了理解这句话,要从此书前面部分的『关于代价函数的两个假设』一节说起。“两个假设”中的其中一个就是,神经网络的代价(cost)可以写成神经网络输出的激活值的函数:
C = C({a^L})
这里的 {a^L} 是一个向量,因为神经网络的某一层,会有N个神经元,每一个神经元都有一个输出激活值,例如  a_1^La_2^L ,等等。

知道了这一点,再来看看这句话里所说的误差是什么?在机器学习中,我们的目的是最小化代价函数(cost function),而根据高等数学的导数知识:

一个函数在某一点的导数描述了这个函数在这一点附近的变化率。

因此,如果用代价函数对输出激活值 {a^L} 求导,就可以刻划出输出激活值的改变,会对cost造成多大的影响: \frac{{\partial C}}{{\partial a_j^L}}
顺水推舟,作者就定义了一个“误差”的概念,用来表示神经元的输出变化,会对cost造成多大的影响——影响大,误差就大;影响小,误差就小。
但是这里有一个概念上的替换需要注意:作者实际上并没有把误差定义成代价函数对输出激活值  {a^L} 的导数  \frac{{\partial C}}{{\partial a_j^L}} ,而是代价函数对带权输入 z  的导数 \frac{{\partial C}}{{\partial z_j^l}}
我第一眼看到这个定义的时候,觉得把误差定义成代价函数对输出激活值的导数更自然——作者已经在书里解释了为什么要这样做:结果是差不多的,但是数学推导会变得更复杂,所以就把误差定义成了一个看起来“不那么自然”的东西。
文章来源:http://www.codelast.com/
总结一下:
已知 C = C(a)a = \sigma (z) ,并且我们希望用 C 对 z 的导数 \frac{{\partial C}}{{\partial z}} 来表示神经元的输出对 cost 造成的影响,所以根据复合函数的求导法则,就可以得到反向传播的第一个基本方程了。

但有一点奇怪的是,为什么要定义这个“误差”呢?定义它是为了能找到计算  \frac{{\partial C}}{{\partial w}} 以及  \frac{{\partial C}}{{\partial b}} 的方法——计算这两个值就是反向传播的目的。

[原创] 《Neural Networks and Deep Learning》读书笔记:反向传播的4个基本方程(1)
Tagged on:                 

发表评论

电子邮件地址不会被公开。 必填项已用*标注