正向传播和反向传播

本文详细解释了正向传播在计算图中的工作原理,强调了局部计算的优势,并介绍了反向传播(BP算法)如何通过链式法则进行导数计算。以Sigmoid函数和Softmax-with-Loss层为例,展示了反向传播的步骤及其在深度学习参数优化中的作用。
摘要由CSDN通过智能技术生成

正向传播与反向传播

正向传播

正向传播非常好理解,就是一步一步算到最后。
计算图1
这是一个基于计算图求解出最后结果的一个例子。一步步从左向右计算,最后得出结果,这就是称为正向传播(forward propagation)。
使用计算图的好处:局部计算。
计算图的特征是可以通过传递“局部计算”获得最终结果。“局部”这个词的意思是“与自己相关的某个小范围”。局部计算,指无论全局发生了什么,都能只根据与自己相关的信息输出接下来的结果。
举个例子:
计算图2
假设(经过复杂的计算)购买的其他很多东西总共花费4000元。这里的重点是,各个节点处的计算都是局部计算。这意味着,例如苹果和其他很多东西的求和运算(4000 + 200 = 4200)并不关心4000这个数字是如何计算而来的,只要把两个数字相加就可以了。换言之,各个节点处只需进行与自己有关的计算(在这个例子中是对输入的两个数字进行加法运算),不用考虑全局。
综上,计算图可以集中精力于局部计算。无论全局的计算有多么复杂,各个步骤所要做的就是对象节点的局部计算。虽然局部计算非常简单,但是通过传递它的计算结果,可以获得全局的复杂计算的结果。
这和递归分治的思路是差不多的,用小而简单的部分解得出最终复杂问题的解。
因为计算图拥有计算局部性的优点,所以可以通过正向传播和反向传播高效地计算各个变量的导数值,从而高效的完成计算。

链式法则

例如有这么一个函数:
数学原理1
链式法则是关于复合函数的导数的性质,定义如下:
如果某个函数由复合函数表示,则该复合函数的导数可以用构成复合函数的各个函数的导数的乘积表示。
数学原理2
数学原理3

反向传播

计算图的反向传播(backward propagation)也就是BP算法,计算的方式:沿着与正方向相反的方向,上游传来的导数乘上局部导数,得出传给下游的导数。
这样通过链式法则,就能够完成反向传播了。例:
计算图3
计算图4
下面介绍一些节点的反向传播的方法

加法节点的反向传播

计算图5
首先来考虑加法节点的反向传播。这里以z = x + y为对象,观察它的反向传播。z = x + y的导数可由下式(解析性地)计算出来。
数学原理4
那么其反向传播就如下:
计算图6
加法节点的反向传播将上游(反向传播右边为上游)的值原封不动地输出到下游,例如:
计算图7

乘法节点的反向传播

计算图8
接下来,我们看一下乘法节点的反向传播。这里我们考虑z = xy。这个式子的导数用式(5.6)表示。
数学原理5
乘法的反向传播会将上游的值乘以正向传播时的输入信号的“翻转值”后传递给下游。翻转值表示一种翻转关系,如下图,正向传播时信号是x的话,反向传播时则是y;正向传播时信号是y的话,反向传播时则是x。
计算图9
例子:
计算图10
注意:因为乘法的反向传播会乘以输入信号的翻转值,所以各自可按1.3 * 5 = 6.5 , 1.3 * 10 = 13计算。另外,加法的反向传播只是将上游的值传给下游,并不需要正向传播的输入信号。但是,乘法的反向传播需要正向传播时的输入信号值。因此,实现乘法节点的反向传播时,要保存正向传播的输入信号。

其他节点的反向传播

其实还会有很多复杂的节点例如log节点,exp节点,/节点等等,其实会计算各种归根到底就是学会如何求这些函数的导数罢了。因此列举加法节点和乘法节点就是为了抛砖引玉,使得我们更形象的理解反向传播。

实例

接下来看一个比较复杂的函数的正向传播和反向传播的过程。

Sigmoid函数

数学原理6
Sigmoid函数计算图的正向传播过程:
计算图11
接下来进行反向传播:
为了方便表示,我们令数学原理7

  • 1.“/”节点表示 ,它的导数可以解析性地表示为下式:
    数学原理8
    计算图12
  • 2.“+”节点将上游的值原封不动地传给下游。计算图如下所示:
    计算图13
  • 3.“exp”节点表示y = exp(x),它的导数由下式表示:数学原理9
    计算图14
  • 4.“×”节点将正向传播时的值翻转后做乘法运算。因此,这里要乘以−1。
    计算图15
    至此,反向传播已经完成。可以整理一下:
    数学原理10
    那么我们可以定义一个Sigmoid节点,其反向传播表示如下:
    计算图16
Softmax-with-Loss层

下面来实现Softmax层。考虑到这里也包含作为损失函数的交叉熵误差(cross entropy error),所以称为“Softmax-with-Loss层”(Softmax函数和交叉熵误差)。
其正向传播如下:
计算图17
为了方便表示,我们进行一下变量替换如下:
数学原理11
值得注意的是:
数学原理12
因为计算图是局部计算,图中的求导是将前面两个输入节点的看成不同变量的。虽然二者可能相关,但是还是要看成不同的变量,因此需要使用图的乘法规则来进行反向传播的计算。
接下来让我们一步步看看反向传播如何进行。
首先,交叉熵误差的反向传播:
计算图18
数学原理13
“x”节点上游传过来的导数为1
“+”节点上游传过来的导数为-1
那列“x”节点上游传过来的导数都为-1
那列log节点上有传过来的导数分别为-t1、-t2、-t3
计算图19
数学原理14
这里遇到“x”节点。“×”节点将正向传播的值翻转后相乘。这个过程中会进行下面的计算。
数学原理15
即传给“/”的导数如下:
计算图20
数学原理16
“+”节点原封不动地传递上游的值。
“×”节点将值翻转后相乘。
因为上面令数学原理17
所以数学原理18
计算图21
最后exp节点的反向传播如下:
计算图22
因为exp(x)的导数就是exp(x),求导还是他本身
所以第一个exp节点最后反向传播的结果(正向分流,反向合流):数学原理19
因为开始令数学原理20所以最后就是 y 1 − t 1 y_1-t_1 y1t1
最终反向传播结果如下:
计算图23
至此,Softmax-with-Loss 层反向传播的推导完成。
虽然一眼看上去感觉这个计算图十分复杂,但是一步步走过去每一步都是蛮简单的,这就是计算图的局部计算的优势了。
然后现在指定一个学习率 l r lr lr(0.001等),假设我们第一个输入是 a 1 a_1 a1经过反向传播得到的误差为 y 1 − t 1 y_1-t_1 y1t1,那么更新a1的公式: a 1 ∗ = a 1 − l r ∗ ( y 1 − t 1 ) a_1 * = a_1 - lr * (y_1-t_1) a1=a1lr(y1t1)
这就是BP算法思想的核心,即先正向传播,计算出误差(损失值,通常会用一个损失函数来衡量预测值与真实值的差距,例如交叉熵函数、均方误差函数等等),然后将误差反向传播,得出每个参数应当做多少的修改以更接近真实值,让误差变小,从而使模型进行训练。
深度学习模型的训练就是依靠误差反向传播调整参数进行的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z7ziXxi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值