Lecture 12: Neural Networks 2(反向传播 Backpropagation)

目录 · ← l11 · l13 →

Lecture 12: Neural Networks 2(反向传播 Backpropagation)

概述

本讲给出训练神经网络的“发动机”——反向传播 (Backpropagation):一种高效计算损失对每个参数梯度的算法。核心是链式法则的智能组织:从输出层向前逐层传播“误差信号”,每个参数的梯度 = 本层激活 × 上游误差。本讲还讨论训练动态(学习率、权重衰减、Dropout)与自动微分的关系。

核心概念与数学直觉

  • 问题:最小化损失 $J(W, b)$(如交叉熵 + 正则),用梯度下降 $\theta := \theta - \alpha \nabla_\theta J$ 需要所有参数梯度。朴素方法(对每个参数数值差分)代价 $O(\text{参数数})$ 次前向传播——不可行。反向传播用一次前向 + 一次反向,$O(\text{参数数})$ 总代价得到全部梯度

  • 链式法则的组织:定义第 $l$ 层的误差项(损失对 $z^{[l]}$ 的梯度): $\delta^{[l]} = \frac{\partial J}{\partial z^{[l]}}$ 由链式法则: $\delta^{[l]} = (W^{[l+1]T} \delta^{[l+1]}) \odot g'^{[l]}(z^{[l]})$ $\frac{\partial J}{\partial W^{[l]}} = \delta^{[l]} a^{[l-1]T}, \qquad \frac{\partial J}{\partial b^{[l]}} = \delta^{[l]}$
    • $\odot$:逐元素(Hadamard)乘积。
    • $g^{\prime}^{[l]}(z^{[l]})$:激活函数的导数——Sigmoid 为 $g(1-g)$,tanh 为 $1-g^2$,ReLU 为 $\mathbf{1}\{z>0\}$。
    • 直观解释:误差 $\delta^{[l+1]}$ 从上层反向传播回来(乘 $W^{[l+1]T}$——“谁的权重大,谁担的责任大”),再被本层激活的斜率 $g^{\prime}$ 调制(“饱和的神经元传播不了多少误差”)。
    • 输出层初始化:$\delta^{[L]} = \frac{\partial J}{\partial z^{[L]}}$ 由损失与输出激活直接给出(如 Softmax+交叉熵 ⇒ $\delta^{[L]} = A^{[L]} - Y_{\text{onehot}}$——与逻辑回归的 $(y-h)$ 同构!)。
  • 梯度消失/爆炸:深层反向传播中 $\delta$ 每层乘 $W^T$ 与 $g^{\prime}$——若谱范数 <1(或 Sigmoid 饱和),误差指数衰减(消失,浅层学不动);若 >1,指数放大(爆炸)。
    • 缓解:ReLU 族激活($g^{\prime}=1$ 正区)、合理初始化(He/Xavier 按层宽缩放)、批归一化、残差连接(ResNet)、梯度裁剪(clip)。
  • 训练动态与正则化
    • 学习率调度:固定 → 衰减(step/exponential/cosine)→ 自适应(Adam、RMSProp 按参数自适应步长)。
    • 权重衰减 (Weight Decay):$L_2$ 正则——对应 L5 的岭回归思想。
    • Dropout:训练时随机“关掉”一部分神经元(伯努利掩码)——相当于训练大量共享权重的子网络再集成,降方差。
    • 批归一化 (BatchNorm):对每层激活做标准化,稳定训练、允许更大学习率。
  • 自动微分 (Auto-Differentiation):反向传播 = 反向模式自动微分在图上的实例化。现代框架(PyTorch/TensorFlow)把计算图构建与梯度传播自动化——但你仍需要理解 backprop 以调试(梯度检查、理解梯度爆炸)。

算法伪代码与逻辑解说:反向传播

伪代码

输入:
    - mini-batch (X, y),网络参数 {W^[l], b^[l]}
    - 损失函数 J,激活 g^[l]

输出:
    - 梯度 dW^[l] = ∂J/∂W^[l], db^[l] = ∂J/∂b^[l]

1. 前向传播(缓存每层 Z^[l], A^[l]):
   A^[0] = X; 对 l=1..L: Z^[l]=W^[l]A^[l-1]+b^[l]; A^[l]=g^[l](Z^[l])
2. 输出层误差: δ^[L] = ∂J/∂Z^[L]        // 如 Softmax+CE: A^[L] - Y_onehot
3. 对 l = L, L-1, ..., 1(反向):
    3.1 dW^[l] = (1/m) * δ^[l] @ A^[l-1]^T   // 本层误差 × 前层激活
    3.2 db^[l] = (1/m) * sum(δ^[l], axis=1)
    3.3 若 l > 1: δ^[l-1] = (W^[l]^T @ δ^[l]) ⊙ g'^{[l-1]}(Z^[l-1])   // 误差继续回传
4. 返回 dW, db(供优化器做参数更新)

【算法逻辑解说】

  1. Step 1 前向 + 缓存:必须保存 $Z^{[l]}$(激活导数需要)与 $A^{[l-1]}$(权重梯度需要)——这就是“前向的缓存是反向的燃料”。
  2. Step 2 输出层误差:$\delta^{[L]} = A^{[L]} - Y_{\text{onehot}}$ 是“预测 − 真值”——与逻辑回归梯度同构,说明深度网络最后一层就是多分类逻辑回归。
  3. Step 3 反向循环:从 $L$ 到 1 逐层计算。$dW^{[l]} = \delta^{[l]} a^{[l-1]T}$:梯度 = “本层误差信号”外积“前层激活”——误差大且激活强 ⇒ 梯度大。
  4. Step 3.3 误差回传:$\delta^{[l-1]} = (W^{[l]T}\delta^{[l]}) \odot g^{\prime}(z^{[l-1]})$:上层误差按权重“分账”回传,再被本层激活斜率调制。注意 $W^{[l]T}$ 转置实现“反向传播”的实质——梯度流的方向与权重矩阵的转置对应
  5. 复杂度:一次前向 $O(\text{参数量})$ + 一次反向 $O(\text{参数量})$——比逐参数数值差分快 $O(\text{参数量})$ 倍。
  6. 梯度检查 (Gradient Checking):用数值差分 $\frac{J(\theta+\epsilon)-J(\theta-\epsilon)}{2\epsilon}$ 与反向传播梯度对比(相对误差 $<10^{-7}$ 量级)验证实现正确性——调试必备。

关键要点

  1. 反向传播 = 链式法则的智能排序:一次反向算出全部参数梯度。
  2. 误差信号 $\delta$ 逐层回传:$\delta^{[l]} = (W^{[l+1]T}\delta^{[l+1]}) \odot g^{\prime}(z^{[l]})$。
  3. 梯度消失/爆炸是深层的核心工程难题:ReLU、好初始化、BatchNorm、残差连接是解药。
  4. 反向传播 = 反向模式自动微分;理解它才能调试现代框架。
  5. 正则化(权重衰减、Dropout、早停)与优化器(Adam)共同决定训练效果。

常见误区与注意事项

  • 忘记缓存 $Z$:反向传播需要激活导数 $g^{\prime}(Z^{[l]})$——不缓存则无法计算(或需重算,浪费)。
  • 逐元素 vs 矩阵梯度混淆:$\delta$ 是矩阵($n_l \times m$);$dW$ 是 $\delta$ 与 $A^{[l-1]T}$ 的矩阵乘法(不是逐元素)。形状检查是 first-class 调试手段。
  • 激活函数求导错误:Sigmoid 导数是 $g(1-g)$(不是 $g^{\prime}$ 本身);ReLU 导数是指示函数。
  • 不验证梯度:实现 backprop 后必须做梯度检查;数值与解析梯度不一致时,先查形状、再查求导公式。
  • 学习率过大导致 NaN/爆炸:梯度爆炸常见症状是 loss 变 NaN——用梯度裁剪(clip norm)或降低学习率;同时检查权重初始化尺度。
  • Dropout 忘关(推理时):推理必须关闭 Dropout(或按保留概率缩放),否则预测随机化。

思考题

  1. 问题:推导单隐层网络(输入 → 隐层 tanh → 输出 sigmoid 二分类交叉熵)的输出层与隐层 $\delta$。
    • 答案:输出层:$\delta^{[2]} = a^{[2]} - y$(Sigmoid+CE 的简化形式)。隐层:$\delta^{[1]} = (W^{[2]T}\delta^{[2]}) \odot (1 - (a^{[1]})^2)$(tanh 导数 $1-\tanh^2$)。权重梯度:$dW^{[2]} = \delta^{[2]} a^{[1]T}$,$dW^{[1]} = \delta^{[1]} x^T$。
  2. 问题:为什么深层网络用 Sigmoid 隐藏层容易梯度消失,而 ReLU 缓解?
    • 答案:Sigmoid 导数最大 0.25,且输入远离 0 时趋于 0——每层误差至少乘 $\le 0.25$,10 层后 $\le 0.25^{10} \approx 10^{-6}$,浅层几乎无梯度。ReLU 正区导数恒为 1,误差可无损回传(只要神经元激活);负区为 0 只会“选择性”阻断。
  3. 问题:反向传播与数值差分相比,为什么既快又准?
    • 答案:数值差分对每个参数需一次前向($O(P)$ 次前向,$P$ 为参数数),且受浮点截断误差限制($\epsilon$ 不能太小)。反向传播利用链式法则复用共享中间梯度,一次前向 + 一次反向完成全部梯度,精度达机器精度。数值差分只用于“梯度检查”验证正确性。