技术笔记

混合精度训练与推理:BF16 数值下溢规避与动态损失缩放实践

深入解析深度学习数值精度的底层细节:为什么 FP16 频频发生数值溢出崩溃,而 Bfloat16 凭借宽广动态范围成为前沿标准。

2026年7月10日阅读约 2 分钟
混合精度BF16FP16数值稳定性

浮点数表示的微观世界:指数位与尾数位的抉择

在 16 位浮点数中,硬件设计者面临着**动态范围(由指数位 Exponent 决定)与有效精度(由尾数位 Mantissa 决定)**的取舍:

  • 标准 FP16 (IEEE 754):包含 1 个符号位、5 个指数位和 10 个尾数位。其最大表示数值仅为 65,504!在千亿模型注意力计算中,梯度极易超过该阈值导致溢出(NaN)引发训练中断;
  • Bfloat16 (Brain Floating Point):拥有与标准 FP32 完全相同的 8 个指数位,仅牺牲尾数位至 7 位。其动态范围与 FP32 完全等价,从根本上消除了数值下溢与溢出风险。

为什么现代前沿模型全面转向 BF16

在现代大模型预训练与微调中,BF16 已成为绝对主流:

  1. 摆脱动态损失缩放 (Dynamic Loss Scaling):由于 FP16 动态范围极窄,旧架构必须实时监控梯度幅值动态缩放 Loss。一旦缩放因子选择不当就会引发震荡;而 BF16 原生无需任何复杂的损失缩放;
  2. 算子数值安全:在 Softmax、LayerNorm 与 RMSNorm 等敏感规约算子中,累加过程暂时保持 FP32 精度,输出时转回 BF16,实现速度与稳定性的完美平衡。

浮点溢出阈值边界判定纯 JS 模拟

import assert from "node:assert/strict";
function isFP16Safe(val) {
  return Math.abs(val) <= 65504;
}
assert.equal(isFP16Safe(50000), true);
assert.equal(isFP16Safe(70000), false);

原始资料与溯源链接

感谢阅读本文

如果你觉得内容有帮助,欢迎点赞支持或分享给同行开发者。

0 次阅读0 人赞过