多元链式法则、计算图与反向传播
层级:A|必学
1. 反向传播不是神秘的专用公式
它把复杂函数拆成简单节点,记录前向中间值,再从标量损失反向应用链式法则。关键有两条:沿一条路径导数相乘;同一变量到输出有多条路径时贡献相加。
2. 多元标量链式法则
设
z=f(u1,ldots,um),uj=uj(x).
则
dxdz=j=1∑m∂uj∂zdxduj.
求和来自 x 通过每个 uj 影响 z 的所有路径。
例:z=u2+uv,u=x2,v=3x:
dxdz=(2u+v)(2x)+u(3).
3. 向量形式
若 y=f(x),标量损失 L=L(y):
∇xL=Jf(x)T∇yL.
这表示把输出空间的梯度通过局部 Jacobian 的转置拉回输入空间。多层复合:
∇x0L=J1TJ2T⋯JkT∇xkL,
实际逐层计算,避免显式乘出巨大 Jacobian。
4. 计算图例子
单样本线性单元:
z=wTx+b,p=σ(z),L=−[ylogp+(1−y)log(1−p)].
节点依赖为
(w,x,b)→z→p→L.
前向计算保存 z,p;反向从 ∂L/∂L=1 开始。
5. Sigmoid + 二元交叉熵的简化
先求
∂p∂L=−py+1−p1−y,
dzdp=p(1−p).
相乘:
∂z∂L=(−py+1−p1−y)p(1−p)=p−y.
再由 z=wTx+b:
∇wL=(p−y)x,
∂b∂L=p−y,
∇xL=(p−y)w.
合并 logits 损失不仅公式简洁,而且能用稳定的 LogSumExp 技巧避免 p 舍入为 0 或 1。
6. 分支节点的梯度相加
若
y=f(x)+g(x),
则
dxdy=f′(x)+g′(x).
在图中 x 分叉到两条路径,反向汇合时把梯度加总。残差连接
y=x+F(x)
的梯度为
∂x∂L=∂y∂L(I+JF(x)),
恒等路径提供直接梯度通道。
7. 批量全连接层
前向:
Z=XW+1bT,
上游梯度 G=∂L/∂Z。反向:
∂W∂L=XTG,
∂X∂L=GWT,
∂b∂L=GT1
(等价于沿 batch 维求和)。每个公式都可通过形状检查:W 的梯度必须与 W 同形状。
8. 激活函数的逐元素反传
若 H=ϕ(Z) 逐元素作用,上游为 GH:
GZ=GH⊙ϕ′(Z).
⊙ 是 Hadamard 乘。ReLU 导数在正区间为 1、负区间为 0,0 点由框架约定。若某神经元长期落在负区间,梯度为 0,可能出现“死亡 ReLU”。
9. 反向模式为何高效
若函数有 p 个输入参数、一个标量输出:
- 逐参数数值差分需要约 p 次前向;
- 前向模式通常每个方向传播一次;
- 反向模式一次前向加一次反向,就得到所有 p 个偏导。
代价通常是常数倍前向计算,但需要保存或重算中间值,形成时间—内存权衡。梯度检查只在小规模参数或随机方向上做。
10. 自动微分的三种误解
- 不是符号化简:它沿具体计算图组合局部导数;
- 不是数值差分:除浮点舍入外通常给出精确链式导数;
- 不是自动理解数学意图:detach、原地修改、错误广播和不稳定公式仍会产生错误或无用梯度。
11. 梯度消失与爆炸
长链式乘积中,Jacobians 的奇异值控制梯度尺度。许多小于 1 的因子导致消失,许多大于 1 导致爆炸。常见缓解:
- 合理初始化;
- ReLU/GELU 等激活;
- 残差连接;
- 归一化;
- 门控结构;
- 梯度裁剪。
12. 梯度累积与清零
许多框架默认把新梯度累加到参数 .grad,对应多个损失对同一参数的贡献相加。每个优化步骤前若不清零,会无意累加跨批梯度。主动梯度累积则用多个微批近似大 batch,需确认损失是求和还是平均。
易错点
- 分支路径在反向汇合时要相加。
- 逐元素乘与矩阵乘必须区分。
- 上游梯度的形状决定局部 VJP,不应显式构造 Jacobian。
detach 会切断计算图。
- 数值稳定的合并损失优于先算概率再取对数。
常见问答
Q1:反向传播会不会更新参数?
反向传播只计算梯度;优化器根据梯度、学习率和状态更新参数。框架 API 有时把两步紧邻调用,但概念不同。
Q2:为什么 bias 梯度要沿 batch 求和?
同一个偏置被广播到每个样本,每条使用路径都对它产生贡献,链式法则要求相加。
Q3:训练时能否不保存激活以省内存?
可用 gradient checkpointing,只保存部分节点,反向时重算其余前向,牺牲计算换内存。
练习
- 对 y=x2+x3 用路径求和解释 dy/dx。
- 对 z=wx+b,L=z2 求 w,b,x 梯度。
- 写出 y=x+F(x) 的导数。
- X 为 n×d、W 为 d×h、G 为 n×h,检查 XTG 与 GWT 形状。
- 为什么
BCEWithLogits 比 sigmoid 后再 log 稳定?
答案与提示
- 两路径贡献 2x 与 3x2 相加。
- 2zx,2z,2zw。
- I+JF,标量时为 1+F′(x)。
- 分别为 d×h 与 n×d。
- 可代数合并并用 LogSumExp/softplus 形式,避免指数溢出和 log0。