M3-072M3: Deep Learning FoundationsTraining Stability & Mixed PrecisionMedium
Mastery:
Training Stability & Mixed Precision: 解释 loss scaling 的机制与动态调整。
📐 Mathematical Definition
⚡ Executive Summary
Core Concept: FP16 下把 loss 乘 scale 使梯度上移避免下溢,更新前除回;动态调整:溢出则减半、稳定则翻倍。
📌 Key Takeaways
- •scale 太小→梯度下溢;太大→上溢为 inf
- •检测到 inf/NaN 则跳过该步并把 scale 减半
- •连续 N 步无溢出则把 scale 翻倍
📐 Mathematical Derivations
数学机理:FP16 的最小正规数约 6e-5,而反向传播中的梯度常小于此值(尤其深层网络的浅层梯度、以及 softmax 等小梯度算子),会<strong>下溢为 0</strong>——表现为'梯度消失'(但实际是精度问题,不是结构问题)。<strong>loss scaling</strong> 的机制是:前向计算完 loss 后乘以 scale s(如 65536=2^16),由链式法则所有梯度被同样放大 s 倍;反向后、更新参数前再把梯度除以 s(或等效地在优化器内部处理)。这样梯度在计算过程中始终处于 FP16 的'安全区间',避免下溢。<strong>为什么动态</strong>:scale 太小仍会下溢、太大则上溢为 inf(FP16 上限 65504)。<strong>动态调整算法</strong>(NVIDIA Apex/AMP 的标准实现):每步检查梯度是否含 inf/NaN;(a) 若有 → <strong>跳过该步的参数更新</strong>(防止用坏梯度污染参数)、把 scale 减半;(b) 若连续 N(如 2000)步无溢出 → 把 scale 翻倍。这使 scale 自动收敛到'接近溢出阈值'的最大安全值。<strong>BF16 为何不需要</strong>:BF16 的指数位与 FP32 相同(范围约 1e-38~3e38),梯度不会下溢,故无需缩放。
🏭 Production Trade-offs
深度剖析与工程权衡:① <strong>跳步的副作用</strong>——溢出时跳过更新会导致'有效步数'少于预期,故统计训练进度时应以'成功更新步数'计;且频繁跳步说明 scale 或 lr 设置不当。② <strong>与梯度裁剪的顺序</strong>——标准顺序是:反向后先 unscale(除回 s)、再裁剪、再更新;若先裁剪后 unscale,裁剪阈值会被 scale 放大而失效。这是实现中最易错的细节。③ <strong>master weights</strong>——混合精度训练需保留一份 <strong>FP32 的主权重</strong>:前向用 FP16/BF16、更新在 FP32 上做(因为 FP16 无法精确表示'小学习率下的增量',θ+Δθ 时 Δθ 可能被舍入掉)。这是'混合精度'的完整含义。④ <strong>与 AMP 的关系</strong>——PyTorch 的 torch.cuda.amp 自动处理 loss scaling 与 master weights;用户只需 autocast + GradScaler。⑤ <strong>BF16 时代的简化</strong>——BF16 不需要 GradScaler,代码更简单、训练更稳;这是 BF16 迅速取代 FP16 的工程原因。⑥ <strong>面试要点</strong>——被问'混合精度训练要注意什么',应给出三要素:<strong>loss scaling(防下溢)+ FP32 master weights(防增量丢失)+ 关键算子保持 FP32(softmax/LN/loss)</strong>;这三条能覆盖绝大多数实现细节问题。
⚠️ Common Interview Pitfalls
- ✕先裁剪再 unscale(裁剪阈值被放大而失效)
- ✕不保留 FP32 master weights(小学习率下增量被舍入丢失)
🎯 Interviewer Follow-ups
- ?为什么 scale 要动态而非固定?
- ?BF16 下为什么不需要 loss scaling?
📚
Associated Knowledge Base Guides & Mindmaps
Explore the comprehensive technical article, exam cards, and global architecture tree.