编程与调试 -- 深度学习 Note

同为半精度,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 .