计算图(Computational Graph)的角度理解反向传播算法(Backpropagation)
最近在回看反向传播算法(Backpropagation,BP算法)时,注意到目前各大深度学习框架如Tensorflow,Theano,CNTK等都以计算图(Computational Graph)作为描述反向传播算法的基础。
计算图
计算图是用来描述计算的语言,是一种将计算形式化的方法。在计算图中,计算被表示成有向图,图中的每一个节点表示一个变量(variable),变量可以是标量(scalar)、向量(vector)、矩阵(matrix)、张量(tensor)等。图中的边表示操作(operation),即一个或多个变量的简单函数。如果变量经过一个操作计算得到变量,那么我们画一条从到的有向边。下图是计算图的一个简单例子:
同样我们也可以描述多变量函数,下图展示了Logistic回归的计算图
在计算中,有些中间结果在代数表达式中没有名称,但是在图形中是需要的,比如上图中、和、。当同一个变量多次出现在代数表达式中时,在计算图中需要将其当作不同的变量对待。例如式子的计算图如下
计算表达式的值时,我们从叶子节点开始,顺着有向边逐步归约到根节点即可得到整个表达式的值,可以看作是BP算法的前向传播过程。剩下需要解决的是计算图的求导过程,对应于BP算法的反向传播过程。
首先需要复习下求导的链式法则:
case 1
因为的变化会带来的变化,的变化最终影响的变化,所以
即图中一个顶点对另一个顶点的导数等于该顶点到另一个顶点的路径上所有导数的乘积。
case 2
因为是一个二元函数,受到和的影响,而的变化又同时影响到和,所以
即当存在从一个顶点到另一个顶点的多条路径时,那么这个顶点对另一个顶点的导数等于所有路径上导数的和。
下面通过两个例子直观展示下计算图求导过程:
Example 1:e=(a+b)*(b+1)
首先画出表达式的计算图,然后计算出每条边的导数,最后根据求解问题,找出所有的路径。如图,我们可以轻松写出和。只对应了黄色箭头路径,因此。对应了两条红色箭头路径,因此。
当出现同一个变量多次出现在代数表达式中时,虽然在画计算图时我们将其当作不同的变量对待,但是计算该变量的导数值时,我们需要将图中关于该变量的所有导数值相加。仍然以为例:
因为在表达式中共出现三次、和,因此我们需要分别计算出、和,然后将其相加。当计算出每一条边的导数后,就可以将出现在不同位置的相同变量同等对待了,因此
反向传播算法的计算图
多层神经网络的表达式可以写成:
对于一个双隐层神经网络,其计算图如图所示:
图中是输入数据,是一个向量,表示层与层之间的连接权重,是一个矩阵,表示偏置向量,是网络的输出,是损失值,是一个标量。为了计算出参数的梯度,首先需要出每条边的偏导数,因为存在顶点是向量和矩阵的情况,所以涉及到向量对向量的导数和向量对矩阵的导数。
向量对向量的导数
对于标量对向量的导数我们已经会求,推广到向量对向量的导数时,我们分步将向量中每一个元素对向量求偏导,然后将结果组合成一个矩阵,实际也确实是这样。具体的,假设是m维向量,是n维向量,将中每一个元素对的偏导数横排放成行,最终将形成一个的矩阵,这个矩阵就是Jacobian矩阵。以Sigmoid函数作为**函数为例,和都是向量,因此是一个方阵,
其中,因此当时,,当时,,所以最终的矩阵将是一个对角阵,对角线上的值为。
向量对矩阵的导数
m维向量对维矩阵求导也是向量中每一个元素对矩阵中每一个元素求偏导,因此将得到m个矩阵。这写起来将非常不方便,通常将矩阵变平为一个向量,因此结果是一个的矩阵。以为例:
对于任意一个,其计算结果等于
可以看到,只与矩阵中第有关,因此时,;当时,。所以得到的矩阵中只有第行有值,并且其值正好等于向量。所以的结果如下
依次求出所有边的导数,如下图
最终
参考文献
台湾大学李宏毅Machine Learning and having it deep and structured (2017,Spring)