Faiss是一个用于稠密向量相似度检索与聚类的库。它包含了可以在任意大小(大到可能在RAM中都放不下)特征向量集合中进行检索的算法。它还包含了性能评估与调参的辅助代码。Faiss是用C++编写,并有完成的python接口支持(py2,与py3)。有些有用的算法是在GPU上实现。这个项目是由Facebook AI Research开发的。
What is similarty search?
有一系列长度为d的向量x_i,Faiss利用这些数据从RAM中构建一个数据结构。在这个结构构建以后,当给定一个新的维度为d的向量x,它可以高效的进行如下操作:
I = argmin_i||x-x_i||
这里||.||是指欧式距离(L2)。
按照Faiss的叫法,这种数据结构被称为index(索引),每个实例有一个add功能来增加x_i向量。注意这里的x_i是假设固定的。
在index上计算argmin的过程称为search操作。
这就是Faiss主要的用途。它还可以:
- 返回不仅仅最近邻的结果,还可以返回2nd,3rd,k-th的近邻结果。
- 同时搜索多个向量而不是一个(batch操作)。对于许多index类型,这种方法比一个个向量的检索要快得多。
- 速度与进度的权衡。如果结果错误率为10%,搜索时间可能10倍快或者利用的内存少十倍。
- 进行最大内积argmax_i<x,x_i>而不是最小欧式距离搜索。也支持有限的其他距离(L1,inf等)。
- 给出一定查询点范围的