前向误差与后向误差:好算法为何不怕输入错一点
在浮点数系统中,计算从一开始就存在精度限制。面对计算机给出的近似结果,我们该如何科学地衡量'错得有多离谱'?这引出了数值分析中两个核心视角:前向误差与后向误差。
误差从何而来?
计算机给出的答案 $\hat{y}$ 往往只是真实解 $y = f(x)$ 的一个近似。面对这个'不完美'的结果,我们需要从两个角度审视它:
- 结果错了多少? —— 这关乎最终答案的精度。
- 这个结果是不是某个'相似问题'的精确解? —— 这关乎算法本身的可靠性。
这两个问题,分别对应了前向误差与后向误差的概念。
核心概念:两种误差的定义
1. 前向误差(Forward Error)
这是最直观的误差,直接衡量输出结果的偏差。
定义: $$ \text{Forward Error} = |\hat{y} - y| $$
直观理解:我们算出来的结果,距离标准答案有多远。
例如,真实值为 $\pi \approx 3.14159$,你的计算结果是 $3.14$,那么前向误差就是 $0.00159$。在深度学习中,损失函数(Loss Function)的值,本质上就是模型预测值与真实标签之间前向误差的一种度量。
2. 后向误差(Backward Error)
后向误差则是一种反向思维,它不直接看结果的对错,而是去寻找这个结果的'合理解释'。
定义: 如果存在一个输入的微小扰动 $\hat{x}$,使得计算机给出的结果 $\hat{y}$ 恰好是这个新输入的精确解(即 $\hat{y} = f(\hat{x})$),那么: $$ \text{Backward Error} = |\hat{x} - x| $$
直观理解:我们得到的这个'错误'结果,可以看作是某个'略微改动'的输入的'精确'结果。后向误差就是衡量输入到底改了多少。
为什么后向误差更重要?
在现实世界和深度学习中,输入数据本身就不是 100% 精确的(例如,传感器读数有噪声,图片像素有干扰)。
- 如果一个算法的后向误差很小(例如,小于机器自身的精度 $\varepsilon$),这意味着:'算法计算产生的误差,其影响程度不比输入数据本身固有的噪声更大。'
- 既然我们无法避免输入端的误差,那么一个能将计算误差控制在输入误差范围内的算法,就是我们可以信赖的'好算法'。
这种特性,被称为后向稳定(Backward Stable)。
算法的黄金标准: 一个算法是后向稳定的,如果它的后向误差满足: $$ \text{Backward Error} \le C \cdot \varepsilon $$ 其中 $C$ 是一个温和的常数,$\varepsilon$ 是机器精度。
深度学习中的数值稳定性应用
理论有些枯燥,我们看看它在《动手学深度学习》(D2L) 等实践中如何体现。
案例 1:Softmax 的数值稳定实现
标准的 Softmax 函数为: $$ \text{softmax}(x)_i = \frac{e^{x_i}}{\sum e^{x_j}} $$ 当 logits $x$ 的值很大时,$e^{x_i}$ 很容易上溢(overflow),导致前向误差变成无穷大(NaN)。
D2L 中介绍了数值稳定的实现方法: $$ \text{softmax}(x)_i = \text{softmax}(x - \max(x))_i $$ 这个操作在数学上并不'精确',它改变了原始计算。但从后向误差的角度看,它相当于对原始输入 $x$ 做了一个极小的平移,而这个平移带来的后向误差,远小于直接计算导致前向误差无穷大的灾难。这正是为了追求'后向稳定'而对算法做出的优化。
案例 2:混合精度训练(FP16)的合理性
为什么用 FP16 这种低精度浮点数也能训练出大模型?
- 使用 FP16,意味着每一步计算都会引入比 FP32 更大的前向误差。
- 但从的角度看,这些由精度截断引入的误差,其效果等价于。


