机器学习数学基础 120 章

数值微分、梯度检查与近似误差

层级:B|按需

1. 数值微分是调试工具

解析推导和自动微分可能因公式、广播、原地操作或计算图切断而出错。数值微分只调用函数值,能作为近似的独立校验。但它慢且受浮点误差影响,不用于正常大规模训练。

2. 前向差分

Taylor 展开:

f(x+h)=f(x)+hf(x)+h22f(ξ).f(x+h)=f(x)+hf'(x)+\frac{h^2}{2}f''(\xi).

因此

f(x+h)f(x)h=f(x)+O(h).\frac{f(x+h)-f(x)}h =f'(x)+O(h).

前向差分截断误差一阶随 hh 减小。

3. 中心差分

分别展开 f(x+h)f(x+h)f(xh)f(x-h),相减后偶次项抵消:

f(x)f(x+h)f(xh)2h,f'(x)\approx \frac{f(x+h)-f(x-h)}{2h},

截断误差为 O(h2)O(h^2)。在相同步长下通常明显优于前向差分,只多一次函数评估。

4. 为什么 h 不是越小越好

总误差包含:

  • 截断误差:hh 越小越好;
  • 舍入/消去误差:计算两个很接近的数相减,hh 越小相对误差越大。

粗略地中心差分总误差形如

C1h2+C2ϵmachh.C_1h^2+C_2\frac{\epsilon_{mach}}h.

双精度常从 10510^{-5}10610^{-6} 尝试;单精度更难做严格梯度检查。最优值依函数尺度而异。

5. 相对误差

比较解析梯度 gag_a 与数值梯度 gng_n,不要只看绝对差。常用

relerr=gagnmax(1,ga,gn).\operatorname{relerr} =\frac{\|g_a-g_n\|} {\max(1,\|g_a\|,\|g_n\|)}.

也可分量比较。分母防止两个梯度都接近零时数值不稳定。容差取决于精度、函数光滑性、计算深度和批量求和。

6. 逐参数梯度检查

对参数向量第 jj 个单位方向 eje_j

(gn)j=L(θ+hej)L(θhej)2h.(g_n)_j= \frac{L(\theta+he_j)-L(\theta-he_j)}{2h}.

成本为每个参数两次前向,pp 个参数需要 2p2p 次,因此只适合小模型、少量元素抽查或缩小数据。

7. 方向导数检查

随机选方向 vv

L(θ+hv)L(θhv)2hL(θ)Tv.\frac{L(\theta+hv)-L(\theta-hv)}{2h} \approx\nabla L(\theta)^Tv.

一次检查验证整个梯度在该方向的投影,成本与参数数目无关。多个随机方向能高概率发现错误,但不定位具体分量。

对矩阵参数用 Frobenius 内积:

L(W+hD)L(WhD)2hWL,DF.\frac{L(W+hD)-L(W-hD)}{2h} \approx\langle\nabla_WL,D\rangle_F.

8. 梯度检查的正确环境

检查时应:

  1. 使用双精度;
  2. 关闭 dropout 等随机层,或固定随机种子/掩码;
  3. 固定 batch normalization 统计;
  4. 避开 ReLU 折点等不可微位置;
  5. 使用小批量和少量参数;
  6. 确保正则项和平均/求和约定一致;
  7. 测试多个 hh,观察误差先降后升的区间。

9. 不可微点

f(x)=xf(x)=|x| 在 0:

f(h)f(h)2h=0,\frac{f(h)-f(-h)}{2h}=0,

但普通导数不存在。中心差分返回左右导数的某种平均,可能恰好与框架选的次梯度相同或不同。梯度检查失败/通过都不能证明不可微点的普通导数性质。

应将测试点轻微移开折点或针对次梯度单独测试。

10. 复步微分

若函数可解析延拓且实现支持复数:

f(x)Imf(x+ih)h.f'(x)\approx\frac{\operatorname{Im}f(x+ih)}h.

它避免两个近数相减,可用极小 hh 获得高精度。但不适用于绝对值、分支、非解析操作,许多 ML 算子也不完整支持。

11. 二阶导数数值近似

f(x)f(x+h)2f(x)+f(xh)h2.f''(x)\approx \frac{f(x+h)-2f(x)+f(x-h)}{h^2}.

它更敏感于舍入误差。大模型验证 Hessian 更常检查 Hessian–vector product:比较梯度在方向上的中心差分

Hvf(x+hv)f(xhv)2h.Hv\approx\frac{\nabla f(x+hv)-\nabla f(x-hv)}{2h}.

12. 从误差模式定位 bug

  • 恰差一个常数倍:检查损失求和/平均、1/21/2、batch 大小;
  • 转置或轴错:检查形状、广播、reduce 轴;
  • bias 梯度错:检查广播路径是否沿 batch 求和;
  • 只有极端 logits 失败:检查数值稳定形式;
  • hh 才失败:可能浮点消去;
  • 每次结果不同:存在未固定随机性或状态更新。

易错点

  1. 数值梯度只是近似参考,不是绝对真值。
  2. hh 太小会更差。
  3. 随机层与状态层必须固定。
  4. 不可微点不能用普通梯度标准判断。
  5. 检查小样本通过不证明所有形状和边界输入正确,还需单元测试。

常见问答

Q1:自动微分已经成熟,为什么还要 gradient check?

框架算的是你写出的计算图梯度。若目标、索引、广播或自定义 backward 写错,自动微分不会知道意图。

Q2:相对误差多少算通过?

无统一阈值。平滑双精度小函数常期待 10610^{-6} 或更小;深计算、单精度、近折点会更宽松。更应观察步长扫描趋势。

Q3:每个参数都检查吗?

小自定义算子可以;大模型抽查元素与随机方向,并用已知解析小例子做单元测试。

练习

  1. 推导中心差分为何抵消偶次 Taylor 项。
  2. f(x)=x3f(x)=x^3x=2x=2h=0.01h=0.01 做中心差分并与真导数比较。
  3. 解释 h0h\to0 时为何浮点误差增大。
  4. 为矩阵参数写随机方向梯度检查公式。
  5. 列出含 dropout 网络做梯度检查前的三个设置。

答案与提示

  1. 展开 f(x+h)f(x+h)f(xh)f(x-h) 后相减,常数与偶次幂项相消。
  2. 近似 12.000112.0001,真值 12。
  3. f(x+h)f(x+h)f(xh)f(x-h) 舍入后几乎相同,相减丢失有效位,再除以小 hh 放大误差。
  4. 左侧中心差分,右侧 WL,DF\langle\nabla_WL,D\rangle_F
  5. 双精度、固定/关闭随机性、固定状态统计;还应避开不可微点。