• 文章
  • 向量搜索中的乘积量化 | Qdrant
返回 Qdrant 内部原理

向量搜索中的乘积量化 | Qdrant

Kacper Łukawski

·

2023年5月30日

Product Quantization in Vector Search | Qdrant

揭秘乘积量化:简化数据管理效率

Qdrant 1.1.0 引入了对 标量量化的支持,这是一种将通常由 float32 表示的值用 int8 表示,从而将内存占用减少多达四倍的技术。

向量搜索中的内存使用可以进一步减少!欢迎使用 乘积量化,这是 Qdrant 1.2.0 的全新功能!

什么是乘积量化?

与所有其他量化方法一样,乘积量化将浮点数转换为整数。然而,这个过程比 标量量化 稍微复杂,并且更具可定制性,因此您可以在内存使用和搜索精度之间找到最佳平衡点。本文介绍了执行乘积量化的所有步骤及其在 Qdrant 中的实现方式。

乘积量化如何工作?

假设我们有一些向量正在添加到集合中,并且我们的优化器决定开始创建一个新的段。

A list of raw vectors

将向量切分成块

首先,我们的向量将被划分为,也称为子向量。块的数量是可配置的,但根据经验法则——块的数量越少,压缩率越高。这也会降低搜索精度,但在某些情况下,您可能更希望将内存使用保持在最低水平。

A list of chunked vectors

Qdrant API 允许选择从 4 倍到 64 倍的压缩率。在我们的示例中,我们选择了 16 倍,因此每个子向量将包含 4 个浮点数(16 字节),最终将由一个字节表示。

聚类

我们的向量块随后被用作聚类算法的输入。Qdrant 使用 K-means 算法,其中 $ K = 256 $。这是预先选择的,因为这是一个字节能表示的最大值数量。因此,我们为每个块获得 256 个质心列表,并为每个质心分配一个唯一的 ID。聚类是针对每组块分别进行的。

Clustered chunks of vectors

现在,向量的每个块都可以映射到最近的质心。这是我们失去精度的地方,因为单个点只能代表整个子空间。我们可以存储最近质心的 ID,而不是使用子向量。如果我们对每个块重复此操作,我们可以将原始嵌入近似为质心 ID 的序列向量。创建的向量的维度等于块的数量,在我们的例子中是 2。

A new vector built from the ids of the centroids

完整流程

所有这些步骤构建了以下的乘积量化流程

Full process of Product Quantization

距离计算

向量搜索依赖于点之间的距离。启用乘积量化会稍微改变距离的计算方式。查询向量被分成块,然后我们将总距离计算为子向量与我们比较的向量的特定 ID 所对应的质心之间的距离总和。我们知道质心的坐标,所以这很容易。

Calculating the distance of between the query and the stored vector

Qdrant 实现

搜索操作需要计算与多个点之间的距离。由于我们计算的是与有限质心集合之间的距离,这些距离可以预先计算并重用。Qdrant 为每个查询创建一个查找表,以便随后只需将多个项相加即可测量查询与所有质心之间的距离。

质心 0质心 1
块 00.142130.51242
块 10.084210.00142

乘积量化基准测试

乘积量化是有代价的——需要执行一些额外的操作,这可能会降低性能。然而,内存使用量也可能大幅减少。像往常一样,我们做了一些基准测试,以便让您对可能的结果有一个初步了解。

同样,我们重用了与 我们发布的其他基准测试 相同的流程。我们选择了 Arxiv-titles-384-angular-no-filtersGlove-100 数据集来衡量乘积量化对精度和时间的影响。两次实验均在 $ EF = 128 $ 的条件下进行。结果总结在下表中

Glove-100

原始1D 聚类2D 聚类3D 聚类
平均精度0.71580.71430.67310.5854
平均搜索时间2336 µs2750 µs2597 µs2534 µs
压缩率x1x4x8x12
上传和索引时间147 s339 s217 s178 s

乘积量化会增加索引和搜索时间。压缩率越高,搜索精度越低。主要的好处无疑是减少了内存使用。

Arxiv-titles-384-angular-no-filters

原始1D 聚类2D 聚类4D 聚类8D 聚类
平均精度0.98370.96770.91430.80680.6618
平均搜索时间2719 µs4134 µs2947 µs2175 µs2053 µs
压缩率x1x4x8x16x32
上传和索引时间332 s921 s597 s481 s474 s

事实证明,在某些情况下,乘积量化不仅可以减少内存使用,还可以缩短搜索时间。

乘积量化 vs 标量量化

标量量化相比,乘积量化提供了更高的压缩率。然而,这伴随着相当大的精度权衡,有时还会影响内存中的搜索速度。

乘积量化在某些特定场景下更受欢迎

  • 在低内存环境部署,其中限制因素是磁盘读取次数而不是向量比较本身
  • 原始向量维度足够高的情况
  • 索引速度不是关键因素的情况

在不符合上述情况的环境中,应首选标量量化。

在 Qdrant 中使用乘积量化

如果您已经是 Qdrant 用户,我们提供了 乘积量化 文档,可帮助您为数据设置和配置新的量化方法,甚至实现高达 64 倍的内存减少。

准备好体验乘积量化的强大功能了吗?立即注册免费的 Qdrant 演示,立即优化您的数据管理!

本页对您有帮助吗?

感谢您的反馈!🙏

很抱歉听到您这样说。😔 您可以在 GitHub 上编辑此页面,或创建一个 GitHub Issue。