Math-06.矩阵微积分-04.反向传播

本页系统化 反向传播(backpropagation):在计算图上高效计算所有参数的 $\partial L / \partial \boldsymbol{\theta}$。

段末注释反向传播并非独立算法,而是链式法则在 DAG(有向无环图)上的动态规划实现——共享子表达式,避免重复计算。

系列入口00.系列规划 | 前置:03 Jacobian 与链式法则


1. 计算图(D1–D2)

图 1 DAG:节点=运算,边=张量

节点:运算(加、乘、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)

图 2 从 L 反向传递 dL/d·

初始化:$\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)

图 3 每层实现 backward

模块 前向 反向(已知 $\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)

反向结束 → 各参数 .gradMath-04 SGD/Adam 更新。

一次迭代

  1. zero_grad()
  2. forward → $L$
  3. backward() → 填充 .grad
  4. optimizer.step()

5. 局限(D8)

图 4 常见 bug

问题 说明
忘记 zero_grad 梯度累积(有时故意,见 Math-04/10
in-place 改 tensor 破坏计算图
detach() 断图 停止梯度流(RL、GAN 冻结)
数值梯度 仅调试,用 gradcheck

6. 迷你 backward 示例(D12)

1
2
3
4
5
6
7
8
9
# y = w*x + b, L = y^2
# dL/dw = dL/dy * dy/dw = 2y * x
w, x, b = 2.0, 3.0, 1.0
y = w * x + b
L = y ** 2
dL_dy = 2 * y
dL_dw = dL_dy * x
dL_dx = dL_dy * w
print("dL/dw:", dL_dw) # 2*7*3 = 42

7. 小结

反向传播 = 计算图上的反向模式 AD。层公式见 06 梯度手册

系列导航03 Jacobian | 10 autograd

-------------本文结束感谢您的阅读-------------