1.Faiss方法介绍:
faiss索引类型主要可以分为暴力检索、乘积量化、局部敏感哈希、基于图的方法。向量检索问题通常需要考虑召回率、耗时以及内存占用三个问题,而实际的工业场景中,一般存在候选物料量级较大,耗时要求高的情况。对比faiss的索引类型,暴力检索类索引虽然召回率百分百,但耗时无法接受。而常用的索引类型主要是乘积量化和图两类标签。其中,基于图的方法召回率可以逼近暴力检索且耗时也略优于乘积量化类索引,但是在构建索引过程中需要占用的内存很大,如果能保证足够的资源,图方法可以在耗时和召回率上做到最优。乘积量化召回率低于图方法,但是能保证较好的耗时和空间占用,是在候选物料集较大时的最优选择。
2.相关方法和原理:
faiss三个最常见的索引是 indexflatl2 indexivfflat indexivfpq
1 indexflatl2 indexflatip为最基础的精准查询
2 indexivfflat称为倒排文件索引,是使用kmeans建立聚类中心,通过查询最近的聚类中心,比较聚类中的所有向量得到相似向量,是一种加速搜索方法的索引
3 indexivfpq 是一种减小内存的索引方式,indexflatl2和indexivfflat 都会全量存储所有的向量在内存中,面对大数据量,faiss提供一种基于 pq的压缩算法编码向量到指定字节数来减小内存占用,但这种情况下,存储的向量是压缩过的,所以查询的向量也是近似的。
4 index_factory是faiss实现的一个索引工厂模式,可以通过字符串来灵活的创建索引,pca算法可以将向量降到指定的维度。
训练阶段:对训练样本进行聚类,选取1024个类,那么1000个训练样本平均每个类就只有一个向量,10万个样本,每个类都需要;
查询阶段:对查询样本计算1024个中心的距离,这里计算了1024次,然后找到它所属的聚类中心,这里如果有1000个查询样本,就计算了1000*1024次,那么对于库中的样本,属于其他聚类中心的。
3.Faiss的安装(工程化)
强烈建议安装faiss 1.7.3以上版本
pip install faiss-cpu==1.7.3 # pip install faiss-gpu==1.7.2 # gpu安装 |
4. Faiss开发
首先,Faiss检索相似向量TopK的工程基本都能分为三步:
- 得到向量库;
- 用faiss 构建index,并将向量添加到index中;
- 用faiss index 检索。
5. Faiss常用index优缺点及使用场景
Faiss之所以能加速,是因为它用的检索方式并非精确检索,而是模糊检索。既然是模糊检索,那么必定有所损失,我们用召回率来表示模糊检索相对于精确检索的损失。
在我们实际的工程中,候选向量的数量级、index所占内存的大小、检索所需时间(是离线检索还是在线检索)、index构建时间、检索的召回率等都是我们选择index时常常需要考虑的地方