高维空间最近邻逼近搜索算法评测

文章转自:https://www.jqr.com/article/000245

最近邻方法是机器学习中一个非常流行的方法,它的原理很容易理解:邻近的数据点是相似的数据点,更可能属于同一分类。然而,在高维空间中快速地应用最近邻方法,却是非常有挑战性的工作。

全球最大的流媒体音乐服务商Spotify需要向上面的海量用户推荐音乐,其中就用到了最近邻方法。也就是在高维空间、大型数据集上应用最近邻方法。

由于维度高、数据规模大,直接应用最近邻方法并不可行,因此,最佳实践是使用逼近方法搜索最近邻。这方面有不少开源库,比如Spotify开源的Annoy库。Annoy库的作者Erik Bernhardsson在开发Annoy的过程中发现,尽管有成百上千的使用逼近方法搜索最近邻的论文,却很少能找到实践方面的比较。因此,Erik开发了ANN-benchmarks,用来评测逼近最近邻(approximate nearest neighbor,ANN)算法。

评估的实现

  • Annoy Spotify自家的C++库(提供Python绑定)。Annoy最突出的特性是支持使用静态索引文件,这意味着不同进程可以共享索引

  • FLANN 加拿大英属哥伦比亚大学出品的C++库,提供C、MATLAB、Python、Ruby绑定。

  • scikit-learn 知名的Python机器学习库scikit-learn提供了LSHForestKDTreeBallTree实现。

  • PANNS 纯Python实现。已“退休”,作者建议使用MRPT。

  • NearPy 纯Python实现。基于局部敏感哈希(Locality-sensitive hashing,简称LSH,一种降维方法)。

  • KGraph C++库,提供Python绑定。基于图(graph)算法。

  • NMSLIB (Non-Metric Space Library) C++库,提供Python绑定,并且支持通过Java或其他任何支持Apache Thrift协议的语言查询。提供了SWGraph、HNSW、BallTree、MPLSH实现。

  • hnswlib(NMSLIB项目的一部分) 相比当前NMSLIB版本,hnswlib内存占用更少。

  • RPForest 纯Python实现。主要特性是不需要在模型中储存所有索引的向量。

  • FAISS Facebook出品的C++库,提供可选的GPU支持(基于CUDA)和Python绑定。包含支持搜寻任意大小向量的算法(甚至包括可能无法在RAM中容纳的向量)。

  • DolphinnPy 纯Python实现。基于超平面局部敏感哈希算法。

  • Datasketch 纯Python实现。基于MinHash局部敏感哈希算法。

  • PyNNDescent 纯Python实现。基于k-近邻图构造(k-neighbor-graph construction)。

  • MRPT C++库,提供Python绑定。基于稀疏随机投影(sparse random projection)和投票(voting)。

  • NGT: C++库,提供了Python、Go绑定。提供了PANNG实现。

数据集

ANN-benchmarks提供了一些预先处理好的数据集。

数据集维度训练集大小测试集大小近邻距离下载
Fashion-MNIST78460,00010,000100欧几里得HDF5 (217MB)
GIST9601,000,0001,000100欧几里得HDF5 (3.6GB)
GloVe251,183,51410,000100角相似性HDF5 (121MB)
GloVe501,183,51410,000100角相似性HDF5 (235MB)
GloVe1001,183,51410,000100角相似性HDF5 (463MB)
GloVe2001,183,51410,000100角相似性HDF5 (918MB)
MNIST78460,00010,000100欧几里得HDF5 (217MB)
NYTimes256290,00010,000100角相似性HDF5 (301MB)
SIFT1281,000,00010,000100欧几里得HDF5 (501MB)

结果

Erik提供了在AWS EC2机器(c5.4xlarge)上运行测试的结果——跑了好几天才跑完,费用约100美元。

glove-100-angular

 

glove-100-angular

sift-128-euclidean

 

sift-128-euclidean

fashion-mnist-784-euclidean

 

fashion-mnist-784-euclidean

gist-960-euclidean

 

gist-960-euclidean

nytimes-256-angular

 

nytimes-256-angular

glove-25-angular

 

glove-25-angular

从以上评测可以看出(越靠上、靠右,成绩越好),几乎在所有数据集上,排名前五的实现为:

  1. HNSW(NMSLIB的低内存占用版本),比Annoy快10倍。

  2. KGraph位于第二,和HNSW的差距不算很大。和HNSW一样,KGraph也是基于图(graph)的算法。

  3. SW-graph,源自NWSLIB的另一个基于图的算法。

  4. FAISS-IVF,源自Facebook的FAISS。

  5. Annoy

在“评估的实现”一节中,我们看到,有不少使用局部敏感哈希(LSH)的库。这些库的表现都不是很好。在之前进行的一次评测中,FALCONN表现非常好(唯一表现优良的使用局部敏感哈希的库)。但是这次评测中,FALCONN看上去退步得很厉害——原因未明。

从这次评测来看,基于图的算法是当前最先进的算法(名列三甲的算法全都基于图),特别是HNSW表现突出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值