一、定义
计算图是一种有向图,用来表达输入、输出以及中间变量之间的计算关系,图中每一个结点代表一种数学运算。例如求函数的计算图,那么该计算图如下所示:
不难发现,该图是一个有向图,其中结点包含运算符,边代表着运算结果。
二、计算图的前向计算
计算图的前向计算就是从起始位置x,y开始,每次运算只关注当前运算结点得出的运算结果,最终得出输出结果。除了上图的基础运算,也可以进行求一阶导、求偏导等更复杂的操作。
三、计算图的反向计算
若要计算图的反向传播,首先我们需要根据图的输入把计算结果写出来,也就是优先对图进行前向计算。下述的图为函数
之后,我们从计算图的终端开始反向地对每条有向边求导。目前,终端输出的结果即为函数f,我们便对f求关于f自身的导数,得出结果为1,我们在终端对应的边上将计算出的导数1添加上来。
接下来,我们去计算函数的关于x的导数,即
,然后我们将上游边的值(1.14)带入该导数,即
,然后我们在用之前计算出来的边上的导数1.00乘上
,得出一个值,将该值添加到指向
结点的有向边上。
以此类推,从图的终端开始,反向地遍历该图,算出每个结点的导数,然后将指向该结点的边上的值代入到该导数中,再乘上以该结点为起点的边上的值,然后将图上的每个结点输出值关于输入值的局部梯度计算出来。
四、计算图的颗粒度
在之前的反向传播过程中,需要对每个结点分别地去进行求导,如果函数过于负责,那么计算起来会过于复杂。通过观察可知,该图后面的几个结点就是sigmoid函数,那么可以将后面的几个结点视为一个大的结点,对这个结点进行求导,适当地增大该图的颗粒度。