一个数,能存得多细?
从原始值,到 4 个比特,再还原
本实验固定一个示例块,包含 −1、−0.4、0、0.2、0.6、1;滑块是加入该块的一个待量化值。整个块的最小值 −1,最大值 1,绝对最大值 a = 1。
这里是单块标量映射,使用原始块尺度;不演示尺度的双重量化。真实实现通常按块处理权重,还需要保存尺度等元数据。NF4 的 16 个值来自 bitsandbytes 码本,绿色标记是原值,金色刻度是选中值;非均匀不保证每个输入都比均匀映射更准。
浮点数:符号、指数、有效数字
可以把它想成二进制科学计数法:指数决定“能覆盖多大的范围”,小数位决定“同一数量级能分多细”。
| 格式 | 符号 | 指数 | 小数 | 字节 |
|---|---|---|---|---|
| FP32 | 1 | 8 | 23 | 4 |
| BF16 | 1 | 8 | 7 | 2 |
| FP16 | 1 | 5 | 10 | 2 |
符号 · 指数 · 小数
放大 1 附近:为什么有的变化被舍掉?
演示采用“舍入到最近值,中点取偶数”。正常数有隐含的最高位 1,零、次正规数、无穷大另行处理。BF16 与 FP32 指数位数相同,正常数的范围接近,但 BF16 小数更粗;FP16 在 1 附近比 BF16 更细,却更容易溢出。页面用 JavaScript 数值计算格式舍入,不是 GPU 性能模拟。