反向传播
反向传播用一次逆向遍历,计算损失对网络各权重的梯度。它逐层应用链式法则,复用后一层的误差信号来计算前一层,计算量与前向传播同阶。
若逐个扰动权重、每次重新运行网络估计损失变化,大网络会付出很高成本。反向传播从一个标量损失往回分配敏感度,复用共享因子,再求每条连接的导数。这里的“责任”指局部导数,不是对参数重要性的完整因果判断。
反向传播如何工作
权重 w 改变预激活 z,z 改变激活 a,最终影响损失 L。链式法则写作 ∂L/∂w = ∂L/∂a · ∂a/∂z · ∂z/∂w,其中 ∂L/∂a 已包含后续所有路径的贡献。
定义神经元误差信号 δ = ∂L/∂z。输入权重的梯度为 δ 乘该连接上的输入。前一层误差信号为 δ_prev = (Wᵀ·δ_next) ⊙ σ′(z),⊙ 表示逐元素乘法。转置把后一层误差沿连接汇总回前层。
Sigmoid 若缓存激活 s = σ(z),则对 z 的导数为 σ′(z) = s·(1 − s)。因此前向阶段保存激活,反向阶段就可复用。
过程是:求输出 δ,求输出层权重梯度,向前一层传 δ,再求其权重梯度,重复到输入侧。全部梯度求完后,才执行 w ← w − η·∂L/∂w。梯度下降负责更新规则,反向传播负责提供梯度。
反向传播逐步演示
默认对 2 → 2 → 1 的 sigmoid 网络训练一步,损失为 L = ½(ŷ − y)²。输入 x = [0.50, 0.90],目标 y = 1,学习率 η = 0.5。
初始参数为 W₁ = [0.15, 0.20; 0.25, 0.30],每行对应一个隐藏神经元;b₁ = [0.35, 0.35],W₂ = [0.40, 0.45],b₂ = 0.60。为集中观察六个权重,本课固定偏置。实际训练也可用 ∂L/∂b = δ 更新偏置。
- 隐藏层前向。
a = σ(W₁·x + b₁) = [0.647, 0.678]。 - 输出前向。
ŷ = σ(W₂·a + b₂) = 0.762。 - 损失。
L = ½(0.762 − 1)² ≈ 0.028,预测低于目标。 - 输出 δ。
δ_o = (ŷ − y)·ŷ(1−ŷ) = (−0.238)·(0.762·0.238) ≈ −0.043。负号表示在此点提高输出可降低损失。 - 输出权重梯度。
∂L/∂W₂ = δ_o·a ≈ [−0.028, −0.029],每条隐藏到输出连接一个梯度。 - 传回隐藏层。
δ_h = (W₂·δ_o) ⊙ a(1−a) ≈ [−0.004, −0.004]。此处 W₂ 是单输出对应的权重向量。 - 输入权重梯度。
∂L/∂W₁ = δ_h ⊗ x,2×2 矩阵按行展开约为[−0.0020, −0.0035, −0.0021, −0.0038]。梯度经两个 sigmoid 导数缩放,数值较小。 - 更新。 使用
η = 0.5。六个梯度都负,因此六个权重增加,推动输出接近目标。 - 验证。 用更新权重重做前向,
ŷ ≈ 0.766,损失约0.027,分别从 0.762 上升、从 0.028 下降。显示值经舍入,训练会重复这个循环。
前向时琥珀色从左向右,反向时橙色随 δ 从右向左。顶部从 forward → 变为 ← backward,验证时再回前向。第二组输入 x = [0.1, 0.8] 使用相同过程,重新计算全部数值。
输入面板可选 η ∈ {0.1, 0.5, 0.9}。在同一初始点,梯度不随 η 变化,变化的是更新幅度。默认输入的一步损失降幅约为 0.0002、0.0008、0.0015。该局部结果不意味着学习率越大越好;梯度下降展示多步收敛与失稳。
为什么从损失向后计算
逐权重估计导数需要 O(P) 次前向,若单次为 O(P),总计 O(P²)。反向传播面对的是多参数、单标量损失,可复用 δ,把每条连接的梯度求值纳入一次反向遍历。
在本课全连接网络中,前向 O(P)、反向 O(P),缓存前向值额外需要 O(激活数) 空间,另计参数及参数梯度的存储。反向一般是前向的常数倍工作,不意味着每种网络都耗时完全相同。
前向传播的 784 → 25 → 25 → 10 网络有 20,475 个连接权重,训练同样使用反向梯度并按小批次聚合;更新采用 Adam,梯度的来源仍是链式法则。
边界情况
- 预测已等于目标。 本例平方损失下
ŷ = y使δ_o = 0,全部梯度为零,不更新权重,此样本损失已最小。 - Sigmoid 饱和。 a 接近 0 或 1 时,
a(1−a)接近零,会压低回传信号。 - 深度叠加。 每层 sigmoid 导数不超过 0.25,连乘容易缩小梯度;权重足够大也可能放大乃至爆炸。2→2→1 太浅,不能充分展示深层效应。本例选 sigmoid 为了看清计算,不是推荐所有深网络都使用它。
常见错误
- 漏掉
σ′。 前层 δ 必须乘本层局部导数,省略会算错上游梯度。 - 反向过程中先改权重。 整次反向应使用产生当前激活的那组权重,否则回传不再对应同一次前向网络。
- 符号颠倒。 δ 用
ŷ − y,更新减去η·∂L/∂w;弄反会把下降改成上升。 - 丢掉所需激活又不安排重算。 反向需要这些值。检查点技术可以用重算换内存,不会必然退回逐权重 O(P²) 方法;应明确存什么、重算什么。