从反向传播的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^L\) , \(a_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}}\) 的方法——计算这两个值就是反向传播的目的。
文章来源:https://www.codelast.com/
➤➤ 版权声明 ➤➤
转载需注明出处:codelast.com
感谢关注我的微信公众号(微信扫一扫):
