Lloyd-Max 每次只看一个数字。但 128 维的 embedding 不是 128 个独立数字。
如何把多个维度当作整体来量化?
上一章的 Lloyd-Max 是标量量化——每个维度独立处理。但想象一个 2D 的例子:数据点沿着一条斜线分布。如果你对 x 轴和 y 轴分别做标量量化,码字会形成一个网格,大量码字浪费在没有数据的区域。
向量量化(VQ)把多个维度当作一个整体,码字直接放在数据密集的地方。1980 年,Linde、Buzo 和 Gray 发表了 LBG 算法——本质上就是 K-means 推广到高维。
2D 点云对比:左边是标量量化(网格),右边是向量量化(K-means)。注意码字的位置差异。
VQ 在 2D 很完美。但真实场景中,embedding 是 128 维、768 维甚至更高。问题来了:
如果 d = 128(典型 embedding 维度),k = 256(8 bit 精度):
完全不可能存储。即使 k = 2(只分两类),128 维也需要 2¹²⁸ ≈ 10³⁸ 个码字。这就是维度诅咒——高维空间中"体积"指数增长,有限的码本无法覆盖。
2011 年,Hervé Jégou 等人在 PAMI 发表了一个精妙的解决方案:Product Quantization(PQ)。核心思想出奇简单——
把 d 维向量切成 m 段,每段独立做向量量化。
| 方法 | 码本大小 | 每向量存储 | 可行性 |
|---|---|---|---|
| 原始 VQ | 256¹²⁸ (不可行) | 128 bytes | 不可能 |
| Product Quantization | 8 × 256 = 2,048 | 8 bytes | 64x 压缩 |
| 标量量化 (8 bit) | 256 | 128 bytes | 4x 压缩 |
8 维向量被切成 2 段(每段 4 维,简化为 2D 展示)。每段独立聚类,用不同颜色标识。拖动分段数滑块看效果。
PQ 不只是理论。2017 年,Meta AI Research 开源了 FAISS(Facebook AI Similarity Search),PQ 是其核心组件之一。
预计算 query 子向量到每段码字的距离(m×k 次),然后对每个数据库向量只需 m 次查表 + 求和。十亿级检索毫秒完成。
今天,几乎所有大规模 embedding 检索场景都在用 PQ 或其变体:Meta 的推荐系统、Spotify 的音乐推荐、Airbnb 的房源搜索、Google 的图像搜索。你每天使用的推荐系统背后,很可能就是 PQ 在工作。
三人联合提出 LBG 算法(以三人姓氏首字母命名),将 K-means 聚类从低维标量推广到高维向量空间。LBG 算法是向量量化的标准训练方法:在高维空间中寻找最优码本,使得量化失真最小。这一突破证明了向量量化在理论上可以逼近 Shannon 的率失真极限。
2011 年在 IEEE PAMI 发表 Product Quantization(乘积量化)论文,提出了解决向量量化"维度灾难"的关键方案:将高维向量切分为多个低维子空间,每个子空间独立量化。这使得十亿级向量的近似最近邻检索成为可能。后来加入 Meta AI,主导开发了 FAISS 库(2017),现已成为工业界向量检索的标准工具。
直觉:标量量化只需 k 个码字(如 256 个),但向量量化需要 k^d 个——这是指数爆炸。对于 d=128 维、k=256 的情况,码本大小为 256^128 ≈ 10^308,比宇宙中的原子数还多。这就是为什么直接的向量量化在高维空间中不可行。
k — 每维的量化级数(如 256 = 8 bit)d — 向量维度k^d — 高维码本所需的码字总数
直觉:把一个 128 维向量切成 8 段(每段 16 维),每段独立用 256 个码字量化。存储空间从 128 字节降到 8 字节(64 倍压缩),码本从天文数字缩减到 2048 个码字。代价是丢失了跨子空间的相关性,但实践中这个近似非常有效。
m — 子空间数量(如 8)k — 每个子空间的码字数(如 256)d/m — 每个子空间的维度(如 128/8 = 16)
直觉:查询向量 q 不量化(保持精确),只对库中的向量 x 使用量化近似。计算距离时,预先算好 q 的每个子段到所有码字的距离(建表),然后对每个库向量只需查 m 次表再求和。这使得十亿级检索在毫秒内完成。
q — 查询向量(不量化)x̃ — 库中向量的 PQ 近似qᵢ — 查询向量的第 i 个子段c_mᵢ(xᵢ) — x 第 i 个子段对应的码字
PQ 解决了高维数据的压缩检索问题。但当压缩对象变成神经网络本身——
数十亿个权重参数,每个都有不同的重要性——怎么办?
下一章:当神经网络遇到压缩 — 从剪枝到蒸馏到 GPTQ/AWQ。