虽然 8bit 和 4bit 在内存里是“整数”,但我们用它们去代表小数,靠的是“先记录 min/max,再换算回来”。
所以它们不是纯整数意义上的“0、1、2…”,而是映射(approximate)了一堆小数,像“0.1、0.12、0.15…”
比如我们把一个地图分成 10 格(0~9):
第 0 格表示 “0.0 km”
第 9 格表示 “1.0 km”
那么第 1、2、3… 格就代表:
这些整数就是我们说的「量化值」
它们背后代表的物理意义是小数
比如一个权重张量范围在:
min = -1.0
max = +1.0
bit位 | 可用格子数 |
---|---|
8bit | 256 格子 |
4bit | 16 格子 |
我们用整数编号(0~255)分别去代表这 256 个小数格子
我们把小数量化成整数:
quantized = round((float_val - min) / (max - min) * (levels - 1))
反量化时再换回来:
float_val ≈ min + quantized * step
step = (max - min) / (levels - 1)
min = -1.0
max = +1.0
levels = 256
step = (1.0 - (-1.0)) / (256 - 1) = 2 / 255 ≈ 0.0078
所以:
看到没?虽然我们只存了整数 0~255,但它们可以近似表示很多很多个小数值
min = -1.0
max = +1.0
levels = 16
step = 2 / 15 ≈ 0.133
所以当你看到“这个 4bit 数字表示 0.12”时,意思是:
✅ 回答:
是的,它在内存里是整数(比如 8bit 中的 128),
但它代表的是:你映射区间里的某个小数(比如 0.0 或 0.12),这是靠量化映射出来的。
量化就是:我们用“有限的整数编号”,去代表“无限的小数空间”中的某些值。
小数精度高,整数存储省,量化就是两者之间的桥梁。