链式法则
理解反向传播的关键是链式法则(连锁律)。链(chai n) 可以理解为链条、
锁链等,在这里表示多个函数连接在一起使用。链式法则意为连接起来的多
个函数(复合函数)的导数可以分解为各组成的数的导数的乘积。
下面看一个链式法则的具体例子。假设有一个雨数y=F(x)y = F(x)y=F(x) ,这个函数
FFF 由3 个函数组成: α=A(x)α = A(x)α=A(x) 、b=B(α)b = B(α)b=B(α) 和y=C(b)y = C(b)y=C(b)(的。该函数的计算图如图5-1
所示。

这时, yyy对zzz 的导数可以用式子5.1 表示。
dydx=dydbdbdadadx\frac{dy}{dx} = \frac{dy}{db} \frac{db}{da} \frac{da}{dx}dxdy=dbdydadbdxda
如式子5.1所示, $y 到到到x$ 的导数可以表示为各函数的导数的乘积,换言之,
复合函数的导数可以分解为各组成的数导数的乘积。 这就是链式法则式子
5.1 所表示链式法则也可以保下面这样写成包含dydx\frac{dy}{dx}dxdy的形式。
dydy\frac{dy}{dy}dydy是对自身求导,导数值永远为1。计算时通常省略dydy\frac{dy}{dy}dydy这种针对自身
的导数, 但考虑到反向传播的实现,这里且特意了这一项。
反向传播的推导
下面仔细观察式子5.2。式子5.2表示复合函数的导数可以分解为各函
数导数的乘积。但是,它并没有规定各导数相乘的顺序。当然,这一点我
们可以自由决定。这里,我们按照式子5.3的方式以输出到输人的顺序进行
计算。
dydx=((dydydydb)dbda)dadx\frac{dy}{dx} = \left( \left( \frac{dy}{dy} \frac{dy}{db} \right) \frac{db}{da} \right) \frac{da}{dx}dxdy=((dydydbdy)dadb)dxda
式子5.3按照从输出到输入的顺序进行导数的计算,计算方向与平时相反。
这时,式子5.3的计算流程如图5-2所示。

在图5-2中,导数是按照从输出yyy 到输入xxx 的方向依次相乘计算得出的。
通过这种方法,最终得到dydx\frac{dy}{dx}dxdy。图5-3是相应的计算图。

下面仔细观察图5-3。我们先从dydx(=1)\frac{dy}{dx}(=1)dxdy(=1) 开始,计算它与dydb\frac{dy}{db}dbdy的乘积。这
里的去是函数y=C(b)y= C(b)y=C(b) 的导数。因此,如果用C′C'C′ 表示函数CCC 的导函数,我
们就可以把式子写成dydb=C′(b)\frac{dy}{db}= C'(b)dbdy=C′(b) 。同样,有dydb=B′(α)\frac{dy}{db}= B'(α)dbdy=B′(α) ,dydb=A′(x)\frac{dy}{db}= A'(x)dbdy=A′(x) 。基
于以上内容, 图5-3 可以简化成图5-4 。

图5-4,把导函数和乘号合并表示为一个函数节点。这样导数计算的流
程就明确了。从图5-4中可以看出, "$y 对各变量的导数"从右向左传播。这就是反向传播。这里重要的−点是传播的数据都是对各变量的导数"从右向左传播。这
就是反向传播。这里重要的-点是传播的数据都是对各变量的导数"从右向左传播。这就是反向传播。这里重要的−点是传播的数据都是y $ 的导数。具体来说,就
是dydy\frac{dy}{dy}dydy、dydb\frac{dy}{db}dbdy、dyda\frac{dy}{da}dady和dydx\frac{dy}{dx}dxdy这种"yyy 对x x 变量的导数"在传播。
许多机器学习问题采用了以大量参数作为输入,以损失函数作为最终输
出的形式。损失函数的输出(在许多情况下)是一个标量值,它是"重要人物" 。
这意味着我们需要找到损失函数对每个参数的导数。在这种情况下,如果沿
着从输出到输入的方向传播导数,只要传播一次,就能求出对所有参数的导
数。因为该方法的计算效率较高,所以我们采用反向传播导数的方式。
用计算图表示
下面我们把正向传播的计算图( 图 5- 1 )和反向传播的计算图( 图 5- 4 ) 以
上下排列的方式画出来。

从图5-5 可以看出,正向传播和反向传播之间存在明确的对应关系n 例如,
正向传播时的变盘α 对应于反向传播时的导数dydx\frac{dy}{dx}dxdy。同样, b 对应于dydx\frac{dy}{dx}dxdy,x对
应于dydx\frac{dy}{dx}dxdy。我们也可以看出函数之间存在对应关系。例如,函数B 的反向传
播对庇于B′(α)B'(α)B′(α) , A 对应于A′(x)A'(x)A′(x) 。这样一来,我们可以认为变虽有普通值和
导数值,函数有普通计算(正向传播)和求导计算(反向传播)。于是, 反向传
播就设计好了。
最后来关注一下图5-5 中C′(b)C'(b)C′(b) 的函数节点。它是$y = C(b) 的导数,但要注意的是,计算的导数,但要
注意的是,计算的导数,但要注意的是,计算C’(b)$ 需要用到b 的值。同理,要计算B′(α)B' (α)B′(α) 就得输入α 的值。
这意味着进行反向传播时需要用到正向传播中使用的数据。因此,在实现反
向传播时,需要先进行正向传播并且存储各两数输入的变量值,也就是前
面例子中的x 、α 和b , 之后就能对每个函数迸行反向传播的计算了。
以上就是反向传播理论知识的相关内容,这是本书的难点之一。大家现
在呵能还没完全弄明白,但是实际运行代码后,就会理解得越来越透彻。在
下一个步骤,我们将实现反向传播, 并通过实际运行代码来验证它。
&spm=1001.2101.3001.5002&articleId=159199432&d=1&t=3&u=eac08cb010ff4cd4ac4d1f62bdc66bbc)
1721

被折叠的 条评论
为什么被折叠?



