数值微分、梯度检查与近似误差
层级:B|按需
1. 数值微分是调试工具
解析推导和自动微分可能因公式、广播、原地操作或计算图切断而出错。数值微分只调用函数值,能作为近似的独立校验。但它慢且受浮点误差影响,不用于正常大规模训练。
2. 前向差分
Taylor 展开:
因此
前向差分截断误差一阶随 减小。
3. 中心差分
分别展开 与 ,相减后偶次项抵消:
截断误差为 。在相同步长下通常明显优于前向差分,只多一次函数评估。
4. 为什么 h 不是越小越好
总误差包含:
- 截断误差: 越小越好;
- 舍入/消去误差:计算两个很接近的数相减, 越小相对误差越大。
粗略地中心差分总误差形如
双精度常从 到 尝试;单精度更难做严格梯度检查。最优值依函数尺度而异。
5. 相对误差
比较解析梯度 与数值梯度 ,不要只看绝对差。常用
也可分量比较。分母防止两个梯度都接近零时数值不稳定。容差取决于精度、函数光滑性、计算深度和批量求和。
6. 逐参数梯度检查
对参数向量第 个单位方向 :
成本为每个参数两次前向, 个参数需要 次,因此只适合小模型、少量元素抽查或缩小数据。
7. 方向导数检查
随机选方向 :
一次检查验证整个梯度在该方向的投影,成本与参数数目无关。多个随机方向能高概率发现错误,但不定位具体分量。
对矩阵参数用 Frobenius 内积:
8. 梯度检查的正确环境
检查时应:
- 使用双精度;
- 关闭 dropout 等随机层,或固定随机种子/掩码;
- 固定 batch normalization 统计;
- 避开 ReLU 折点等不可微位置;
- 使用小批量和少量参数;
- 确保正则项和平均/求和约定一致;
- 测试多个 ,观察误差先降后升的区间。
9. 不可微点
对 在 0:
但普通导数不存在。中心差分返回左右导数的某种平均,可能恰好与框架选的次梯度相同或不同。梯度检查失败/通过都不能证明不可微点的普通导数性质。
应将测试点轻微移开折点或针对次梯度单独测试。
10. 复步微分
若函数可解析延拓且实现支持复数:
它避免两个近数相减,可用极小 获得高精度。但不适用于绝对值、分支、非解析操作,许多 ML 算子也不完整支持。
11. 二阶导数数值近似
它更敏感于舍入误差。大模型验证 Hessian 更常检查 Hessian–vector product:比较梯度在方向上的中心差分
12. 从误差模式定位 bug
- 恰差一个常数倍:检查损失求和/平均、、batch 大小;
- 转置或轴错:检查形状、广播、reduce 轴;
- bias 梯度错:检查广播路径是否沿 batch 求和;
- 只有极端 logits 失败:检查数值稳定形式;
- 小 才失败:可能浮点消去;
- 每次结果不同:存在未固定随机性或状态更新。
易错点
- 数值梯度只是近似参考,不是绝对真值。
- 太小会更差。
- 随机层与状态层必须固定。
- 不可微点不能用普通梯度标准判断。
- 检查小样本通过不证明所有形状和边界输入正确,还需单元测试。
常见问答
Q1:自动微分已经成熟,为什么还要 gradient check?
框架算的是你写出的计算图梯度。若目标、索引、广播或自定义 backward 写错,自动微分不会知道意图。
Q2:相对误差多少算通过?
无统一阈值。平滑双精度小函数常期待 或更小;深计算、单精度、近折点会更宽松。更应观察步长扫描趋势。
Q3:每个参数都检查吗?
小自定义算子可以;大模型抽查元素与随机方向,并用已知解析小例子做单元测试。
练习
- 推导中心差分为何抵消偶次 Taylor 项。
- 对 在 用 做中心差分并与真导数比较。
- 解释 时为何浮点误差增大。
- 为矩阵参数写随机方向梯度检查公式。
- 列出含 dropout 网络做梯度检查前的三个设置。
答案与提示
- 展开 与 后相减,常数与偶次幂项相消。
- 近似 ,真值 12。
- 与 舍入后几乎相同,相减丢失有效位,再除以小 放大误差。
- 左侧中心差分,右侧 。
- 双精度、固定/关闭随机性、固定状态统计;还应避开不可微点。