Elasticsearch:在 HNSW 中提前终止以实现更快的近似 KNN 搜索

作者:来自 Elastic Tommaso Teofili

了解如何使用智能提前终止策略让 HNSW 加快 KNN 搜索速度。

在高维空间中高效地找到最近邻的挑战是向量搜索中最重要的挑战之一,特别是当数据集规模增长时。正如我们之前的博客文章中所讨论的,当数据集规模有限时,强力(brute force)最近邻搜索可能是最佳选择。另一方面,随着向量数据集规模的增加,切换到近似最近邻搜索有助于在不牺牲准确性的情况下保持查询速度。

Elasticsearch 通过分层可导航小世界算法(Hierarchical Navigable Small World algorithm)实现近似最近邻搜索。HNSW 提供了一种有效的向量空间导航方法,降低了计算成本,同时仍保持了较高的搜索准确性。特别是,它的分层结构使得能够访问候选邻居并决定是否将它们包含在最终结果集中,同时减少向量距离计算。

然而,尽管 HNSW 算法有其优势,但它可以进一步优化以适应大规模向量搜索。提高 HNSW 性能的一种有效方法是找到在特定情况下停止访问图的方法,这称为提前终止。这篇博文探讨了 HNSW 的提前终止概念以及它们如何优化查询执行。

HNSW 中的冗余

HNSW 是一种近似最近邻算法,它构建一个分层图,其中节点表示向量,边表示向量空间中向量之间的接近度。每层都包含越来越多的图节点。查询时,搜索会遍历此图,从随机入口点开始,然后通过各层导航到最近的邻居。

搜索过程是迭代的,随着检查更多节点和向量而扩展。速度和准确性之间的平衡是 HNSW 的核心,但它仍然会导致冗余计算,尤其是在涉及大型数据集时。

在 HNSW 中,冗余计算主要发生在算法继续评估新节点或候选节点时,这些节点或候选节点在查找查询的实际邻居方面几乎没有任何改进。发生这种情况的原因是,在标准 HNSW 遍历中,算法逐层进行,探索和扩展候选节点,直到所有可能的路径都用尽。

具体来说,当数据集包含高度相似或重复的向量、具有密集簇内连接的簇或具有很少内在结构的高维空间中的向量时,可能会出现这种冗余。这种冗余会导致访问不必要的边,增加内存使用量,并可能降低搜索性能而不会提高准确性。在相似度得分快速衰减的高维空间中,一些边(edges)通常无法在图中提供有意义的捷径,从而导致导航路径效率低下。

因此,如果在遍历图时可以执行大量不必要的计算,则可以尝试改进 HNSW 算法以缓解此问题。

提前终止 FTW

导航解决方案空间是优化和搜索算法中的一个基本概念,其目标是在一组可能的解决方案中找到最佳解决方案。解决方案空间代表给定问题的所有潜在解决方案,导航它涉及系统地探索这些可能性。这个过程可以可视化为通过一个图移动,其中每个节点代表一个不同的解决方案,目标是确定最符合问题标准的节点。了解如何有效地导航解决方案空间对于解决具有大量解决方案的复杂问题至关重要。提前终止是一种通用的优化策略,可以应用于任何此类算法,以在特定情况下做出何时停止搜索解决方案的明智决定。

如果任何解决方案被认为 “足够好” 以满足期望的标准,则可以停止搜索,并且该解决方案可以被视为良好候选或最佳解决方案。这意味着一些潜在的更好的解决方案可能仍未被探索,因此很难在最终解决方案的效率和质量之间找到完美的折衷方案。

HNSW 中的提前终止

在 HNSW 中,提前终止可用于在完全评估所有潜在候选节点(向量)之前停止搜索过程。评估候选节点意味着计算查询向量与正在处理的图中节点对应的向量之间的实际相似度;因此,在遍历每一层时跳过一堆这样的操作,可以大大降低查询的计算成本。

另一方面,跳过原本会产生真正最近邻居的候选节点肯定会影响搜索结果的质量,可能会遗漏一些接近查询向量的候选向量。

因此,效率收益和准确度损失之间的权衡需要谨慎处理。提前终止在以下情况下很有用:

  • 次线性效率(Sublinear Efficiency):你希望优化性能以换取略低的召回率。
  • 高吞吐量系统(High-Throughput Systems):更快的响应时间比最高的准确度更有价值。
  • 资源限制(Resource Constraints):计算或内存限制使得无法完全遍历 HNSW 图。

在 HNSW 的上下文中,有多种选项可用于实施提前终止策略。

  1. 固定候选池大小:最简单的提前终止策略之一是限制候选池的大小(例如,搜索期间评估的节点数)。在 HNSW 中,搜索过程是迭代的,随着搜索的进行,会扩展到更多节点。通过设置考虑的候选数限制,我们可以提前终止搜索并仅根据整个图的子集返回结果。当然,这可以以分层方式实现,也可以考虑整个图中的所有节点。
  2. 基于距离阈值的终止:另一种可能有效的提前终止策略是根据查询向量与对应于 HNSW 节点的向量之间的距离计算做出明智的决策。可以根据查询向量与当前最近向量之间的距离设置阈值。如果发现距离低于指定阈值的向量,则可以提前停止搜索,假设进一步探索不太可能产生更好的结果。这与对节点以智能顺序访问的事实的限制相辅相成,以避免遗漏可能相关的邻居。
  3. 基于质量估计的动态提前终止:一种更复杂的方法是根据每次搜索查询期间发现的结果的 “质量” 动态调整终止标准。如果搜索过程快速收敛到高质量邻居(例如,距离非常近的邻居),算法可以提前终止,即使没有达到预定义的阈值。

前两种策略属于 “固定配置” 提前终止策略类别,即搜索根据固定约束条件终止,而不考虑特定查询的复杂性。实际上,并非所有查询的难度都是相同的。例如,当向量分布不均衡时,一些查询需要访问更多候选项。一些查询向量可能落入向量空间中的密集区域,因此它们拥有更多的候选最近邻;而另一些查询可能落入“稀疏区域”,这使得找到其真正的最近邻更加困难。

由于这种情况,能够适应向量空间密度(从而适应 HNSW 图的连通性)的提前终止策略似乎更适合实际场景。因此,确定停止搜索每个查询的最佳点更有可能在不影响准确性的情况下大幅减少延迟。这种类型的提前终止策略被称为自适应策略,因为它们会适应每个查询实例来决定何时终止搜索过程。

例如,自适应提前终止策略可以利用机器学习模型来预测给定查询需要多少搜索工作才能达到所需的准确性。这样的模型会根据单个查询的特征和中间搜索结果动态调整要探索的图的范围。

说到中间搜索结果,它们通常是进一步搜索的有力预测因素。如果初始结果已经接近查询,则可能很快就会找到最近的邻居,从而允许提前终止。相反,较差的初始结果表明需要进行更广泛的探索(参见本文)。

Lucene 可以通过 KnnCollector 接口实现 HNSW 的提前终止,该接口公开了 earlyTerminated() 方法,但它还为 HNSW 提供了几个固定配置的提前终止策略:

  1. TimeLimitingKnnCollector 可以在达到特定时间阈值时停止 HNSW 图遍历。
  2. AbstractKnnCollector 是一个基本的 KnnCollector 实现,一旦访问了固定数量的图节点,它就会停止图遍历。

作为另一个示例,为了实现基于距离阈值的终止,我们可以依赖 Lucene 在 HNSW 遍历期间记录的最小竞争相似性(用于确保只探索竞争节点),并在其低于给定阈值时提前退出。

public class MCSEarlyExitCollector implements KnnCollector {

  private final KnnCollector delegate;
  private final double mcsThreshold;

  public MCSEarlyExitCollector(KnnCollector delegate, double mcsThreshold) {
    this.delegate = delegate;
    this.mcsThreshold = mcsThreshold;
  }

  @Override
  public boolean earlyTerminated() {
    return delegate.earlyTerminated() || minCompetitiveSimilarity() < mcsThreshold;
  }

  ...
}

结论

如果正确实施,近似 KNN 的提前终止策略可以显著提高速度,同时保持良好的准确性。固定策略更容易实施,但它们可能需要更多调整,并且在不同的查询中效果不佳。另一方面,动态/自适应策略更难实施,但具有能够更好地适应不同搜索查询的优势。

Elasticsearch 包含新功能,可帮助你为你的用例构建最佳搜索解决方案。深入了解我们的示例笔记本以了解更多信息,开始免费云试用,或立即在你的本地机器上试用 Elastic。

原文:Early termination in HNSW for faster approximate KNN search - Elasticsearch Labs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950455.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

两种方式实现Kepware与PLC之间的心跳检测

两种方式实现Kepware与PLC之间的心跳检测 实现Kepware与PLC之间的心跳检测1.OPCUA 外挂程序2.Kepware Advanced Tag 实现Kepware与PLC之间的心跳检测 1.OPCUA 外挂程序 这是通过上位程序来触发心跳的一种机制&#xff0c;在C#中&#xff0c;可以利用OPC UAOPCAutodll的方式…

python-leetcode-文本左右对齐

68. 文本左右对齐 - 力扣&#xff08;LeetCode&#xff09; class Solution:def fullJustify(self, words: List[str], maxWidth: int) -> List[str]:result []current_line []current_length 0for word in words:# 如果当前行加上这个单词后超过 maxWidth&#xff0c;则…

全新免押租赁系统打造便捷安全的租赁体验

内容概要 全新免押租赁系统的推出&#xff0c;标志着租赁行业的一次重大变革。这个系统的最大特点就是“免押金”&#xff0c;大大减轻了用户在租赁过程中的经济负担。从此&#xff0c;不再需要为一部手机或其他商品支付高昂的押金&#xff0c;用户只需通过简单的信用评估&…

WordPress静态缓存插件WP Super Cache与 WP Fastest Cache

引言 WordPress是一款开源的内容管理系统&#xff08;CMS&#xff09;&#xff0c;最初作为博客平台开发&#xff0c;现已发展成为一个功能强大的建站工具&#xff0c;支持创建各种类型的网站&#xff0c;包括企业网站、在线商店、个人博客等。它具有用户友好的界面、丰富的插…

1.CSS的复合选择器

1.1 什么是复合选择器 在CSS中&#xff0c;可以根据选择器的类型把选择器分为基础选择器和复合选择器&#xff0c;复合选择器是建立在基础选择器之上&#xff0c;对基础选择器进行组合形成的。 复合选择器可以更精准、更高效的选择目标元素&#xff08;标签&#xff09; 复…

初学stm32 --- ADC模拟/数字转换器工作原理

目录 常见的ADC类型 并联比较型工作示意图 逐次逼近型工作示意图 ADC的特性参数 STM32各系列ADC的主要特性 ADC框图简介 参考电压/模拟部分电压 输入通道&#xff08; F1为例&#xff09; 转换序列&#xff08;F1为例&#xff09; 规则组和注入组执行优先级对比 规则…

【C++】深入理解迭代器(Iterator)

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;什么是迭代器&#xff1f;迭代器与指针的比较 &#x1f4af;std::string 中的迭代器示例代码与图示分析运行结果&#xff1a;图示说明&#xff1a; 小提示 &#x1f4af;正…

H266/VVC 帧内预测中 MDIS 技术

参考像素平滑滤波 MDIS VVC 的帧内预测参考像素获取过程和 HEVC 相同&#xff0c;但参考像素滤波过程有所改进。在H.266中 MDIS&#xff08;Mode Dependent Intra Smoothing&#xff09;即模式依赖帧内平滑滤波&#xff0c;是对帧内预测的亮度分量参考像素进行滤波决策的一个技…

Chrome访问https页面显示ERR_CERT_INVALID,且无法跳过继续访问

在访问网页的时候&#xff0c;因为浏览器自身的安全设置问题&#xff0c; 对于https的网页访问会出现安全隐私的提示&#xff0c; 甚至无法访问对应的网站&#xff0c;尤其是chrome浏览器&#xff0c; 因此本文主要讲解如何设置chrome浏览器的设置&#xff0c;来解决该问题&…

深入解析 Transformer:从原理到可视化再到PyTorch实现

文章目录 深入解析 Transformer1 理解 Transformer1.1 理解自注意力机制 (Self-Attention)1.2 理解位置编码 (Positional Encoding)1.2.1 整数编码1.2.2 正弦编码 1.3 理解编码器和解码器模块1.3.1 编码器 1.4 最终线性层和 Softmax 层 2 编写 Transformer 的代码2.1 摘要和引言…

系统架构设计师考点—软件工程基础知识

一、备考指南 软件工程基础知识主要考查的是软件工程基础、软件开发方法、系统分析、设计、测试及运行和维护等相关知识&#xff0c;同时也是重点考点&#xff0c;在系统架构设计师的考试中选择题12~15分&#xff0c;案例分析和论文中也会考到相关内容&#xff0c;属于重点章节…

电影动画shader解析与实现

着色器代码解析 大家好&#xff01;我是 [数擎AI]&#xff0c;一位热爱探索新技术的前端开发者&#xff0c;在这里分享前端和Web3D、AI技术的干货与实战经验。如果你对技术有热情&#xff0c;欢迎关注我的文章&#xff0c;我们一起成长、进步&#xff01; 开发领域&#xff1a;…

使用ML.NET进行对象检测

1、前言 ML.NET 是面向 .NET 开发人员的开源跨平台机器学习框架&#xff0c;支持将自定义机器学习模型集成到 .NET 应用程序中。 它包含一个 API&#xff0c;其中包含不同的 NuGet 包、名为 模型生成器的 Visual Studio 扩展&#xff0c;以及作为 .NET 工具安装的 命令行接口。…

年会抽奖Html

在这里插入图片描述 <!-- <video id"backgroundMusic" src"file:///D:/background.mp3" loop autoplay></video> --> <divstyle"width: 290px; height: 580px; margin-left: 20px; margin-top: 20px; background: url(D:/nianhu…

vue -关于浏览器localstorge数据定期清除的实现

1.实现背景 用户登录时的信息存在了localstorge中&#xff0c;但它会一直存在。一般来说&#xff0c;我们希望这个数据能够定期被清除掉&#xff0c;以下一个定时清除的实现。 2.实现原理 在用户登录时&#xff0c;将用户信息存入localstorge的同时&#xff0c;将当前时间作…

LabVIEW水轮发电机组振动摆度故障诊断

本文介绍了基于LabVIEW的水轮发电机组振动摆度故障诊断系统的设计与实施过程。系统在通过高效的故障诊断功能&#xff0c;实现水轮发电机组的振动、温度等关键指标的实时监控与智能分析&#xff0c;从而提高电力设备的可靠性和安全性。 ​ 项目背景 随着电力行业对设备稳定性…

Collaborate with AI -- Write a modern C++ singleton factory

translate my blog <<与AI合作 -- 写一个modern c单例工厂>> to English. NOTE: It was written at 2024.01, maybe the AI is not smart as now. Preface In this article, readers can learn about a hybrid of the modern C singleton pattern and factory pat…

【轻松学C:编程小白的大冒险】--- C语言简介 02

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【轻松学C&#xff1a;编程小白的大冒险】…

下载b站高清视频

需要使用的edge上的一个扩展插件&#xff0c;所以选择使用edge浏览器。 1、在edge浏览器上下载 强力视频下载合并 扩展插件 2、在edge上打开b站&#xff0c;登录自己账号&#xff08;登录后才能下载到高清&#xff01;&#xff01;&#xff09;。打开一个视频&#xff0c;选择自…

oxml中创建CT_Document类

概述 本文基于python-docx源码&#xff0c;详细记录CT_Document类创建的过程&#xff0c;以此来加深对Python中元类、以及CT_Document元素类的认识。 元类简介 元类&#xff08;MetaClass&#xff09;是Python中的高级特性。元类是什么呢&#xff1f;Python是面向对象编程…