7.4.3 误差反向传播算法
用一节篇幅去介绍一个算法细节,无论是从本书的主旨还是一贯的行文风格来说,都显得有些格格不入。但误差反向传播算法在神经网络领域实在是举足轻重,而且极有讨论价值:一方面,在今天的神经网络研究学习资料里,它是无可争议的“必修课程”,只要是涉及神经网络的教科书,它都必定占有一席之地;另一方面,随着深度学习的兴起,误差反向传播算法现在又处在风口浪尖上,以它的发明人辛顿为首的一批学者,正在考虑“另起炉灶”,彻底抛弃误差反向传播算法。只有在本节讲清楚这个算法的内容,后面才能说明白它在深度学习时代的不足之处,为什么它的发明人现在要抛弃它。基于这些原因,笔者不打算只讲原理和作用,而是准备从它所解决的问题出发,把它的思路和细节都详细介绍一下。
这部分不可避免地要涉及一些微积分的基础知识,如果读者对这部分不关注,可以略过其中的公式和推导过程,仅从文字上领略这个算法的思路和来龙去脉。但假如读者是这个方向的开发或者研究人员的话,那这个算法的推导过程恐怕必须死磕,绕不过去。
假如我们换一种理解方式来看待神经网络,把网络的每一层都使用一个函数符号来表示的话,那不难发现,多层神经网络就等价于多个函数的逐层嵌套。关于求嵌套函数导数的方法,计算机领域中已经有了成熟的解决方案:数学和计算机代数中的自动微分(有时称作“演算式微分”)就是一种有着固定迭代步骤,可以借由计算机程序运行的嵌套函数的导数计算方法。在思路上,误差反向传播算法其实是自动微分技术在反向积累模式的特例。
如图7-5所示,我们先考虑最简单的情况,忽略其他神经元的影响,每层只关注一个神经元,数据从输入层的神经元x到隐层的神经元u之间的变换用函数$g ( x ) = u$ 来表示,从隐层的神经元 u 到输出层的神经元y 的变换用 $f ( u ) = y$ 来表示。
250
第三部分 第三波高潮