在信息检索和高效向量表示领域,Product Quantization (PQ) 是一种经典的向量压缩技术。它通过分块、聚类和离散化,将高维连续向量(如神经网络生成的 embedding)压缩为紧凑的离散语义 ID,同时保留向量间的相似关系。本文将以简洁通俗的语言,结合技术细节,介绍 PQ 的具体方法,以及它在实际应用中的价值。
文章目录
1 什么是 Product Quantization (PQ)?
Product Quantization 是一种将高维连续向量转为离散ID的技术。核心思想可以概括为:“分块 + 聚类 + 索引组合”。它的目的主要有两个:
- 压缩存储:将原始向量从浮点数表示压缩为小整数序列。
- 加速查询:通过查表方式快速计算向量相似度。
1.1 PQ 的输入和输出
- 输入: 高维连续向量,例如一个 128 维的 embedding,形如
[0.12, -1.53, 0.87, ..., 2.01]。 - 输出: 一个离散的 ID 序列,由若干整数构成,例如
[42, 198, 7, 33, 121, 65, 240, 19]。
这组整数是对原始向量的压缩表示。它大幅降低存储需求,同时保留了向量的语义信息(相似向量的 ID 序列也会相似)。
1.2 PQ 的处理过程
(1) 切块(Split)
将输入向量分为 M 个子块。每个子块的维度为 d/M(假设总维度为 d)。
例如:128 维向量可以切成 8 个子块,每块包含 16 维。
(2) 建立小字典(Train Codebooks)
对每个子块的向量,单独训练一个聚类模型(如 K-means)。每个子块形成一个独立的字典(Codebook),字典中包含 K 个聚类中心。
例如:对于 8 个子块,每块的字典可能包含 256 个聚类中心:
- 子块1的字典:
{c1_1, c1_2, ..., c1_256} - 子块2的字典:
{c2_1, c2_2, ..., c2_256} - …
(3) 查字典编码(Quantize)
对新输入向量进行编码:
- 按切块规则将向量分为
M个子块。 - 对每个子块,在对应字典中找到最接近的聚类中心。
- 记录聚类中心的编号(索引)。
例如:假设某输入向量的第一个子块最接近子块1字典中的第42个聚类中心,第二个子块最接近子块2字典中的第198个聚类中心,最终输出 [42, 198, ..., 19]。
2 PQ 的特点和优势
(1) 高效压缩
- 原始向量:128 维浮点数,约占 512 字节。
- 压缩后:8 个整数 ID,仅占 8 字节。
- 压缩率:64 倍。
(2) 快速相似度计算
通过查表预计算聚类中心间的距离,PQ 避免了直接计算高维向量的欧氏距离。
例如:查询向量的相似度计算只需查表加法,速度提升显著。
(3) 强大的表达能力
通过笛卡尔积组合不同子块字典的聚类中心,PQ 可以虚拟生成指数级的组合中心。例如:
- 8 个子块,每块有 256 个聚类中心,总组合数为 (256^8 ≈ 10^{19})。
3 PQ 的典型应用场景
-
大规模图像检索
- 通过 PQ,压缩数据库中存储的图片特征向量(embedding),快速支持相似图片检索。
- 例如:Facebook 的 Faiss 库广泛使用 PQ。
-
推荐系统
- 用户和物品的 embedding 通过 PQ 压缩,提升推荐效率。
-
数据集: 常用的测试数据集有 SIFT1M、Deep1B 等。
4 PQ 的局限性和改进方向
4.1 局限性
- 子空间独立假设:PQ 假设切块后的子块之间没有相关性,这可能损失一些全局信息。
- 精度损失:编码过程中会近似原始向量,导致一定的误差。
4.2 改进方法
- 优化分块结构:
- OPQ(Optimized PQ): 通过旋转原始空间,找到更优的切块方式。
- LSQ(Learned Subspace Quantization): 端到端学习出最优的分块和聚类策略。
- 提高字典质量: 增加聚类中心数量(K 值),或使用更复杂的聚类方法。
4.3 总结
Product Quantization (PQ) 是一种高效的向量压缩技术,通过分块、聚类和离散化,将高维向量转为紧凑的离散语义 ID。它在存储压缩和检索加速方面表现优异,广泛应用于图像检索、推荐系统等领域。尽管存在一定的精度损失,但通过优化分块和改进聚类算法,PQ 的性能和适用性正在不断提高。
937

被折叠的 条评论
为什么被折叠?



