链式法则与反向传播
本节目标
你将对标量复合函数和简单计算图应用链式法则,理解分支梯度为什么相加、batch 平均为什么带来缩放,并区分“计算梯度”“自动记录图”和“优化器更新”三个步骤。
复合函数与责任传递
若 、,则:
它表示 对 的影响等于“ 对中间量的影响 × 中间量对输出的影响”。
例:、:
在 ,导数为 24。直接展开 可验证。
多变量时同样遵循 shape。若 、、标量 ,则可用 Jacobian 写:
反向传播从一个上游向量与局部 Jacobian 做 vector-Jacobian product,不需要显式保存整个 Jacobian。
计算图
线性回归单样本:
沿图反向:
所以:
对 的梯度为 。每个局部节点只需知道自己的输入和上游梯度。
若 batch 损失定义为平均 MSE:
则 、。把 sum 换成 mean 会改变梯度尺度;实现、手算和测试必须使用同一个 reduction 约定。
分支时梯度相加
若变量 通过两条路径影响 ,总导数是各路径贡献之和。这正是共享参数、残差连接和同一 token embedding 多次使用时梯度累积的原因。
例如 、。 一条路径进入平方,另一条直接相加:
漏掉任一路径都会得到错误梯度。代码里的广播、重复索引和共享权重也可能形成不显眼的多路径。
反向模式自动微分
标量损失、参数很多时,反向模式能以与前向计算同量级的代价求所有参数梯度。反向传播是链式法则在计算图上的高效组织,不是另一套神秘公式。
需要保存中间量以反向计算,造成训练显存占用;gradient checkpointing 用额外重算换内存。推理通常不需保留完整梯度图。
梯度消失与爆炸
长链上的导数连乘:许多小于 1 的因子使梯度趋近 0,许多大因子使其爆炸。初始化、归一化、残差连接、激活函数和梯度裁剪都与此相关;裁剪缓解数值症状,不保证解决根因。
常见误区
- 忘记共享变量多路径贡献要相加。
- 将“反向传播”与“参数更新”混为一谈;前者算梯度,优化器再更新。
- 只检查训练能运行,不验证梯度方向。
- 数值梯度与解析梯度误差大时直接调学习率,而非检查实现。
练习与自测
- 对 手算 的导数。
- 画出
x -> u=x^2 -> y=u+x -> L=y^2,列出两条从 x 到 L 的路径并相加。 - 对 batch mean MSE 推导 梯度,指出
2/n从哪里来。 - 写出 的 Jacobian/梯度 shape,检查转置方向。
- 说明反向传播、自动微分和优化器更新各自负责什么。
- 我能沿简单计算图反向求导。
- 我知道分支梯度相加。
- 我能区分求梯度和更新参数。
- 我会核对
sum/meanreduction 和 batch 维度。 - 我能用 VJP 直觉解释为何不必显式构造完整 Jacobian。
参考资料
核验日期:2026-07-14。框架自动微分行为可能随版本变化,实际使用前应复查当前官方文档。