神经网络计算导数的秘诀:计算图中的反向传播

神经网络计算导数的秘诀:计算图中的反向传播

参考网站:http://colah.github.io/posts/2015-08-Backprop/

构建一个计算图

先以一个简单的公式为例:
e=(a+b)*(b+1)
我们可以把这个公式分成两个部分:c=a+bd=b+1,则e=c*d
接下来,我们创建一个计算图:把所有的参数都列出来,并根据他们之间的关系用箭头将其连接起来:
在这里插入图片描述
为了方便计算,我们给最初的输入参数ab幅值,令a=2b=1,这时我们的计算图变为下面这样:
在这里插入图片描述

计算导数

依据我们的常识,当a变化时,c也会变化。a影响着c,但是a是如何影响c的,这就需要导数来表示。我们在这个计算图中遇到的主要是加法和乘法的导数:
在这里插入图片描述
如果要向去理解计算图中的导数,我们首先要计算一下每个箭头的导数,即我们只计算箭头前后两个节点的导数:
在这里插入图片描述
接下来,我们知道了a可以直接影响c,而c也影响着e,那么a是如何影响e呢?
当a以1的速度变化时,c也会以1的速度变化(因为c关于a的导数为1)。c以1的速度变化时,e以2的速度变化,因此当a以1的速度变化时,e以1*2的速度变化。
因此,计算图中计算导数的规则是:找到一个节点到另一个节点所有的可能路径,将路径上每条边的导数相乘。依据这个规则,e关于b的导数就是:
在这里插入图片描述
这个导数表明了b如何通过c影响e,又如何通过d影响e。这种路径和(sum over paths)的规则只是多元链式法则的另一种思考方式。感兴趣的可以去学习多元链式法则

因子分解路径(Factoring Paths)

路径和求解导数的方法虽然简单易懂,但是当计算图复杂时,它的计算量就会非常巨大。例如:
在这里插入图片描述
要计算Z关于X的导数,使用路径和的方法,首先要求出所有从X到Z的路径:
X到Y有三条路径 α \alpha α, β \beta β, γ \gamma γ,Y到Z也有三条路径。那么Z到X的路径有3*3=9条。Z关于X的导数为:
在这里插入图片描述
当计算图更加复杂时,计算量会呈指数型的增长。代替简单的使用路径和,我们可以考虑使用一种更简单的方式:
在这里插入图片描述
这就是前向传播与反向传播的由来,他们通过分解路径来对导数进行求解。他们将每个节点上的路径和并在一起,这样只需要对每两个节点之间的路径遍历一次就可以。
在这里插入图片描述
在这里插入图片描述
前向传播是跟踪一个输入如何影响每一个节点。反向传播是跟踪每一个节点如何影响输出。也就是说前向传播是把运算符 ∂ / ∂ X \partial/\partial X /X应用到每个节点,而反向传播是把 ∂ Z / ∂ \partial Z/\partial Z/应用于每个节点。

反向传播

这个一部分我们讲一下反向传播相比较前向传播的优势。还是以之前的计算图为例:
在这里插入图片描述
我们首先计算b的前向传播,以即每个节点与b的关系:
在这里插入图片描述
∂ e / ∂ b \partial e/\partial b e/b表示了输出对于输入b的函数。
接下来我们计算e的反向传播:
在这里插入图片描述通过反向传播我们可以得到每个节点与输出的关系,一次性地得到了e对于输入a的导数和e对于输入b的导数,这样加速了我们求解导数的速度。
设想一下,如果有一个函数有一百万个输入和一个输出,如果使用前向传播模型,我们需要遍历一百万次才能得到输出关于每一个输入的导数,但是使用反向传播模型,我们可以一次计算出所有的导数。
在训练神经网络时,我们把代价cost看作是具有多个参数的函数,我们要计算cost对于所有参数的导数,以进行梯度下降。在一个网络中通常有数百万甚至数千万个参数,使用反向传播能够极大地加速导数求解多个过程。
按照这个理论,实际上也存在前向传播比反向传播更快的情况,就是当一个函数有多个输出,但是只有一个输入时,前向传播的速度更快。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值