M1-033M1: Mathematics & Statistics FundamentalsNumerical StabilityMedium
Mastery:

Numerical Stability: 解释混合精度训练中的 loss scaling,为什么它能防梯度下溢。

📐 Mathematical Definition
g~=S⋅g,θ←θ−η g~/S\tilde g=S\cdot g,\qquad \theta\leftarrow\theta-\eta\,\tilde g/S
⚡ 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.

← PreviousM1-032: Numerical Stability: 写出 log-sum-exp 技巧,并说明它解决了什么问题。📋Back to BankNext →M1-034: Numerical Stability: 解释为什么用 log1p(exp(-|z|)) 计算 BCE,而不是直接 log(1+exp(-z))。