反向传播 · 独立验算

梯度检查实验台

把解析梯度看成程序提交的账目,把中心差分看成独立复算。两边对得上,才说明这一个坐标上的反向传播有可信证据。

当前检查 通过 全量 2 / 2
J(w,b) = ½[φ(0.8w + b) − 0.35]² φ(z) = tanh(z) δ = (ŷ − 0.35)φ′(z)
∂J/∂w = 0.8δ,∂J/∂b = δ

把两个梯度放在同一张验算单上

先改参数或步长,结果会同步重算。全量检查覆盖 wb;抽样检查每次只复算一个坐标,代价更低,但结论只对本轮坐标负责。

函数设置
参数 θ = (w, b)
中心差分步长 ε

故意把 ∂J/∂w 写成 δ,漏掉链式法则中的输入因子 0.8;数值梯度不受影响。

本轮结果 全量 · 2 个坐标 · 4 次额外前向
检查通过

两个坐标的相对误差都低于 1e−6;当前解析实现与中心差分一致。

z = 0.8w + b0.6200000
ŷ = tanh(z)0.5511280
J = ½(ŷ − 0.35)²0.0202262
相对误差分母使用 max(1e−12, |解析梯度|, |数值梯度|)。
参数 解析梯度 中心差分 相对误差 判断
w权重 当前实现 阈值 1e−6 通过
b偏置 当前实现 阈值 1e−6 通过

中心差分对每个被检查坐标分别计算 J(θ+ε) 与 J(θ−ε),所以本轮额外前向次数恰好是被检查坐标数的两倍。

ε 不是越小越好

中心差分的截断误差会随步长变大,浮点舍入误差又会在步长过小时被除以 ε 放大。两股误差相加,就形成常见的 U 形。

怎样读这张验算单

梯度检查给的是局部证据。它能发现很多链式法则错误,但不能替代对随机性、数据接口和训练状态的检查。

  1. 先看逐参数相对误差

    绝对差没有统一尺度。相对误差把差异放回当前梯度量级里,两个很小的梯度也不会被轻易放过。

  2. 抽样通过不等于全量通过

    打开注错开关后,如果本轮只抽到 b,w 的错误就不会被数值复算覆盖。真实网络要从每一组参数里抽样。

  3. ReLU 折点要单独判断

    当正负扰动跨过 z=0,中心差分面对的不是同一条光滑曲线。此时警告可能来自不可导点,不一定是反向传播写错。

梯度检查只适合调试小网络:固定随机性、使用双精度、先检查少量样本,确认后就关闭数值梯度。正式训练每一步都做中心差分,成本会高得多。