链式法则与反向传播

本节目标

你将对标量复合函数和简单计算图应用链式法则,理解分支梯度为什么相加、batch 平均为什么带来缩放,并区分“计算梯度”“自动记录图”和“优化器更新”三个步骤。

复合函数与责任传递

若 、,则:

它表示 对 的影响等于“ 对中间量的影响 × 中间量对输出的影响”。

例:、:

在 ,导数为 24。直接展开 可验证。

多变量时同样遵循 shape。若 、、标量 ,则可用 Jacobian 写:

反向传播从一个上游向量与局部 Jacobian 做 vector-Jacobian product,不需要显式保存整个 Jacobian。

计算图

线性回归单样本:

沿图反向:

所以:

对 的梯度为 。每个局部节点只需知道自己的输入和上游梯度。

若 batch 损失定义为平均 MSE:

则 、。把 sum 换成 mean 会改变梯度尺度;实现、手算和测试必须使用同一个 reduction 约定。

分支时梯度相加

若变量 通过两条路径影响 ,总导数是各路径贡献之和。这正是共享参数、残差连接和同一 token embedding 多次使用时梯度累积的原因。

例如 、。 一条路径进入平方,另一条直接相加:

漏掉任一路径都会得到错误梯度。代码里的广播、重复索引和共享权重也可能形成不显眼的多路径。

反向模式自动微分

标量损失、参数很多时,反向模式能以与前向计算同量级的代价求所有参数梯度。反向传播是链式法则在计算图上的高效组织,不是另一套神秘公式。

需要保存中间量以反向计算,造成训练显存占用;gradient checkpointing 用额外重算换内存。推理通常不需保留完整梯度图。

梯度消失与爆炸

长链上的导数连乘:许多小于 1 的因子使梯度趋近 0,许多大因子使其爆炸。初始化、归一化、残差连接、激活函数和梯度裁剪都与此相关;裁剪缓解数值症状,不保证解决根因。

常见误区

  • 忘记共享变量多路径贡献要相加。
  • 将“反向传播”与“参数更新”混为一谈;前者算梯度,优化器再更新。
  • 只检查训练能运行,不验证梯度方向。
  • 数值梯度与解析梯度误差大时直接调学习率,而非检查实现。

练习与自测

  1. 对 手算 的导数。
  2. 画出 x -> u=x^2 -> y=u+x -> L=y^2,列出两条从 x 到 L 的路径并相加。
  3. 对 batch mean MSE 推导 梯度,指出 2/n 从哪里来。
  4. 写出 的 Jacobian/梯度 shape,检查转置方向。
  5. 说明反向传播、自动微分和优化器更新各自负责什么。
  • 我能沿简单计算图反向求导。
  • 我知道分支梯度相加。
  • 我能区分求梯度和更新参数。
  • 我会核对 sum/mean reduction 和 batch 维度。
  • 我能用 VJP 直觉解释为何不必显式构造完整 Jacobian。

参考资料

核验日期:2026-07-14。框架自动微分行为可能随版本变化,实际使用前应复查当前官方文档。

上一节:偏导数与梯度|下一步:自动微分与梯度检查。