目录
大数据时代的到来,海量数据的迸发,使得向量检索应用日益广泛,诸如图文推荐,视频推荐,音乐推荐,文章去重,以图搜图等等。而这些应用的普遍特征是数据量大,维度高。因此精确的线性的暴力搜索无法满足速度,甚至存储要求。而近邻搜索(Approximately Nearest Neighbor Search)由此登上历史舞台,展现其光辉的一面。
近邻搜索,用一句话概括其原则:尽可能减小查询向量的搜索范围,从而提高查询速度。目前业界的近邻搜索算法主要分为四类,本文对每个类别选取典型的算法予以介绍。
- 基于树的搜索(Annoy, KD-Tree)
- 基于哈希的空间划分(LSH)
- 基于图的搜索(NSW,HNSW)
- 基于量化的编码(SQ,PQ)
1. 基于树的搜索
基于树的方法采用树的结构来表示对空间的划分,KD-Tree和Annoy是比较有代表性的两种算法。KD-Tree每一次分割选取方差最大的维度,在该维度上进行分割。
本文以Annoy为例对基于树的搜索进行详细阐述。
Annoy 是Spotify用于音乐推荐的向量检索算法库,在github上开源。
Annoy不断地用超平面分割向量空间,直到每个子空间的向量数量低于指定数量。而这个不断地分割过程就像二叉树的父节点到左右子节点的过程。而这个超平面,使用KMeans(k=2)对需要分类的向量进行聚类,得到两个质心,质心连线的法平面即为该超平面。
如此...直到:
整个过程类似如下的二叉树:
而对于向量的查询,则是从根节点开始遍历,当遍历到某个节点,其子节点小于指定查找数目时停止搜索。
这样的查找有几个问题。第一,走到某一个节点,其包含的向量数少于我们要查询的近邻数。第二,可能有的相邻较近的节点被分到了不同的子节点,从而影响搜索精度。
对于第一点ÿ