2018TPAMI-(HNSW索引算法)Efficient an

2021-07-19  本文已影响0人  Caucher

标题:使用分层导向性小世界图(HNSW)进行高效且稳定的最近邻搜索

编者的总结

  1. 本文的核心贡献就是把NSW做成多层的,各层的节点个数是服从几何分布的,在理论和实验上,都将KNN的复杂度从log^2(N)降低到了logN。不仅在欧式空间中,一般的空间也适用本文的算法。
  2. 从实验和之后的文章评估上来看,HNSW算法的效果和效率都非常棒,这一点是毋庸置疑的。

编者的思考

  1. 本文的一大问题就是构建速度和内存占用都不太好,而且只能基于内存;
  2. 第二大问题,就是参数很难调,各个参数之间存在着微妙的平衡,也有彼此的互相依赖,使用不当就会性能退化;
  3. 第三大问题,是proximity graph类型算法的通病,只能对结果做概率性上的保证,这在实际使用中比较玄学;
  4. 第四个问题是作者提出的,是不易分布式,不过这倒是有可能解决的。

1 INTRODUCTION

proximity graph的方法在受power-low法则制约,使得在低维或聚集数据时性能有退化。
本文的主要贡献如下:

  1. 显式选择entry-point;
  2. 根据尺度不同分隔链接;
  3. 启发式方法选择邻居。

3 MOTIVATION

(编者注:这一章节作者是讲整体研究思路,讲的比较抽象,难以理解;编者对相关工作目前了解还不足够深入,只根据有限的论文阅读量,试图解读作者的思想,其中不对之处,欢迎读者在评论区讨论、指正)

3.1 NSW中的缩小与放大

作者调研发现,提升NSW系列算法的根本在路由,就是NN搜索到达local minimum的路径。这个路径可以分为两部分,缩小和放大。

3.2 普通贪心算法的复杂性分析

接下来,作者对这种贪心算法的复杂性进行分析,认为这是多项式对数级别的复杂度log^2(n)

3.3 HNSW的思路

主要思路是将链接根据它们的长度不同放在不同的层级(各个层级有长度限制)上,每个层级一张近邻图(仍然是近似Delaunay图),搜多层图。
这样在搜每个层级的时候,每个节点的度数都有固定的常量上界,以此来实现对数复杂度。
在构建图的时候,节点的所在的最大层数是指数衰退的(几何分布),因此层数的期望是对数的。也因为这种随机性,所以输入的顺序,不显著影响图的构建。
在这样的结构上,首先从最上层开始搜,搜长边,但节点很少,然后逐层向下递进。下一层的enter point是上一层的local minimum。

3.4 插入节点邻居选择

邻居的选择其实就是插入哪些边。一般来说,我们找一轮近似KNN然后把指定数量最近的边当做邻居即可。但是为了避免聚簇现象导致的local minimum,会在邻居选择时,优先选择那些相比于和插入节点的距离,和插入节点的邻居距离更远的作为邻居,如图的e2,后面算法会详细描述。

image.png

4 ALGORITHM DESCRIPTION

4.1 单层搜索算法

这个算法和之前讲NSW索引算法时用到的算法基本一致,只不过不循环m次重复随机选enter point了,这里把enter point当做输入来看待。
算法的最终结果仍然是一个local minimum。
2013IS-(NSW索引算法)Approximate nearest neighbor algorithm based on navigable small world graphs

image.png

4.2 最佳邻居选择算法

这里是说,假设我们要新插入一个点x,在某一层,也找到了这一层x的KNN,但是这一层有其最大度数限制M,所以要从这一层的KNN中找到合适的几个点做邻居,建立链接。
作者提供了两种算法,第一种无比简单,直接把KNN中M个最近的点当做邻居。
另外一种算法是一个启发式的算法。启发式算法首先还是将KNN个邻居按照和x的距离进行递增排序,然后依次出队,假设当前出队的是节点A。最终的结果集合是R,初始化为空。

算法有2个参数:

image.png

4.3 KNN搜索算法

在搜索最底层的第0层之前,每层都只返回1NN作为下一层的enter point。搜索第0层时,搜efNN作为备选结果,再从这ef个结果中选取K个最近的作为结果。
(编者注:这里ef-NN中选取K个最近的和直接去search KNN有什么不一样呢?举个例子,假设K=1,我们只找1NN。那么在Search的时候,如果令ef=1,它只会每次去找最近的邻居,沿着一个方向找到一个local minimum就到头了;但是如果ef=d,它就可能沿着更多方向,去寻找到更多local minimum,这样结果质量会更好。)
文中作者也讲到,ef是可以来控制结果质量的。


image.png

4.4 节点插入算法

有了以上的准备条件,我们就可以来看看插入具体是怎么做的。本文的图索引是逐个节点去插入的,因此只介绍一个单节点插入算法。
设新节点为q,我们按照几何分布(指数衰退概率),随机获得q的最大层数l。

4.1 Influence of the Construction Parameters

m_LM_{max0}是能深刻影响图的导向性小世界特性的。

m_L的选取是一个trade-off:

M_{max0}的选取是一个trade-off:

启发式的邻居选择算法,在中低维数据,聚集性数据上有奇效,但是高维数据并不合适。


image.png

4.2 Complexity Analysis

4.2.1 Search Complexity

以下的分析基于是一个精确Delaunay图,虽然实际上构建的是一个近似Delaunay图。(后面作者做了个实验,简单推断了下,近似图的不准确性不太影响算法复杂度)

4.2.2 Construction Complexity

构建复杂度,相当于N个点依次做KNN搜索,所以复杂度为O(NlogN)

5 COMPARISON TO STATE-OF-THE-ART

5.1 Comparison with Baseline NSW

这张图可以明显看出,二次方的曲线被换做了一次线性的scalability。


image.png

5.2&5.3 Comparison in Euclid Spaces & General Spaces

从这两张图上可以看出,在召回率和查询速度上,HNSW确实有独特的优势。


image.png
image.png

5.4 Comparison with Product Quantization Based Algorithms

从这张图可以看到HNSW的构建速度和内存使用都存在短板。


image.png
上一篇 下一篇

猜你喜欢

热点阅读