NF4 是一种更聪明的 4bit 压缩方法,它知道「有些值在神经网络里很常见」,所以就把稀缺的 4bit 编码资源优先给这些常见值更高的精度,稀有值就少给点精度
NF4是一种智能4bit量化方法,不同于传统线性均匀量化,它会根据神经网络参数的实际分布特点进行非线性优化。分析发现模型参数多集中在中间区域[-0.5,0.5],两端值较稀疏。因此NF4将有限的4bit编码(16个值)优先分配给高频区域,在[-0.3,0.3]区间设置更精细的分级(如0.05步长),而对低频的极端值(如±1.0)则分配较粗精度。实验表明,这种分配策略使常见中间值的量化误差显著小于线
·
NF4 是一种更聪明的 4bit 压缩方法,它知道「有些值在神经网络里很常见」,所以就把稀缺的 4bit 编码资源优先给这些常见值更高的精度,稀有值就少给点精度。
🧠 背景对比:线性量化 VS NF4 非线性量化
🔹 线性量化:平均分布
-
比如 4bit = 16 个格子
-
假设权重值范围是
[-1.0, 1.0] -
则每个格子的宽度(step)是:
step = (1.0 - (-1.0)) / 15 = 2.0 / 15 ≈ 0.133
所以编码成整数后是这样:
| 编码值 | 实际含义 |
|---|---|
| 0 | -1.0 |
| 1 | -0.867 |
| 2 | -0.733 |
| … | … |
| 8 | 0.0 |
| … | … |
| 15 | +1.0 |
📌 每个值的间距是一样的,不管这个值在模型中出现的多还是少。
🔹 NF4:非线性,关注「出现频率」
它分析了大量神经网络中真实的参数值分布,发现这些权重通常分布在 [-1, 1] 区间,但并不是平均分布的:
它更像这样(举例):
大部分值集中在 [-0.5, 0.5] 附近
两端的 -1、+1 很少见
于是 NF4 的做法是:
| 编码值 | 对应小数值 | 特点说明 |
|---|---|---|
| 0 | -1.0 | 两端值稀疏,分配得稀一点 |
| 1 | -0.7 | |
| 2 | -0.4 | |
| 3 | -0.3 | 更精细了 |
| 4 | -0.2 | |
| 5 | -0.1 | |
| 6 | -0.05 | 非常细 |
| 7 | 0.0 | 中心区域精度非常高 🔥 |
| 8 | 0.05 | |
| 9 | 0.1 | |
| 10 | 0.2 | |
| 11 | 0.3 | |
| 12 | 0.4 | |
| 13 | 0.7 | |
| 14 | 0.9 | |
| 15 | +1.0 |
✅ 你可以看到:
- NF4 在 [-0.3, 0.3] 之间分配了最多的格子
- 这保证了这些经常出现的值在量化时「误差最小」
- 那些很少出现的极端值(如 ±1.0)就牺牲一点精度没关系
📊 举个直观例子对比:
假设模型中有如下 float 权重值:
weights = [-0.05, -0.02, 0.0, 0.01, 0.03, 0.95]
我们来看看它们在两种量化下会变成什么样:
| 原始值 | 线性量化编码 | 解码值 | NF4 编码 | 解码值 | 哪个误差小 |
|---|---|---|---|---|---|
| -0.05 | 7 | 0.0 | 6 | -0.05 | ✅ NF4 准确 |
| -0.02 | 7 | 0.0 | 7 | 0.0 | 差不多 |
| 0.0 | 7 | 0.0 | 7 | 0.0 | 一样 |
| 0.01 | 8 | 0.133 | 8 | 0.05 | ✅ NF4 准确 |
| 0.03 | 8 | 0.133 | 8 | 0.05 | ✅ NF4 准确 |
| 0.95 | 14 | 0.867 | 14 | 0.9 | ✅ NF4 更近 |
📌 NF4 在中间区域非常精细,误差远小于线性量化
✅ 结论总结:说人话
| 项目 | 线性量化 | NF4(非线性量化) |
|---|---|---|
| 编码间距 | 平均划分 | 不均匀,靠近常见值更密集 |
| 中间区域精度 | 差 | ✅ 非常高 |
| 极端值精度 | 正常 | 稍差,但没关系 |
| 整体还原效果 | 一般 | ✅ 接近原始 float 模型效果 |
更多推荐
所有评论(0)