混合精度 = 用低精度格式(FP16/BF16/FP8)做前向与反向计算,FP32 保存主权重(master weights)与优化器状态,兼顾速度与精度。位布局与值域: ① FP16 = 1 符号 + 5 指数 + 10 尾数,最大可表示数
65504=215×(2−2−10),最小正规数
2−14≈6.1×10−5,最小次正规数
2−24≈6×10−8。问题: 深层网络/大批量训练中梯度经常小于
10−8,FP16 直接下溢为 0 → 参数不再更新(下溢问题)。解法 Loss Scaling: 反向前把 loss 乘缩放因子
S(常用
224 或 1024),梯度整体放大
S 倍再反传,更新前在 FP32 主权重上除回
S;动态 Loss Scaling: 检测到 Inf/NaN 时
S←S/2 并跳过该步,一段时间无溢出则
S 翻倍。② BF16 = 1 符号 + 8 指数 + 7 尾数: 指数位数与 FP32 相同 → 动态范围与 FP32 一致(约
±3.4×1038),彻底免于下溢、不需要 loss scaling;代价是尾数仅 7 位(约 3 位有效十进制数字),低精度。③ FP8: E4M3(4 指数 + 3 尾数,最大约 448,精度更高、范围小)→ 用于前向(权重/激活);E5M2(5 指数 + 2 尾数,最大约 57344,范围大、精度低)→ 用于反向梯度(防溢出/下溢)。标准训练流程: FP32 主权重副本 → 每步拷贝低精度副本做前向 → loss 乘
S 后反向 → 低精度梯度 unscale 后更新 FP32 主权重(可与 EMA、权重衰减、梯度裁剪在 FP32 上叠加)。