文章

12 梯度的数值近似(Numerical Approximation of Gradients)

12 梯度的数值近似(Numerical Approximation of Gradients)

🎯 课程核心目标

  本节旨在讲解如何通过数值方法近似计算梯度,为后续的 梯度检验(Gradient Checking) 打下基础。梯度检验是一种验证反向传播(Backpropagation)实现是否正确的关键技术。


🔢 1. 背景:为什么需要数值近似梯度?

  • 在实现反向传播时,容易因索引错误、符号错误或链式法则应用不当而引入 bug。
  • 数值近似提供了一种独立于解析梯度的方式来估算导数,从而可用于验证反向传播的正确性。

📐 2. 两种数值梯度近似方法

(1)单侧差分(One-sided Difference)

  这是最直观的方法:

\[g(\theta) \approx \frac{f(\theta + \varepsilon) - f(\theta)}{\varepsilon}\]
  • 缺点:精度较低。
  • 误差阶数:$\mathcal{O}(\varepsilon)$

举例:若 $f(\theta) = \theta^3$,$\theta = 1$,$\varepsilon = 0.01$
则近似值为 $\frac{(1.01)^3 - 1^3}{0.01} = 3.0301$,而真实导数 $f’(\theta) = 3\theta^2 = 3$,误差为 0.0301


(2)双侧差分(Two-sided Difference)✅ 推荐方法

  更精确的近似方式:

\[g(\theta) \approx \frac{f(\theta + \varepsilon) - f(\theta - \varepsilon)}{2\varepsilon}\]
  • 优点:精度显著提高。
  • 误差阶数:$\mathcal{O}(\varepsilon^2)$

同样例子:

\[\frac{(1.01)^3 - (0.99)^3}{2 \times 0.01} = \frac{1.030301 - 0.970299}{0.02} = \frac{0.060002}{0.02} = 3.0001\]

误差仅为 0.0001,比单侧方法好两个数量级!


🧠 3. 理论依据(可选理解)

  • 导数的严格数学定义为:

    \[f'(\theta) = \lim_{\varepsilon \to 0} \frac{f(\theta + \varepsilon) - f(\theta - \varepsilon)}{2\varepsilon}\]
  • 对于非零但很小的 $\varepsilon$,双侧差分的误差为 $\mathcal{O}(\varepsilon^2)$,而单侧为 $\mathcal{O}(\varepsilon)$。
  • 因为当 $\varepsilon < 1$ 时,$\varepsilon^2 \ll \varepsilon$,所以双侧方法更优。

💡 即使你不熟悉微积分,只需记住:双侧差分更准,用于梯度检验


⚙️ 4. 实际应用:为梯度检验做准备

  • 假设你有一个函数 $f(\theta)$ 和一个声称是其导数的函数 $g(\theta)$(例如由反向传播计算得到)。
  • 你可以用双侧差分计算数值梯度 $\tilde{g}(\theta)$,然后与 $g(\theta)$ 比较:

    \[\text{若 } |g(\theta) - \tilde{g}(\theta)| \text{ 很小(如 } < 10^{-7}\text{)} \Rightarrow \text{反向传播很可能正确}\]
  • 这就是下一节 “梯度检验(Gradient Checking)” 的核心思想。

✅ 5. 关键总结(Takeaways)

项目内容
目的验证反向传播实现是否正确
推荐方法双侧差分(two-sided difference)
公式$\displaystyle \frac{f(\theta + \varepsilon) - f(\theta - \varepsilon)}{2\varepsilon}$
典型 $\varepsilon$$10^{-7}$ 到 $10^{-4}$(常用 $10^{-7}$)
误差阶数$\mathcal{O}(\varepsilon^2)$,远优于单侧的 $\mathcal{O}(\varepsilon)$
代价计算量是单侧的两倍,但值得,因精度高

📌 小贴士(Practical Tips)

  • 在实际深度学习框架中(如 PyTorch/TensorFlow),通常已有自动梯度检验工具,但理解原理对调试至关重要。
  • 梯度检验仅在调试阶段使用,训练时应关闭(因计算开销大)。
  • 若检验失败,需仔细检查反向传播中的维度、符号、求和范围等。
本文由作者按照 CC BY 4.0 进行授权