02-神经网络原理 核心 预计 35 分钟 ★ 最小路径

反向传播:链式法则的工程实现

反向传播(Backpropagation)是把链式法则沿网络层逆序应用、系统计算损失对每层参数梯度的算法:先保存前向各层激活,再从输出端回传误差信号 δ,逐层得到 ∂L/∂W 与 ∂L/∂b。

一句话定义

反向传播(Backpropagation)是把链式法则沿网络层逆序应用、系统计算损失对每层参数梯度的算法:先保存前向各层激活,再从输出端回传误差信号 δ,逐层得到 ∂L/∂W 与 ∂L/∂b。

直觉

多层网络像接力赛:前向是信息从第一棒传到最后一棒(预测),反向是「追责」从最后一棒往回传——每一棒拿着总误差,按自己当年「放大了多少倍」(局部导数)拆出自己该背的部分交给上一棒。kp-003 的流水线录像类比在这里逐层具体化。

为什么重要

反向传播是 1986 年 Rumelhart、Hinton、Williams 论文确立的现代深度学习发动机(kp-031),也是全库最核心的一条推导主线:kp-010 优化器消费它的输出,kp-012 初始化与 kp-014 归一化在保护它的数值健康,kp-020 残差连接与 kp-023 门控在改造它的回传路径。能否手推两层 MLP 的反向传播,是检验本库学习成效的第一硬指标。

前置知识

  • kp-003(计算图与链式法则)、kp-005(MLP 层变换)、kp-006(激活函数导数表)。
  • 库外前置:矩阵求导的维度匹配直觉(不必会矩阵微积分,按形状核对即可)。

核心概念

  • 误差信号 δ⁽ˡ⁾:损失对该层加权和的偏导 ∂L/∂z⁽ˡ⁾,反向传播的「主角」。
  • 局部梯度:本层运算自己的导数 φ'(z⁽ˡ⁾) 与 W⁽ˡ⁾。
  • 前向缓存:反向要用到 a⁽ˡ⁻¹⁾ 与 z⁽ˡ⁾,前向时必须保存(显存开销的主要来源之一)。
  • 梯度累积:多样本批次下对梯度求平均,对应框架中的 loss.mean().backward()。
  • 权重梯度与激活梯度的区分:∂L/∂W⁽ˡ⁾(要更新参数)与 ∂L/∂a⁽ˡ⁻¹⁾(要继续回传)是两条不同去向。

原理与机制

以三层结构(输入 → 隐藏 → 输出)推导。前向:z⁽¹⁾ = W⁽¹⁾x + b⁽¹⁾,a⁽¹⁾ = φ(z⁽¹⁾),z⁽²⁾ = W⁽²⁾a⁽¹⁾ + b⁽²⁾,ŷ = φ(z⁽²⁾),损失 L(ŷ, y)。第一步,输出层误差信号:δ⁽²⁾ = ∂L/∂z⁽²⁾ = ∂L/∂ŷ ⊙ φ'(z⁽²⁾)(⊙ 为逐元素乘);若输出用 softmax + 交叉熵(kp-009 将证明),该式可惊人地化简为 δ⁽²⁾ = ŷ − y。第二步,误差回传到隐藏层:∂L/∂a⁽¹⁾ = (W⁽²⁾)ᵀ δ⁽²⁾(矩阵求导的形状核对:[n₂,n₁] 与 [n₂] 相乘得 [n₁],与 a⁽¹⁾ 同形状),于是 δ⁽¹⁾ = (W⁽²⁾)ᵀ δ⁽²⁾ ⊙ φ'(z⁽¹⁾)。第三步,参数梯度:∂L/∂W⁽²⁾ = δ⁽²⁾(a⁽¹⁾)ᵀ(形状 [n₂,n₁] 核对通过),∂L/∂b⁽²⁾ = δ⁽²⁾,同理 ∂L/∂W⁽¹⁾ = δ⁽¹⁾xᵀ、∂L/∂b⁽¹⁾ = δ⁽¹⁾。把三步合起来看两条规律:其一,δ 沿层回传时每层乘 (W⁽ˡ⁺¹⁾)ᵀ 与 φ'(z⁽ˡ⁾)——若这些因子持续小于 1,梯度指数衰减(kp-023 的消失问题);若持续大于 1 则爆炸,kp-012 初始化与 kp-025 裁剪分别从两端治理。其二,W 的梯度总是「本层误差信号 × 上一层的激活」,这正是前向必须缓存激活的原因。反向传播与 kp-003 自动微分的关系:反向传播是自动微分在「层状复合函数」上的特例与名字,框架的 backward() 执行的正是上述 δ 递推,只是由计算图通用化实现。

公式或模型

L 层网络的完整反向传播方程组(Rumelhart 形式):

输出层:δ⁽ᴸ⁾ = ∂L/∂a⁽ᴸ⁾ ⊙ φ'(z⁽ᴸ⁾)
回  传:δ⁽ˡ⁾ = ( W⁽ˡ⁺¹⁾ )ᵀ δ⁽ˡ⁺¹⁾ ⊙ φ'(z⁽ˡ⁾)          l = L−1, …, 1
参数:  ∂L/∂W⁽ˡ⁾ = δ⁽ˡ⁾ ( a⁽ˡ⁻¹⁾ )ᵀ ,   ∂L/∂b⁽ˡ⁾ = δ⁽ˡ⁾

变量说明:所有形状按 kp-002 规则核对——δ⁽ˡ⁾、b⁽ˡ⁾ 为 [n_l],W⁽ˡ⁾ 为 [n_l, n_{l-1}],a⁽ˡ⁻¹⁾ 为 [n_{l-1}]。softmax+交叉熵时 δ⁽ᴸ⁾ = ŷ − y(kp-009 推导)。

图示

前向:  x ─►[W⁽¹⁾]─► z⁽¹⁾ ─►φ─► a⁽¹⁾ ─►[W⁽²⁾]─► z⁽²⁾ ─►φ─► ŷ ─► L
反向:  ∂L/∂W⁽¹⁾ ◄─δ⁽¹⁾ ◄─(W⁽²⁾)ᵀ,φ' ◄──── δ⁽²⁾ ◄──────────── ∂L/∂ŷ
        (δ 每过一层:乘转置权重矩阵回传,再乘本层激活导数)

直观类比

δ 像「责任金额」,(W⁽ˡ⁺¹⁾)ᵀ 像「按持股比例向上追责」,φ'(z⁽ˡ⁾) 像「上一环节的放大器增益」——增益太小,责任传到源头已所剩无几(梯度消失),激励失效。

实例或案例

手工推一个两层数值例子验证公式:设 W⁽¹⁾=[1],b=0,x=2,φ 为 ReLU,输出层恒等、损失 L=(ŷ−y)²,y=5。前向:z⁽¹⁾=2,a⁽¹⁾=2,z⁽²⁾=W⁽²⁾·2,取 W⁽²⁾=[3] 得 ŷ=6,L=1。反向:∂L/∂ŷ=2(6−5)=2;δ⁽²⁾=2·1=2(恒等层 φ'=1);∂L/∂W⁽²⁾=δ⁽²⁾·a⁽¹⁾=2·2=4;δ⁽¹⁾=(W⁽²⁾)ᵀδ⁽²⁾⊙φ'(z⁽¹⁾)=3·2·1=6;∂L/∂W⁽¹⁾=δ⁽¹⁾·x=6·2=12。用 kp-004 的 autograd 对同一表达式求导可直接验证 4 与 12 两个数——理论推导与框架输出对上,是本知识点最重要的自证练习。

常见误区

  • 混淆 ∂L/∂a 与 ∂L/∂z:回传用前者,误差信号定义在后者,中间隔一个 φ'。
  • 忘记梯度的「批次平均」:对 [B,n] 批次张量,∂L/∂W 是各样本梯度的平均,实现时通常 loss = mean(cross_entropy(...))。
  • 以为反向传播是「另一种训练算法」:它只负责算梯度,更新参数的是 kp-010 的优化器。
  • 忽视前向缓存的显存代价:层数越深缓存越多,这是 kp-029 混合精度与梯度检查点技术存在的理由。

与其他知识点的关系

本知识点向上消费 kp-003 的计算图机制与 kp-006 的导数表,向下供弹给 kp-010(梯度下降的输入)、kp-012(按 δ 方差设计初始化)、kp-014(归一化改善 δ 数值)、kp-020(残差让 δ 走捷径)与 kp-023(门控改写 δ 的乘法链)。

自测题

  1. 写出 δ⁽ˡ⁾ 的递推公式,并指出每层回传要乘的两个因子。

答案要点:δ⁽ˡ⁾=(W⁽ˡ⁺¹⁾)ᵀδ⁽ˡ⁺¹⁾⊙φ'(z⁽ˡ⁾);乘转置权重与激活导数。

  1. 为什么前向传播必须缓存每层激活 a⁽ˡ⁻¹⁾?

答案要点:∂L/∂W⁽ˡ⁾=δ⁽ˡ⁾(a⁽ˡ⁻¹⁾)ᵀ 需要上一层的激活值参与计算。

  1. softmax+交叉熵下输出层 δ⁽ᴸ⁾ 等于什么?为什么说这极大简化了实现?

答案要点:δ⁽ᴸ⁾=ŷ−y;指数与对数相消,无需显式计算雅可比矩阵(kp-009 给出证明)。

延伸阅读

  • Rumelhart、Hinton、Williams《Learning representations by back-propagating errors》Nature 1986(原始论文)。
  • Goodfellow 等《Deep Learning》6.5 节;李沐《动手学深度学习》4.7 节(数值稳定性)。

学习状态

状态保存在浏览器本地,用于首页与路径页的进度统计。