反向传播的理论知识(链式法则)

反向传播的理论知识(链式法则) 链式法则理解反向传播的关键是链式法则(连锁律)。链(chai n) 可以理解为链条、锁链等在这里表示多个函数连接在一起使用。链式法则意为连接起来的多个函数(复合函数)的导数可以分解为各组成的数的导数的乘积。下面看一个链式法则的具体例子。假设有一个雨数y F ( x ) y F(x)yF(x)这个函数F FF由3 个函数组成:α A ( x ) α A(x)αA(x)、b B ( α ) b B(α)bB(α)和y C ( b ) y C(b)yC(b)(的。该函数的计算图如图5-1所示。这时y yy对z zz的导数可以用式子5.1 表示。d y d x d y d b d b d a d a d x \frac{dy}{dx} \frac{dy}{db} \frac{db}{da} \frac{da}{dx}dxdy​dbdy​dadb​dxda​如式子5.1所示 $y到 到到x$ 的导数可以表示为各函数的导数的乘积换言之复合函数的导数可以分解为各组成的数导数的乘积。 这就是链式法则式子5.1 所表示链式法则也可以保下面这样写成包含d y d x \frac{dy}{dx}dxdy​的形式。d y d y \frac{dy}{dy}dydy​是对自身求导导数值永远为1。计算时通常省略d y d y \frac{dy}{dy}dydy​这种针对自身的导数 但考虑到反向传播的实现这里且特意了这一项。反向传播的推导下面仔细观察式子5.2。式子5.2表示复合函数的导数可以分解为各函数导数的乘积。但是它并没有规定各导数相乘的顺序。当然这一点我们可以自由决定。这里我们按照式子5.3的方式以输出到输人的顺序进行计算。d y d x ( ( d y d y d y d b ) d b d a ) d a d x \frac{dy}{dx} \left( \left( \frac{dy}{dy} \frac{dy}{db} \right) \frac{db}{da} \right) \frac{da}{dx}dxdy​((dydy​dbdy​)dadb​)dxda​式子5.3按照从输出到输入的顺序进行导数的计算计算方向与平时相反。这时式子5.3的计算流程如图5-2所示。在图5-2中导数是按照从输出y yy到输入x xx的方向依次相乘计算得出的。通过这种方法最终得到d y d x \frac{dy}{dx}dxdy​。图5-3是相应的计算图。下面仔细观察图5-3。我们先从d y d x ( 1 ) \frac{dy}{dx}(1)dxdy​(1)开始计算它与d y d b \frac{dy}{db}dbdy​的乘积。这里的去是函数y C ( b ) y C(b)yC(b)的导数。因此如果用C ′ CC′表示函数C CC的导函数我们就可以把式子写成d y d b C ′ ( b ) \frac{dy}{db} C(b)dbdy​C′(b)。同样有d y d b B ′ ( α ) \frac{dy}{db} B(α)dbdy​B′(α)d y d b A ′ ( x ) \frac{dy}{db} A(x)dbdy​A′(x)。基于以上内容 图5-3 可以简化成图5-4 。图5-4把导函数和乘号合并表示为一个函数节点。这样导数计算的流程就明确了。从图5-4中可以看出 $y对各变量的导数 从右向左传播。这就是反向传播。这里重要的 − 点是传播的数据都是 对各变量的导数从右向左传播。这 就是反向传播。这里重要的-点是传播的数据都是对各变量的导数从右向左传播。这就是反向传播。这里重要的−点是传播的数据都是y $ 的导数。具体来说就是d y d y \frac{dy}{dy}dydy​、d y d b \frac{dy}{db}dbdy​、d y d a \frac{dy}{da}dady​和d y d x \frac{dy}{dx}dxdy​这种y yy对x x 变量的导数在传播。许多机器学习问题采用了以大量参数作为输入以损失函数作为最终输出的形式。损失函数的输出(在许多情况下)是一个标量值它是重要人物 。这意味着我们需要找到损失函数对每个参数的导数。在这种情况下如果沿着从输出到输入的方向传播导数只要传播一次就能求出对所有参数的导数。因为该方法的计算效率较高所以我们采用反向传播导数的方式。用计算图表示下面我们把正向传播的计算图( 图 5- 1 )和反向传播的计算图( 图 5- 4 ) 以上下排列的方式画出来。从图5-5 可以看出正向传播和反向传播之间存在明确的对应关系n 例如正向传播时的变盘α 对应于反向传播时的导数d y d x \frac{dy}{dx}dxdy​。同样 b 对应于d y d x \frac{dy}{dx}dxdy​x对应于d y d x \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 之后就能对每个函数迸行反向传播的计算了。以上就是反向传播理论知识的相关内容这是本书的难点之一。大家现在呵能还没完全弄明白但是实际运行代码后就会理解得越来越透彻。在下一个步骤我们将实现反向传播 并通过实际运行代码来验证它。