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 模型效果
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐