一句话定义
乘积量化(PQ, Product Quantization)把 d 维向量切成 m 段,每段用一个 256 码字的小码本编码成 1 字节,整向量只存 m 字节(3072 维 float32 → 96 字节是 32 倍压缩);距离用查表法 ADC 近似——十亿级向量内存检索的奠基算法。
为什么重要
PQ 回答了向量压缩的"极限问题":当 SQ 的 4 倍压缩仍不够时,如何做到 16~64 倍仍保持可用召回。IVF-PQ(IVFADC)是 FAISS 支撑十亿级检索的经典结构,也是理解所有"码本类"方法(OPQ、AQ、残差量化)的原型。二进制量化(kp-031)则是它思想在 1 bit 端的延伸。
前置知识
kp-011(SQ——"量化"思想的入门形态)、kp-003(L2 距离);聚类概念(与 kp-007 的 k-means 同源)。
核心概念
- 子空间切分:d 维切成 m 段,每段 d/m 维,各段独立做 k-means(k=256,即 2⁸)。
- 码本(codebook):每段的 256 个质心表;全库码本共 m × 256 个质心。
- PQ 码:每向量 = m 个码字索引 = m 字节。
- ADC(Asymmetric Distance Computation):查询向量保持浮点,逐段预计算"q 与 256 个码字"的距离表,向量距离 = 查表求和——把 d 维距离计算降为 m 次查表。
- OPQ(Optimized PQ):在量化前学一个正交旋转,使各子空间方差均衡,直接降低量化误差。
原理与机制
建库:对每段独立跑 k-means 得 256 质心;每向量的每段找最近码字,记录索引。查询(ADC):
1. 预计算距离表 LUT[j][c] = ‖q_j - c_j‖² (j=1..m 段, c=0..255)
2. 对每个库向量 x(码 x_1..x_m):
d̂(q,x) = Σ_j LUT[j][ x_j ] ← 仅 m 次查表加法误差性质:估计距离与真距离之差由各子空间量化误差构成(平方误差可加),m 越大每段维度越低、单段失真越大但字节越多——m 是"内存换召回"的总闸。典型配置:d=768、m=48~96、每段 16~8 字节压缩到 48~96 字节。
OPQ 的动机:原始维度切分后各段方差差异大(相关维度挤在同段),量化误差不均。OPQ 交替优化"旋转矩阵 R"与"各段码本",最小化整体量化误差;FAISS 中通常先做 OPQ 旋转再进 IVF-PQ。
参数影响分析:
| 参数 | ↑ 的收益 | ↑ 的代价 | 经验 |
|---|---|---|---|
| m | 召回升(每段维度高、失真小) | 存储与查表成本线性升 | m ∈ d/16 ~ d/4 |
| 每段码字 256 | 1 字节对齐、SIMD 友好 | 再大破坏字节对齐 | 一般固定 256 |
公式或模型
存储: m 字节/向量 (通常 = d/8 ~ d/16)
压缩率: d×4 / m (768 维、m=96 时 32 倍)
误差: E‖x-x̂‖² = Σ_j E‖x_j - c_{x_j}‖² (各段可加, OPQ 最小化它)图示
768 维向量 x = [x1..x8|x9..x16| … |x761..x768] ← 切 m=96 段, 每段8维
每段: 8 维 ──最近码字──► 1 字节索引 (0..255)
码: [37][201][0][99] … [12] 共 96 字节
查询: 预算 LUT(96×256) → 每库向量 96 次查表求和 ≈ d̂ 距离实例或案例
十亿级图片特征检索(FAISS 论文场景):30 亿条 128 维。fp32 需 1.5 TB 无法单机;IVF(nlist≈1M) + PQ(m=16, 16 字节/向量) 后原始向量约 48 GB,配合 IVF 剪枝单机可服务,recall@1 约 0.6~0.7,再用"取回原始向量精排"把可用召回拉起——PQ 的定位从来是"粗排 + 精排"管线里的粗排腿。
直观类比
描述一个人不记全部特征,而是"发型选图册第 37 页、体型选第 201 页、穿搭选第 0 页"——每页是 256 选 1 的小抄(码本), comparing 两人就逐页比对小抄差异(查表)。OPQ 相当于先重新组织"测量维度",让每页小抄的信息量最均衡。
常见误区
- "PQ 距离可以当精确分数用"——d̂ 只保证排序趋势,绝对值有系统偏差;做阈值判断或打分展示必须用精排后的真实距离。
- "m 越大越好"——每段维度小于 4 后码本覆盖急剧变差,且字节成本线性上涨;过大还会让训练集不足(每段码本也要样本喂饱)。
- "PQ 能替代 HNSW"——二者解决不同端:PQ 压内存、图管导航;生产组合是"图/IVF 导航 + PQ 表示",不是二选一。
自测题
- 1024 维向量、目标 64 字节/向量,m 取多少?每段几维?
- ADC 为什么是"非对称"距离计算?
- OPQ 在 PQ 之前加了一步什么?为什么有效?
答:m=64,每段 1024/64=16 维;每段码本 256×16 维,需保证训练样本量充足。
答:查询侧用原始浮点向量、库侧用量化码字,两侧表示不对称;对称版(SDC)两侧都用码字,精度更低但可离线预计算。
答:学一个正交旋转让各子空间方差均衡、减少段间信息冗余,直接降低可加的量化误差,同等 m 下召回更高。
与其他知识点的关系
kp-007 的 IVF 提供剪枝、本篇提供压缩,合成 IVFADC;kp-026 的成本账里 PQ 是"十亿级可单机"的关键项;kp-031 把量化推到 1 bit 极端并用理论界补救。
延伸阅读
Ge, He, Ke, Sun, "Optimized Product Quantization"(IEEE TPAMI 2014)——OPQ 旋转优化与码本联合训练的原始论文。