text: 使用计算图解释反向传播算法
  本文内容均来自《鱼书》，即《深度学习入门-基于Python的理论与实现》的第五章。无一丁点原创，但都是使用自己的理解转述。感兴趣的可以买来电子版看看。众所周知，反向传播算法在神经网络中十分重要，其用于计算神经网络中的参数梯度，对与深度学习至关重要。通过反向传播计算得到的各节点的梯度信息，可以根据优化算法（如SGD）来更新网络中的权重参数，才能使得损失值越来越小，使模型训练的越来越好。那么反向传播算法是如何实现的呢？本文正式为了搞清楚这个问题。计算图是将计算过程用图形表示的一种方法。通过多个节点和边的有序连接，使得计算过程清晰易懂。下面举个例子简单了解计算图。圆圈代表乘法，边代表了计算的数据。这就是一个使用计算图来表示一个简单的计算过程的例子。了解了计算图之后，接下来聊一聊什么是前向传播。综合上述两个例子可以看出，计算图的解题流程如下：（1）构建计算图。（2）在计算图上从左向右进行计算。这里的步骤（2）从左向右计算是一种正方向上的计算，简称为正向传播，也叫前向传播。既然有了前向传播的例子，反向传播自然就很好理解了，即从右向左计算。计算图的特征是通过传递“局部计算”获得最终结果。什么是局部？如图2所示橘子×橘子个数就是局部计算；苹果×苹果个数也是局部计算，而另一个局部计算“+”其实不需要考虑前面两个局部计算，只需要给它局部计算的两个结果即可。即无论全局发生了什么，都可以做到只根据与自己相关的内容输出计算结果。这样做的好处是什么呢？即计算图的优点在哪里呢？但仅仅是这一个优点，计算图的存在也是可有可无的。计算图所做的最大贡献，其实是反向传播的计算。在介绍计算图的反向传播之前，先思考另一个简单的问题：由图3可知，导数值为2.2，即意味着当苹果的单价上涨1元，则需要多支付2.2元。在这个例子中，反向传播从右向左传递导数值（1 -&gt; 1.1 -&gt; 2.2）。这是如何得到的呢，其实这种计算方法的原理来自于链式求导法则。话不多说，先看一个反向传播计算的例子：假设存在  的计算，则这个计算的导数公式为  。这个计算图的反向传播如图4所示：如图所示，反向传播的顺序是将信号E乘以节点的局部导数  ，然后将结果传递给向左的下一个节点。这里的局部导数是正向计算中  的导数。如  ，则局部导数为  ，则  。这就是反向传播的顺序，通过反向传播可以高效的求出各个节点的局部导数值。相信大多数的同学都学习过高等数学中的复合函数的链式求导法则，其定义如下：如果某个函数由复合函数表示，则该复合函数的导数可以用构成该复合函数的各个函数的导数的乘积表示。如：现在使用计算图的反向传播来表示上述公式：由最开始的z，经过了“ **2 ”后，乘以了z对t的局部导数，又经过了“ + ”后到达x，再乘以了t对x的局部导数，可以看到z对x的导数正如上式所示。也就说明了，反向传播算法是基于链式法则的。了解了反向传播的计算方式：各节点都是依照这个规律来进行反向传播计算的。当节点为加法时，我们知道加法的求导数值为1，即上一个信号乘1后，向下一个节点传递。说白了就是原封不动的传递给下一个节点。当节点为乘法时，以  为例，  ，  。如图6所示：乘法的反向传播会将上游的值乘以正向传播时的输入信号的翻转值，即x那边反向传播时乘以y，y那边反向传播时乘以x。此时会考虑到，若是多个节点相乘呢，如  ，此时在x这条边上的反向传播乘以什么值呢，其实稍微想一下链式法则就可以知道，是乘以  ，即各其他边的乘积。由于除法其实就是乘以倒数，故与乘法的反向传播并没有什么不同，减法与加法又及其类似。故计算图的基本的反向传播计算方式都捋清楚了。总之还是一句话：上一个节点的信号，乘以当下要经过的节点的局部导数，然后传递给下一个节点。记住这么个规律就可以了。