• 近似最近邻搜索 (四) HNSW: Hierarchical Navigable Small World graphs


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

  • 相关阅读:
    java一个字符串中出现次数最多的字符以及次数
    按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”,“12345678“,”90000000”
    Java 替换空格
    Java中equals()和“==”区别
    ramfs和tmpfs的区别
    C语言中的nan和inf使用
    Abp中SwaggerUI的多个接口文档配置说明
    Abp中SwaggerUI的接口说明文档配置
    Abp中SwaggerUI的接口文档添加上传文件参数类型
    Abp中自定义Exception的HttpStatusCode
  • 原文地址:https://www.cnblogs.com/vpegasus/p/hnsw.html
Copyright © 2020-2023  润新知