返回 ELI5 知识库首页 🧠 AI NUMERICS & TRAINING
🔢 Google Brain · Brain Floating Point

什么是 BF16(bfloat16 脑浮点数)?

想象你是一家大超市的会计:算买菜钱不用精确到 0.0001 分(精度舍弃),但账本最大金额必须能记下几百亿(范围绝不能爆表)!BF16 专为大模型训练量身定制,把数值溢出率瞬间降为零。

⚠️ 传统标准半精度 (FP16)

精度够细,但极易“爆表”或“归零”

给尾数留了 10 位(很精确),但指数位只有 5 位(最大只能表达到 65504)。在万亿大模型训练中,梯度稍一大就瞬间溢出变成 NaN(炸模)!

指数仅 5 位 (Max: 65,504) 💥 梯度稍大即炸模 (NaN / Underflow)
  • 动态范围极其狭窄:$10^{-5} \sim 65504$,极易发生下溢与上溢
  • 必须搭配复杂缩放:需要 Loss Scaling(损失缩放)动态调参防止溢出
  • 大模型训练痛点:千亿模型反向传播极易不稳定
VS
🧠 脑浮点数 (bfloat16)

牺牲毛毛雨精度,换取海阔天空

Google Brain 提出的天才构想:直接保留与 FP32 一模一样的 8 位指数(最大达到 $10^{38}$),只缩减尾数。大模型训练完全不惧爆表!

指数全量 8 位(与 FP32 完全同宽) 动态范围:$10^{-38} \sim 10^{38}$ (无限从容) 🛡️ 告别 Loss Scaling,直接稳定收敛!
  • 动态范围与 FP32 相同:$10^{-38} \sim 10^{38}$,彻底根治数值上溢
  • 无需调参开箱即用:不需要 Loss Scaling,训练流程大幅简化
  • 截断转换零成本:FP32 转 BF16 只要“抹掉后 16 位”,硬件极轻量
💡

一句话顿悟:神经网络为什么不在乎尾数精度?

人脑和神经网络本质上是“模糊统计系统”。对于大模型来说,0.00345670.0034500 几乎没有任何区别(就像你称大象体重不在乎多了一只苍蝇); 但是如果你把金额上限记错了(数值爆表变 NaN),整栋大厦瞬间归零!BF16 把好钢用在刀刃上(保范围,放精度)

拆解 BF16 与常见浮点数的 4 大底牌

从 16 位比特分配到现代硬件支持,搞懂混合精度训练的底层密码

1️⃣

1. 符号位 (Sign: 1 bit)

决定数字的正负号(0 代表正数,1 代表负数),所有浮点格式均保留 1 位。

2. 指数位 (Exponent: 8 bits)

决定数值的宏观量级(动态范围)。BF16 与 FP32 同样拥有 8 位指数,确保大模型梯度绝不爆表。

🎯

3. 尾数位 (Mantissa: 7 bits)

决定数值的微观精度。BF16 仅保留 7 位,将显存占用减半,同时将矩阵乘法吞吐翻倍!

🚀

4. 现代硬件黄金标配

从 Google TPU v2/v3/v4、Nvidia Ampere (A100/H100) 到华为昇腾 910B,BF16 已成为全球大模型预训练的行业标准。

🕹️ 浮点格式比特位显微镜 (Bit Layout Inspector)

点击选择不同格式,直观观察 32 位与 16 位浮点数的比特结构差异:

BF16 (bfloat16) 比特分配 动态范围: 10^-38 ~ 10^38
符号位 (Sign)
指数位 (Exponent · 决定范围)
尾数位 (Mantissa · 决定精度)
核心特点: 与 FP32 具有完全相同的指数宽度(8位),转换时只需直接截断低 16 位尾数即可完成,无需任何复杂量化计算!
🏢 Google Brain 发明

TPU 的秘密武器

Google Brain 团队在研发 TPU v2/v3 芯片时,敏锐察觉到标准 FP16 的 5 位指数在深度学习反向传播中过于脆弱。

于是他们打破 IEEE 传统,创造了 bfloat16,一举奠定了现代超大模型稳定训练的基石。

⚡ 显存与带宽减半

训练吞吐的大飞跃

相比 FP32,BF16 将模型参数、激活值与优化器缓存所占显存直接减少 50%

这意味着显卡可以装下 2 倍大的 Batch Size,同时极大缓解 GPU 与 HBM 之间的数据搬运带宽瓶颈。

🔄 黄金搭档

混合精度训练 (Mixed Precision)

在实际训练中,前向传播与反向求导使用 BF16 飞速计算;

而在更新模型权重的主副本(Master Weights)时,依然保留一份 FP32 累加微小更新,实现“速度与精度”的完美统一。