同为半精度,BF16 和 FP16 有什么区别?
浮点数由 3 部分组成
- 符号 位 S:表示数据正负
- 指数位 E :指数位代表可表示的数值范围,位数越多可表示数据的范围越大
- 尾数位 M:就是有效数字,位数越多可表示数据的精度越高
- 以 FP16 为例,1 位符号 + 5 位指数 + 10 位尾数 = 16 位
- 以 BF16 为例,1 位符号 + 8 位指数 + 7 位尾数 = 16 位
- 以 FP32 为例:1 位符号 + 8 位指数 + 23 位尾数 = 32
位这使得:
- BF16 可表示数据的范围更大(与 FP32 一样,8 位指数),而 FP16 范围较小
- FP16 精度更高,BF16 精度较低
- FP32 与 BF16 可表示的数据范围一致
为什么现在 BF16 更受欢迎?
- 训练稳定性:由于保持了 FP32 的数值范围,BF16 在反向传播时梯度更稳定,不太需要额外的 loss scaling(损失缩放)等技巧
- 硬件友好:BF16 可以直接转换到 FP32(只需补 0),计算效率更高
- 计算速度快:浮点数乘法和除法的能耗与尾数长度的平方成正比,所以 BF16 在运算速度上有天然优势
- BF16 与 FP32 兼容性好:从 FP32 转换为 BF16 只需截断尾数,而 FP16 转 BF16 需处理溢出问题
本文短链接:
If you have any questions or feedback, please reach out

.