上一章中神经网络的学习是通过数值微分计算的神经网络的权重参数的梯度。数值微分虽然简单,也容易实现,但缺点是计算上比较费时间。本章将学习一个能够高效计算权重参数的梯度的方法一一误差反向传播法。
误差反向传播法能够高效计算权重参数的梯度的方法
要正确理解误差反向传播法,一般有两种方法:一种是基于数学式,另一种是基于计算图
计算图
计算图将计算过程用图形表示出来。这里说的图形是数据结构图,通过多个节点和边表示(连接节点的直线称为“边”)。
下面看一个用计算图解解决的简单问题,
问题1: 你在超市买了2个100元一个的苹果,消费税是10%,计算支付金额。
问题2: 你在超市买了2个苹果、3个橘子。其中,苹果每个100元橘子每个150元。消费税是10%,请计算支付金额。
计算图如下:
综上,用计算图解题的情况下,需要按如下流程进行
1.构建计算图。
2.在计算图上,从左向右进行计算
“从左向右进行计算”是一种正方向上的传播,简称为正向传播(forward propagation),如果是在计算图上从右向左进行传播,则称为反向传播(backward propagation)。反向传播将在接下来的导数计算中发挥重要作用。
局部计算
计算图的特征是可以通过传递“局部计算”获得最终结果。
局部计算是指,无论全局发生了什么都能只根据与自已相关的信息输出接下来的结果。
看下面这个例子:
比如,在超市买了2个苹果其他很多东西。
这里的重点是,各个节点处的计算都是局部计算。这意味着,例如苹果和其他很多东西的求和运算(4000 + 200 = 4200)并不关心4000这个数字是如何计算而来的,只要把两个数字相加就可以了。
也就是说,各个节点公只需进行与自己有关的计算(在这个例子中是对输入的两个数字进行加法运算),不用考虑全局。
为何用计算图解题
计算图的优点到底是什么?一个优点就在于局部计算。无论全局是多么复杂的计算,都可以通局部计算使各个节点致力于简单的计算,从而简化问题。
另一个优点是用计算图可以将中间的计算结果全部保存起来。
实际上,使用计算图最大的原因是,可以通过反向传播高效计算导数。
如上图所示,反向传播使用与正方向相反的箭头(粗线)表示。反向传播传递“局部导数”,将导数的值写在箭头的下方。在这个例子中,反向传播从右向左传递导数的值(1 → 1.1 → 2.2)。从这个结果中可知,“支付金额关于苹果的价格的导数”的值是 2.2。这意味着,如果苹果的价格上涨 1 元,最终的支付金额会增加 2.2 元(严格地讲,如果苹果的价格增加某个微小值,则最终的支付金额将增加那个微小值的 2.2 倍)
链式法则
传递局部导数的原理,是基于链式法则(chain rule)的。本节将介绍链式法则,并阐明它是如何对应计算图上的反向传播的。
计算图的反向传播
如前所述,“支付金额关于苹果的价格的导数”的值可以通过计算图的反向传播求出来。先来看一下结果,如下图所示,可以通过计算图的反向传播求导数
话不多说,先来看一个使用计算图的反向传播的例子。假设存在y=f(x)的计算,这个计算的反向传播如图
如图所示,反向传播的计算顺序是,将信号E乘以节点的局部导数,然后将结果传递给下一个节点。这里所说的局部导数是指正向传播中y=f(x)的导数。把这个局部导数乘以上游传过来的值(本例中为E)然后传递给前面的节点。
(如何求函数的导数 数学方法)
这就是反向传播的计算顺序。那么这是如何实现的呢?可以从链式法则的原理进行解释。下面就来介绍链式法则。
什么是链式法则
介绍链式法则时,要先从复合函数说起。复合函数是由多个函数构成的函数。比如,z = (x+y)²是由下面两个式子构成的:
z = t²
t = x + y
链式法则是关于复合函数的导数的性质,定义如下:
如果某个函数由复合函数表示,则该复合函数的导数可以用构点合函数的各个函数的导数的乘积表示。
以上面的函数为例子,z关于t的导数可以用z关于t的导数和t关于x的导数的乘积表示,如下:
其中导数可以像下面这样“互相抵消”,
链式法则和计算图
现在尝试用计算图将链式法则表示出来。
反向传播的计算顺序是先将节点的输人信号乘以节点的局部导数(偏导数),然后再传递给下一个节点。
反向传播
加法节点的反向传播
首先来考虑加法节点的反向传播。这里以z=x+y为对象,观察它反向传播。z=x+y的导数可由下式(解析性地)计算出来。
用计算图表示的话,如图:
加法节点的反向传播将上游的值原封不动地输出到下游
乘法节点的反向传播
接下来,看一下乘法节点的反向传播。这里考虑z=xy。这式子的导数用下面式子表示:
乘法的反向传播会将上游的值乘以正向传播时的输入信号的“翻转值”后传递给下游。翻转值表示一种翻转关系,如图所示,正向传播时信号是x的话,反向传播时则是y; 正向传播时信号是y的话,反向传播时是x
加法的反向传播只是将上游的值传给下游不需要正向传播的输入信号了,但是,乘法的反向传播需要正向传播时的输人信号值。因此,实现乘法节点的反向传播时,要保存正向传播的输入信号
苹果的例子
再来思考一下本章最开始举的购买苹果的例子(2 个苹果和消费税)。这里要解的问题是苹果的价格、苹果的个数、消费税这 3 个变量各自如何影响最终支付的金额。这个问题相当于求“支付金额关于苹果的价格的导数”“支付金额关于苹果的个数的导数”“支付金额关于消费税的导数”。用计算图的反向传播来解的话,求解过程下图所示。
如前所述,乘法节点的反向传播会将输入信号翻转后传给下游。从图的结果可知,苹果的价格的导数是 2.2,苹果的个数的导数是 110,消费税的导数是 200。这可以解释为,如果消费税和苹果的价格增加相同的值,则消费税将对最终价格产生 200 倍大小的影响,苹果的价格将产生 2.2 倍大小的影响。不过,因为这个例子中消费税和苹果的价格的量纲不同,所以才形成了这样的结果(消费税的 1 是 100%,苹果的价格的 1 是 1 元)。