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层都会有其存在)。