把两个梯度放在同一张验算单上
先改参数或步长,结果会同步重算。全量检查覆盖 w 与 b;抽样检查每次只复算一个坐标,代价更低,但结论只对本轮坐标负责。
故意把 ∂J/∂w 写成 δ,漏掉链式法则中的输入因子 0.8;数值梯度不受影响。
本轮结果
检查通过
两个坐标的相对误差都低于 1e−6;当前解析实现与中心差分一致。
z = 0.8w + b
ŷ = tanh(z)
J = ½(ŷ − 0.35)²
| 参数 | 解析梯度 | 中心差分 | 相对误差 | 判断 |
|---|---|---|---|---|
| w权重 | —当前实现 | —— | —阈值 1e−6 | 通过 |
| b偏置 | —当前实现 | —— | —阈值 1e−6 | 通过 |
中心差分对每个被检查坐标分别计算 J(θ+ε) 与 J(θ−ε),所以本轮额外前向次数恰好是被检查坐标数的两倍。
ε 不是越小越好
中心差分的截断误差会随步长变大,浮点舍入误差又会在步长过小时被除以 ε 放大。两股误差相加,就形成常见的 U 形。
怎样读这张验算单
梯度检查给的是局部证据。它能发现很多链式法则错误,但不能替代对随机性、数据接口和训练状态的检查。
-
先看逐参数相对误差
绝对差没有统一尺度。相对误差把差异放回当前梯度量级里,两个很小的梯度也不会被轻易放过。
-
抽样通过不等于全量通过
打开注错开关后,如果本轮只抽到 b,w 的错误就不会被数值复算覆盖。真实网络要从每一组参数里抽样。
-
ReLU 折点要单独判断
当正负扰动跨过 z=0,中心差分面对的不是同一条光滑曲线。此时警告可能来自不可导点,不一定是反向传播写错。
梯度检查只适合调试小网络:固定随机性、使用双精度、先检查少量样本,确认后就关闭数值梯度。正式训练每一步都做中心差分,成本会高得多。