# 1.计算图的正向传播与反向传播 计算图 计算图就是一种表示计算过程的数据结构图。计算图通过节点表示某种运算,用带箭头的边表示运算的方向,箭头上标有与运算相关的数据。上图就是一张计算图。 正向传播 上图中黑色箭头表示的就是正向传播。将输入数据x通过某种运算f转化为输出数据y,再传给下一个节点(或输出为最后结果)。 反向传播 上图中灰色箭头表示的就是反向传播。沿着与正向传播相反的方向,将输入数据E乘以局部导数∂y/∂x后传给下一个节点(或输出为最后结果)。 # 2.高效地计算导数 举个例子 式子z = (x+y)^2可以看作是由z = t^2和t = x+y构成的。将其用如下计算图表示出来 根据链式法则可以作进一步转换,得到下图 我们可以发现通过先进行一次正向传播再进行一次反向传播,我们可以得到各个变量的导数值。 这个求导过程是高效的。原因如下 1.中间变量可以重复利用。(如∂z/∂t在计算∂z/∂x和∂z/∂y时都有用到) 2.节点负责封装解析性求局部导数的过程。(没有像数值微分那样用定义求导,而是用解析性公式求导。如x^2的导数是2x) 下面用python实现上述例子的求解导数过程: class AddLayer: def __init__(self): pass # 表示什么也不运行 def forward(self, x, y): # 前向函数,入口参数为加法的两个参数