M1-072M1: Mathematics & Statistics FundamentalsNumerical StabilityMedium
Mastery:
Numerical Stability: 解释 Kahan 求和与浮点误差累积。
📐 Mathematical Definition
⚡ Executive Summary
Core Concept: 浮点加法不满足结合律;大数吃小数导致误差累积,Kahan 用补偿项恢复精度。
📌 Key Takeaways
- •浮点加法非结合:(a+b)+c ≠ a+(b+c)
- •误差随求和项数累积(最坏 O(nε))
📐 Mathematical Derivations
误差来源:IEEE 754 浮点数只有有限有效位(FP32 约 7 位十进制),故<strong>加法不满足结合律</strong>。当把一个很小的数与一个很大的数相加时,小数的低位被'吃掉'(<strong>大数吃小数</strong>)。例如在 FP32 下累加 10⁷ 个 0.01:理论上和为 10⁵,但朴素累加会因中间和不断增大而使后续小量被截断,结果可能偏差数十甚至更多。误差的最坏情况是 O(nε)(ε 为机器精度),随机情况约 O(√n·ε)。<strong>Kahan 求和</strong>的解法是维护一个<strong>补偿项 c</strong>(记录被截断的低位),每次迭代先把 c 从 x 中扣除、求和后再计算新的补偿:s_new=s+c; c_new=(s_new−s)−c。这样把丢失的低位'攒起来'在后续迭代中补偿,误差降到 O(ε)(与 n 无关),代价是每步多 4 次浮点运算。
🏭 Production Trade-offs
深度学习中的影响与对策:① <strong>梯度累加与分布式归约</strong>——大规模训练中梯度需在数万张卡间 all-reduce 求和,或用梯度累积模拟大 batch;朴素 FP16/BF16 累加会严重损失精度,故<strong>必须用 FP32 累加器</strong>(PyTorch 的 <code>torch.distributed</code> 与 NCCL 默认在 FP32 中做归约)。② <strong>损失/指标累加</strong>——计算数据集上的平均损失时,累加 n 个样本的损失(n=10⁶ 级)应用 Kahan 或至少用 FP64 累加器;否则报告的指标会有可观偏差。③ <strong>注意力与 softmax</strong>——注意力分数的求和(分母)也涉及大量累加,FlashAttention 的在线 softmax 通过'减 max'保持数值范围可控,间接缓解了该问题。④ <strong>其他缓解手段</strong>——(a) 用更高精度累加器(FP32 代替 FP16、FP64 代替 FP32);(b) <strong>成对求和(pairwise summation)</strong>——分治地两两相加,误差降到 O(log n·ε),NumPy 的 <code>sum</code> 即采用此法;(c) 排序后从小到大累加(减少大数吃小数);(d) 使用 <strong>BF16 时尤其注意</strong>(尾数位少,误差更大)。
⚠️ Common Interview Pitfalls
- ✕用 FP16/BF16 累加大量梯度(应用 FP32 累加器)
- ✕认为浮点加法满足结合律
🎯 Interviewer Follow-ups
- ?为什么小批量梯度累加也有这个问题?
- ?还有哪些误差缓解手段?
📚
Associated Knowledge Base Guides & Mindmaps
Explore the comprehensive technical article, exam cards, and global architecture tree.