趋近智
倒排文件索引(IVF)方法为近似最近邻搜索提供了一种独特的策略。它与基于图的方法不同,不构建连接数据点的复杂图。相反,IVF将向量空间划分为不同的区域(或称单元),并将搜索工作仅集中于给定查询最相关的单元。这种方法受传统文本信息检索技术的启发。
想象你的高维向量空间。IVF首先将此空间划分为预设数量的区域,通常使用聚类算法。每个区域都有一个代表向量,称为质心。当一个新的查询向量到来时,IVF不是将其与数据集中的每一个向量进行比较,而是首先确定查询向量最接近哪些区域(单元)。随后,它只在这些选定的单元内进行更集中的、通常是详尽的搜索。这与暴力搜索相比,极大地减少了所需的距离计算次数。
构建IVF索引包含两个主要步骤:
nlist)很要紧,它决定了空间划分的粒度。每个簇在已划分的向量空间中代表一个单元。每个簇的质心作为其代表。因此,索引后,你将拥有 k 个代表分区的质心,以及一个能快速告诉你哪些向量驻留在哪个分区(单元)中的倒排列表。
当对查询向量 q 执行最近邻搜索时:
这个过程大幅加快了搜索速度,因为昂贵的距离计算仅限于 nprobe 个最有希望的单元内的向量,而不是整个数据集。
nlist 和 nprobeIVF的性能和准确性很大程度上取决于两个参数:
nlist(簇/单元数量): 这是在K-means聚类步骤中使用的 k 值。
nlist 会创建更多、更小的单元。这可以使在一个单元内的搜索更快(每个单元的向量更少),但需要检查更多单元(更高的 nprobe)以保持高准确性,因为真实邻居可能分散在相邻的小单元中。将查询与所有质心进行比较的初始步骤也稍微耗时更长。nlist 会创建更少、更大的单元。在单元内搜索耗时更长,但你可能通过探测更少单元(更低的 nprobe)来获得良好的准确性。将查询与质心进行比较更快。
最佳 nlist 通常取决于数据集大小和分布,通常建议的值范围从 N 到 4N,其中 N 是数据集大小,但通常需要进行经验性测试。nprobe(要探测的单元数量): 这决定了查询时实际搜索的单元数量。
nprobe 增加了找到真实最近邻的可能性(更高的召回率),因为它覆盖了更多潜在相关空间。然而,这会以增加搜索延迟为代价,因为需要比较更多的向量。nprobe 导致更快的搜索,但增加了遗漏位于未探测单元中的相关邻居的风险(更低的召回率)。nprobe 直接控制着给定IVF索引的搜索速度和准确性(召回率)之间的权衡。找到正确的平衡对于满足应用程序要求是不可或缺的。
IVF索引中
nprobe参数、搜索召回率和查询延迟之间的权衡示例。增加nprobe通常能提高召回率,但会增加延迟。
为进一步优化IVF,尤其是在单元内的内存使用和速度方面,它通常与向量量化技术结合,例如乘积量化(PQ)或标量量化(SQ)。量化将倒排列表中存储的全精度向量压缩为低内存表示(例如,每个向量使用更少的字节)。
在搜索阶段(上述第3步),查询向量与探测单元内压缩向量之间的距离计算可以更快地执行,通常使用基于压缩码的近似距离计算。这引入了额外的近似层,但可以大幅减少内存占用和计算成本,使IVF对于极大型数据集变得可行。具体变体通常表示为IVF-PQ或IVF-SQ。
下图展示了查询IVF索引的思想。空间被划分(由线条表示),质心标记每个单元。当查询到来时,最接近的单元被识别(在此示例中 nprobe=3),并且只搜索这些单元内的向量。
IVF查询的图示。查询向量(红色星形)与质心(蓝色圆形)进行比较。最接近的
nprobe=3个单元(1、2、4)被选中,用于搜索其中实际的数据点(小的灰色点)。与所有其他质心(3、5、6)的距离更大,因此它们的单元被跳过。
优点:
nprobe)来平衡搜索速度和召回率。缺点:
nlist 和 nprobe 值通常需要在特定数据集和查询负载上进行细致的实验和评估。IVF代表了一种基础且广泛使用的方法,用于近似最近邻搜索。它有效地划分了搜索空间,并提供了明确的参数来调整性能和准确性之间的平衡,使其成为向量数据库工具集中一种有价值的算法,经常与HNSW等基于图的方法一起使用或作为其替代。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造