LLM 中的高斯分布权重Gaussian distributed weights for LLMs
本文探讨了为大型语言模型(LLMs)设计高斯分布权重的技术方案,重点分析了 NF4 和 FP4 两种 4 位浮点格式在量化过程中的应用。NF4 是一种专为高斯分布优化的 4 位数据类型,相比标准 FP4 能更好地保持数值分布特性,提升低比特量化下的模型性能。文章指出,当从 Hugging Face 下载四比特量化的 LLM 权重时,这些权重通常采用 NF4 或 FP4 格式存储。作者强调,这种基于统计特性的量化方法显著提高了低精度推理的准确性和稳定性。
John Cook
前文探讨了 FP4 4位浮点格式。本文将介绍另一种 4 位浮点格式 NF4 及其更高精度的变体。NF4 和 FP4 是 bitsandbytes 中常见的 4 位数据类型。如果你从 Hugging Face 下载了量化为四位的 LLM 权重,这些权重可能采用 NF4 或 FP4 格式。当然也可能是其他格式:4 位数字的实现方式多种多样,令人惊讶。
为何选择 NF4?
LLM 参数大致呈高斯分布,因此等间距的数值并不理想。理想情况下,靠近 0 的值应更密集。
前文所述的 FP4 浮点数在小值区间间距为 0.5,大值区间则变为 1 或 2,虽远非高斯分布,但比均匀分布更接近高斯特性。而 NF4 则有意遵循更接近高斯分布的数值间隔。
QLoRA 格式 [1] 与 FP4 不同,它并非 IEEE 浮点数的模拟。其比特位不解释为符号、指数和尾数,而是作为整数索引使用。NFn 表示一个指向包含 2^n 个具有高斯间距实数的列表的索引。换言之,NFn 所表示的数值具有均匀分布的标准分数(z-score)。
从宏观上看这很合理,但论文 [1] 的细节部分难以理解。文中写道:
更正式地说,我们按如下方式估计数据类型的 2^k 个值 q_i: 其中 QX(·) 是标准正态分布 N(0, 1) 的分位数函数。
论文未明确 i 的取值范围,但提到共有 2^k 个值,暗示 i 从 0 到 2^k−1 或从 1 到 2^k。无论哪种情况都会遇到无穷值,因为 Q(0) = −∞ 且 Q(1) = +∞。为避免无穷值,我们可以让 i 从 1 到 2^n−1。
下一句话令人费解。
对于对称 k 位量化的问题在于,这种方法无法精确表示零,而零的精确表示对量化填充符和其他零值元素至关重要,否则会产生误差。
我理解需要精确表示 0 的动机,但上述公式在 i = 2^n−1 时确实能精确表示 0。或许作者原本考虑的是 i 取值为 ½, 1+½, 2+½, ..., 2^n−½。这在逻辑上合理,但对数学符号的使用极为罕见。真正的核心问题可能不是缺乏 0 的表示,而是存在一个未被使用的索引——i 本应从 1 到 2^n−1。
公平起见,上面引用的第一句说的是“我们估计 2^k 个值……”,因此该公式可能并非定义式,而是实际定义的动机说明。
重现 NF4
作者给出了利用 2^n 个 i 值并实现零的精确表示的方法,同时在附录 E 中列出了 NF4 的具体数值。但我未能使两者完全匹配。我尝试了论文描述中几种可能的解释方式,每种都能近似附录中的数值,但精度不足。
以下代码借助 ChatGPT 编写,通过逆向工程还原 NF4 数值,精度达小数点后八位,即 32 位浮点数的精度水平。
from scipy.stats import norm
Q = norm.ppf
α = 0.9677083
Z = Q(α)
δ1 = (α - 0.5)/7
δ2 = (α - 0.5)/8
q = [0]*16
for i in range(7):
q[i] = -Q(α - i*δ1)/Z
for i in range(8):
q[i+8] = Q(0.5 + (i+1)*δ2)/Z
# Values given in Appendix E
NF4 = [
-1.0,
-0.6961928009986877,
-0.5250730514526367,
-0.39491748809814453,
-0.28444138169288635,
-0.18477343022823334,
-0.09105003625154495,
0.0,
0.07958029955625534,
0.16093020141124725,
0.24611230194568634,
0.33791524171829224,
0.44070982933044434,
0.5626170039176941,
0.7229568362236023,
1.0
]
# Compare
for i in range(16):
print(i, NF4[i] - q[i])神秘常数 α = 0.9677083 的来源不明。我问 ChatGPT 进一步分析,它指出 bitsandbytes 使用的是 α = 929/960 = 0.9677083333333333。使用该值时精度基本一致,尚可接受。然而论文中给出的数值精确到小数点后十六位,我以为或许能匹配更高精度。
除了对 NF4 的精确值存在一些争议外,NF4 格式在实践中表现良好。使用 NF4 进行 4 位量化的模型在某些基准测试中优于采用其他 4 位量化格式的模型。
相关文章
[1] QLoRA: Efficient Finetuning of Quantized LLMs by Tim Dettmers, Artidoro Pagnoni, Ari Holtzman, and Luke Zettlemoyer. https://arxiv.org/abs/2305.14314.
需要完整排版与评论请前往来源站点阅读。