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 进行授权