M1-033M1: Mathematics & Statistics FundamentalsNumerical StabilityMedium
Mastery:
Numerical Stability: 解释混合精度训练中的 loss scaling,为什么它能防梯度下溢。
📐 Mathematical Definition
⚡ Executive Summary
Core Concept: FP16 最小正规数很小,梯度易下溢为 0;把 loss 放大 S 倍,梯度同比放大,更新前再除回。
📌 Key Takeaways
- •动态 loss scaling 会检测 inf/NaN 并调整 S
- •BF16 动态范围大,通常不需要 loss scaling
📐 Mathematical Derivations
FP16 的表示范围是 [6.1×10⁻⁵, 65504](正规数),最小正规数约 6×10⁻⁵,低于此的值变为非规格化数(精度骤降)或直接下溢为 0。神经网络的梯度常落在 10⁻⁶–10⁻⁸ 量级(尤其深层或饱和区),直接以 FP16 存储会<strong>整批下溢为 0</strong>,导致这些参数永远不更新。<strong>Loss scaling</strong> 的解法是在反向传播前把 loss 乘以 S(如 2¹⁵=32768),由于反向传播的梯度与 loss 成正比,所有梯度被同比例放大到 FP16 可表示的范围;在优化器更新前再把梯度除以 S 还原。数学上完全等价,因为缩放是线性的。
🏭 Production Trade-offs
动态 loss scaling 是工程化的关键:若检测到梯度中出现 inf/NaN(说明 S 过大导致上溢),则跳过该步更新并把 S 减半;若连续若干步没有溢出,则把 S 加倍以充分利用精度。这套机制由 PyTorch AMP 的 <code>GradScaler</code> 自动完成。两个对比点:① <strong>BF16 通常不需要 loss scaling</strong>——BF16 的指数位与 FP32 相同(8 位),动态范围约 10⁻³⁸–10³⁸,与 FP32 一致,只是尾数位少(7 位 vs 23 位),故不存在下溢问题,代价是精度略低。这也是大模型训练普遍转向 BF16 的原因。② <strong>必须保留 FP32 主权重副本</strong>——优化器更新(尤其 Adam 的二阶矩)对精度敏感,若直接在 FP16 权重上更新会因舍入误差累积而损失精度;标准做法是维护 FP32 master weights,每次前向时转为 BF16/FP16。
⚠️ Common Interview Pitfalls
- ✕认为 loss scaling 改变了训练目标(它是线性等价变换)
- ✕在 BF16 下也照搬 FP16 的 loss scaling 策略
🎯 Interviewer Follow-ups
- ?BF16 与 FP16 的取舍?
- ?为什么权重更新要用 FP32 主副本?
📚
Associated Knowledge Base Guides & Mindmaps
Explore the comprehensive technical article, exam cards, and global architecture tree.