本页系统化 反向传播(backpropagation):在计算图上高效计算所有参数的 $\partial L / \partial \boldsymbol{\theta}$。
段末注释:反向传播并非独立算法,而是链式法则在 DAG(有向无环图)上的动态规划实现——共享子表达式,避免重复计算。
系列入口:00.系列规划 | 前置:03 Jacobian 与链式法则
1. 计算图(D1–D2)

节点:运算(加、乘、matmul、ReLU…)
边:中间张量
示例:$L = |\sigma(W\mathbf{x} + \mathbf{b}) - \mathbf{y}|^2$
1 | x, W, b -> matmul/add -> z -> ReLU -> a -> loss L |
每个节点保存前向值,供 backward 使用。
2. 反向模式(D3)

初始化:$\bar{L} = \partial L / \partial L = 1$。
对节点 $v$ 的输出 $\mathbf{y}$,已知 $\bar{\mathbf{y}} = \partial L / \partial \mathbf{y}$,求输入 $\mathbf{x}$ 的 $\bar{\mathbf{x}}$:
$$
\bar{\mathbf{x}} = \left(\frac{\partial \mathbf{y}}{\partial \mathbf{x}}\right)^\top \bar{\mathbf{y}}
$$
局部梯度 × 上游梯度 = 下游梯度(链式)。
按拓扑逆序遍历节点,累加多条路径(若 $\mathbf{x}$ 被多处使用)。
3. 模块化 backward(D7)

| 模块 | 前向 | 反向(已知 $\bar{\mathbf{y}}$) |
|---|---|---|
| $y=x+z$ | 加 | $\bar{x}=\bar{y},\ \bar{z}=\bar{y}$ |
| $y=cx$ | 标量乘 | $\bar{x}=c\bar{y}$ |
| $y=Wx$ | Linear | $\bar{W}=\bar{y}x^\top,\ \bar{x}=W^\top\bar{y}$ |
| $y=\max(0,x)$ | ReLU | $\bar{x}=\bar{y} \odot \mathbb{1}_{x>0}$ |
PyTorch Function.apply / Module 封装 forward + backward(10 专篇)。
4. 与优化器衔接(D6)
反向结束 → 各参数 .grad → Math-04 SGD/Adam 更新。
一次迭代:
zero_grad()- forward → $L$
backward()→ 填充.gradoptimizer.step()
5. 局限(D8)

| 问题 | 说明 |
|---|---|
忘记 zero_grad |
梯度累积(有时故意,见 Math-04/10) |
| in-place 改 tensor | 破坏计算图 |
detach() 断图 |
停止梯度流(RL、GAN 冻结) |
| 数值梯度 | 仅调试,用 gradcheck |
6. 迷你 backward 示例(D12)
1 | # y = w*x + b, L = y^2 |
7. 小结
反向传播 = 计算图上的反向模式 AD。层公式见 06 梯度手册。
系列导航:03 Jacobian | 10 autograd