Skip to content
Cavill's Blog
Go back

从计算图理解反向传播

Edit page

神经网络中的每一次计算,本质上都可以拆解成一系列简单运算,例如加法、乘法、指数、对数等。
为了更清楚地描述这些计算过程,我们通常使用 计算图(Computational Graph)。因此,这也是对神经网络的一种抽象
计算图是一种有向无环图(Directed Acyclic Graph, DAG),其中:

计算图最大的优势在于,它将一个复杂的表达式拆分成许多简单的局部计算,使得每一步都可以独立分析。这不仅使前向计算更加直观,也为后面的反向传播提供了基础。

Computational Graphs

例如,考虑以下表达式 e=(a+b)×(b+1)e=(a+b)\times(b+1)。这里有三种运算:两种加法和一种乘法。为了便于讨论,我们引入两个中间变量,ccdd。这样,每个函数的输出都有一个变量。现在我们有:

其中 wiw_i 为上一个节点对于对应边的下一个节点的偏导数。i=1,2,3i = 1,2,3…

复合偏导数求导法则

如果 z=f(u,v)z = f(u,v),其中 u=φ(x,y)u = \varphi(x, y), v=ψ(x,y)v = \psi(x, y),则:

  • xx 的偏导数:zx=fuux+fvvx\frac{\partial z}{\partial x} = \frac{\partial f}{\partial u} \frac{\partial u}{\partial x} + \frac{\partial f}{\partial v} \frac{\partial v}{\partial x}
  • yy 的偏导数:zy=fuuy+fvvy\frac{\partial z}{\partial y} = \frac{\partial f}{\partial u} \frac{\partial u}{\partial y} + \frac{\partial f}{\partial v} \frac{\partial v}{\partial y}

因此我们可以这样求出 eb\frac{\partial e}{\partial b}
eb=w1×w3+w4×w5\frac{\partial e}{\partial b} =w_1 \times w_3 +w_4 \times w_5 。同理易得 ea=w1×w2\frac{\partial e}{\partial a} =w_1 \times w_2

但显然这几乎是最简单的一种形式,对于复杂的神经网络而言,往往会出现非常大量的参数和非常多的层数,面对这么大规模的交互,产生的路径组合也是非常大规模的。

如果要算 aabbccLL,那么我们会得到 w1w2+w1w3+w1w4w_1w_2+w_1w_3+w_1w_4。这里我们需要做 33 次乘法和 22 次加法。

但是如果从 LLaabbcc,我们会得到 w1(w2+w3+w4)w_1(w_2+w_3+w_4)。这里我们只需要做 22 次加法和 11 次乘法。而反向传播的思想与因式分解类似。它通过复用已经计算出的中间梯度,将链式法则中的重复计算提取出来。

当然,对于这个例子而言,优化确实不大。但是如果假设 w1w_1 被数亿个参数共享呢?这样我们可以节约无数的时间,因为自上而下或者说反向计算可以让我们只做一次乘法,并且我们省去了无数不必要的重复计算。本质上来说,这是「动态规划」。

因此,「反向传播」并不是一种新的求导方法,而是对链式法则的一种高效组织方式。它通过保存并复用中间梯度,将原本庞大的重复计算转化为一次有序的反向遍历。正是这种对计算过程的重新组织,使得现代深度神经网络的训练成为可能。


Edit page
Share this post:

Previous Post
Monty Hall problem