自动微分(Automatic Differentiation)
2026-02-28
深度学习中的自动微分(Automatic Differentiation, 简称 AutoDiff 或 AD)是现代深度学习框架(如 PyTorch、TensorFlow)的“引擎”。神经网络的训练依赖于梯度下降算法,而要更新网络中成千上万甚至上百亿个参数,我们需要知道损失函数对每个参数的导数(梯度)。自动微分模块的作用就是自动、高效、精确地计算这些复杂的导数。
要理解自动微分,我们需要了解它背后的三个核心概念:计算图、前向传播和反向传播。
1. 计算图 (Computation Graph)
深度学习框架不会把数学公式当成一段死板的文本,而是将其解析为一个有向无环图 (DAG)。
- 节点 (Nodes):代表变量(如输入数据、权重参数)或操作符(如加法、乘法、激活函数)。
- 边 (Edges):代表数据的流动方向。
比如,对于一个简单的函数 $f = (x + y) \times z$,框架会创建这样一个图:$x$ 和 $y$ 输入到 + 节点得到中间变量 $q$,然后 $q$ 和 $z$ 输入到 * 节点得到最终结果 $f$。
2. 前向传播 (Forward Pass)
前向传播的过程就是顺着计算图的箭头方向,从输入节点开始,一步步计算出最终的输出结果。
在这个过程中,自动微分模块不仅会计算结果,还会把反向传播求导时所需的中间变量(如上面例子中的 $q$)缓存起来在内存中。
3. 反向传播 (Backward Pass)
这是自动微分的灵魂所在,它基于微积分中的链式法则 (Chain Rule)。
反向传播沿着计算图的箭头反方向走,从最终的输出节点(通常是损失函数)开始,逐层往回计算偏导数(梯度)。
在每一个操作节点上,模块只计算局部梯度 (Local Gradient),然后将其与从上游传下来的全局梯度 (Global Gradient) 相乘,继续往下游传递。
- 继续上面的例子:求 $f$ 对 $x$ 的偏导数 $\frac{\partial f}{\partial x}$。
- 根据链式法则:$\frac{\partial f}{\partial x} = \frac{\partial f}{\partial q} \times \frac{\partial q}{\partial x}$。
- 因为 $f = q \times z$,所以 $\frac{\partial f}{\partial q} = z$。因为 $q = x + y$,所以 $\frac{\partial q}{\partial x} = 1$。
- 最终 $\frac{\partial f}{\partial x} = z \times 1 = z$。
通过这种“局部计算 + 链式相乘”的方式,无论神经网络有多深、多复杂,自动微分都能通过计算机的基本加减乘除精确地把所有参数的梯度计算出来。