HNSW: Hierarchical Navigable Small World graphs
近邻图技术, 目前绝大部分的近邻图检索技术采用贪婪检索形式。给定一个近邻图,从其中某一点(进入点的选择可以是随机也可以是根据某种逻辑)进入,然后迭代地计算当前点与query的距离,直到满足终止条件。使用近邻技术可以优化此过程
NSW 利用可导航小世界图对K-NN图技术优化,NSW持续随机地插入元素,并为图中的每一节点维护m个最近邻居,每个节点插入时,图上的点都会考虑其m个近邻是否要更新,这样持续的更新,每个节点周围基本上是其近邻节点(提示一下,边是有向的,即两者的近邻关系是不对称的,举例来说,A是B的最近邻点,意味当前状态下,A点是B点距离最近的前m个点之一,但反过来,B点却不一定是距离A点最近的m个点), 不过有一些节点因为插入图中比较早,还保留着一些与其相距不是“那么近”的节点相连的边。这些边就成为加速检索的高速边了,因为这样的边可以让query快速度的从当前局部跳出进入另一个局部区域。
不过NSW一些缺点,就是可以看到随着节点的插入,其高速边会持续变少,检索效率会下降。另外就是,其检索复杂度是与其检索步数及节点出度的乘积成正比的。这些问题单从NSW自身是没有办法解决的。而HNSW则考虑,将高速边从NSW的原图上分离出来,根据边的跨度组成不同的层图。这样通过增长少量的空间占用,极大的提高了检索速度。因为高速边的存在,每次检索只需要评估几而已,此评估与图的大小与节点的出度基本无关。当query请求检索时,先从最上层的高速边开始(即跨度最大的边),评估此层内的节点,当找到一个局部最优节点时,经此局部最优节点进入下一层,如此进行逐层向下,直到最下面一层(包含所有节点的完整图)。
HNSW 可以看作是概率跳表的扩展, 只不过其基础结构不是链表而是近邻图。
在插入时,每个点会根据指数概率分布决定其是否进入到除第0层之外的其它层(当其被决定进入到第l层时,l-1,..,到第0层都会有其存在)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2018-12-06 论文选读二:Multi-Passage Machine Reading Comprehension with Cross-Passage Answer Verification