近似近邻算法-Annoy解析

转自:近似最近邻搜索算法 ANNOY(APPROXIMATE NEAREST NEIGHBORS OH YEAH)
在搜索的业务场景下,基于一个现有的数据候选集(dataset),需要对新来的一个或者多个数据进行查询(query),返回在数据候选集中与该查询最相似的 Top K 数据。

最朴素的想法就是,每次来了一个新的查询数据(query),都遍历一遍数据候选集(dataset)里面的所有数据,计算出 query 与 dataset 中所有元素的相似度或者距离,然后精准地返回 Top K 相似的数据即可。

但是当数据候选集特别大的时候,遍历一遍数据候选集里面的所有元素就会耗费过多的时间,其时间复杂度是 O(n)
因此,计算机科学家们开发了各种各样的近似最近邻搜索方法(approximate nearest neighbors)来加快其搜索速度,在精确率和召回率上面就会做出一定的牺牲,但是其搜索速度相对暴力搜索有很大地提高。
近似近邻算法-Annoy解析_第1张图片
在近似最近邻搜索(ANN)领域,有很多开源的算法可以使用,包括但不限于:

  • Annoy(Approximate Nearest Neighbors Oh Yeah);
  • ScaNN(Scalable Nearest Neighbors);
  • Faiss(Billion-scale similarity search with GPUs);
  • Hnswlib(fast approximate nearest neighbor search);
    本文将会重点介绍 Annoy 算法及其使用案例;

Annoy 的算法思想
近似近邻算法-Annoy解析_第2张图片
用 n 表示现有的文档个数,如果采用暴力搜索的方式,那么每次查询的耗时是 O(n)
采用合适的数据结构可以有效地减少查询的耗时,在 annoy 算法中,作者采用了二叉树这个数据结构来提升查询的效率,目标是把查询的耗时减少至 O(ln(n))
近似近邻算法-Annoy解析_第3张图片刚开始的时候,在数据集中随机选择两个点,然后用它们的中垂线来切分整个数据集,于是数据集就被分成了蓝绿两个部分。然后再随机两个平面中各选出一个顶点,再用中垂线进行切分,于是,整个平面就被切成了四份。
近似近邻算法-Annoy解析_第4张图片
用一颗二叉树来表示这个被切分的平面就是:
近似近邻算法-Annoy解析_第5张图片

后续继续采用同样的方式进行切分,直到每一个平面区域最多拥有 K 个点为止。当 K = 10 时,其相应的切分平面和二叉树如下图所示。
近似近邻算法-Annoy解析_第6张图片
近似近邻算法-Annoy解析_第7张图片
K = 10 的时候,每个子平面最多 10 个点
近似近邻算法-Annoy解析_第8张图片
下面,新来的一个点(用红色的叉表示),通过对二叉树的查找,我们可以找到所在的子平面,然后里面最多有 K = 10 个点。从二叉树的叶子节点来看,该区域只有 7 个点。
近似近邻算法-Annoy解析_第9张图片
近似近邻算法-Annoy解析_第10张图片

在 ANN 领域,最常见的两个问题是:

  1. 如果我们想要 Top K 的点,但是该区域的点集数量不足 K,该怎么办?
  2. 如果真实的 Top K 中部分点不在这个区域,该怎么办?

作者用了两个技巧来解决这个问题:

  1. 使用优先队列(priority queue):将多棵树放入优先队列,逐一处理;并且通过阈值设定的方式,如果查询的点与二叉树中某个节点比较相似,那么就同时走两个分支,而不是只走一个分支;
  2. 使用森林(forest of trees):构建多棵树,采用多个树同时搜索的方式,得到候选集 Top M(M > K),然后对这 M 个候选集计算其相似度或者距离,最终进行排序就可以得到近似 Top K 的结果。
    同时走两个分支的的示意图:
    近似近邻算法-Annoy解析_第11张图片
    近似近邻算法-Annoy解析_第12张图片
    随机生成多棵树,构建森林的示意图:
    近似近邻算法-Annoy解析_第13张图片
    Top K 的查询方法:
    近似近邻算法-Annoy解析_第14张图片
    近似近邻算法-Annoy解析_第15张图片
    近似近邻算法-Annoy解析_第16张图片

Annoy 算法原理:

构建索引:建立多颗二叉树,每颗二叉树都是随机切分的;

查询方法:

  1. 将每一颗树的根节点插入优先队列
  2. 搜索优先队列中的每一颗二叉树,每一颗二叉树都可以得到最多 Top K 的候选集
  3. 删除重复的候选集
  4. 计算候选集与查询点的相似度或者距离
  5. 返回 Top K 的集合。

你可能感兴趣的:(深度学习,近邻算法,算法)