一句话定义

码本量化(Codebook Quantization / Vector Quantization,VQ) 指预先准备一张码本——里面是若干个「码字」,每个码字是一个小向量;量化时把待压缩的一组数值(比如连续的 32 个权重)整体换成离它最近的那个码字的编号,存下来的是编号,不是数值。

标量量化是对每个数单独开一枪,打在哪一格就记哪一格;向量量化是把一组数当一个整体,去码本里找一个最像的模板,只记模板号。

它解决什么问题

标量量化忽略了一件事:同一块里的数值是相关的。一层权重里相邻元素往往成组出现相似的模式,逐个独立量化等于把这份相关性浪费掉。率失真理论里这是老结论——联合编码一组数,比逐个编码更省比特。

落到工程上有两个好处:

  • 压缩比可以走出 8 位、4 位的整数格点。 码本里放 256 个码字就是 8 位索引,放 16 个就是 4 位;码字本身是浮点或高精度整数,等于用「少而精」的模板换「多而粗」的格点。
  • 误差按块摊平。 一个块整体选模板,块内误差互相抵消一部分,块与块之间的误差不会累积成方向性偏移。

换来的代价也很直接:解码从「乘法」变成「查表加拼接」。查表是不规则访存,对缓存和带宽敏感。

关键做法

定块大小与码本大小。 索引位数决定码本容量(b 位 → 2^b 个码字),块大小决定一次查表覆盖多少权重。块越大,压缩收益越高,但码本要表达的形态也越复杂,学起来越难;块太小则索引开销吃掉收益。

码本从哪来。 一条路是离线聚类:拿训练或校准数据跑 k-means,得到码本后冻结。另一条是可训练码本——码字和「哪块用哪个码字」一起学,梯度通过取整那一步用直通估计器(STE)绕过去。arXiv 上有一篇工作(2610.41822)走的就是后者,把向量量化当作大模型权重压缩的手段,让码本跟着任务目标一起优化,而不是只拟合权重的几何分布。

索引要能被硬件直接吃。 索引位宽、块的对齐、码本放在片上还是常量内存,都影响解码 kernel 能不能向量化。查表实现得不好,省下的带宽会被随机访存吃回去。

码本可以分层。 按通道、按层、按专家各配一张码本,等于给不同分布留不同的模板库;共享一张码本则省存储、但表达力弱。

常见误区

  • 「压缩比越高越划算。」 压缩比是文件体积的比值,不是收益的比值。降到 2 位、码本却要常驻内存、解码还要额外指令,净收益可能为负。
  • 「省了存储就等于省了时间。」 权重小了,读取次数少,但每次读取变成查表。带宽紧、缓存小的设备上,查表可能比直接乘加更慢。
  • 「码本是一次性资产。」 码本是从某一份权重分布里学出来的。换模型、换结构、甚至大幅换数据分布,旧码本的匹配度都会下降。
  • 「向量量化只适合超大模型。」 反过来更常见:小模型本来就没多少冗余,码本带来的解码开销占比更高。

用不上的时候

  • 设备的带宽和缓存本来就宽裕,瓶颈在算力——那该看算子,不该看压缩。
  • 推理引擎没有查表解码的 kernel,只能退回软件实现,比不压缩还慢。
  • 精度预算只到 8 位,标量量化加逐通道 scale 就够,不必引入码本这套额外资产。
  • 交付后没有能力验证「换季新品」这类分布外样本,码本的匹配风险无法评估。

参考

arXiv:2610.41822,Trainable Vector Quantization for Large Language Models(2026-10-30)。论文把向量量化作为压缩大模型权重、降低内存占用并加速推理的手段,重点在「可训练」:码本与分配不是离线聚类一次定死,而是参与优化。原文:http://arxiv.org/abs/2610.41822v1

站内对照可看 激活值码本编码:那篇讲的是把码本用在层间传输的激活值上,用查表跳过下游投影;本篇讲的是用码本压权重本身。两者机制相同,收益来源不同——一个省通信,一个省存储。

延伸阅读

相关词条


火眼识别提供端侧视觉引擎与设备管理平台,相关方案见 火眼识别官网。