faiss原理----索引


faiss可以类比为一个可以设置索引的数据库

faiss里面存储的是海量的向量

只是在faiss中么有数据库存储介质这一层的概念,全部都是index,

faiss搜索的基本单位是单个向量,faiss默认输入的是一个向量x,返回和x最相似的k个向量。

 

 

 

 

**************************  原理   https://zhuanlan.zhihu.com/p/90768014    ****************************

faiss三个最常见的索引是   indexflatl2   indexivfflat   indexivfpq

1  indexflatl2 indexflatip为最基础的精准查询

2  indexivfflat称为倒排文件索引,是使用kmeans建立聚类中心,通过查询最近的聚类中心,比较聚类中的所有向量得到相似向量,是一种加速搜索方法的索引

3  indexivfpq 是一种减小内存的索引方式,indexflatl2和indexivfflat 都会全量存储所有的向量在内存中,面对大数据量,faiss提供一种基于  pq的压缩算法编码向量到指定字节数来减小内存占用,但这种情况下,存储的向量是压缩过的,所以查询的向量也是近似的。

4  index_factory是faiss实现的一个索引工厂模式,可以通过字符串来灵活的创建索引,pca算法可以将向量降到指定的维度

ivf原理

训练阶段:对训练样本进行聚类,选取1024个类,那么1000个训练样本平均每个类就只有一个向量,10万个样本,每个类有

查询阶段:对查询样本计算1024个中心的距离,这里计算了1024次,然后找到它所属的聚类中心,这里如果有1000个查询样本,就计算了1000*1024次,那么对于库中的样本,属于其他聚类中心的,我们就不比较了。

 

PQ

PQ的原理是拆分向量,各自聚类,假如我们输入的是一个128维的向量,我们将他拆成4组,每组就是32维的向量

训练阶段,每组的32维向量进行聚类,得到256个中心点,那么4组,一共就有1024个中心,当然这个256*4个中心,实际上将空间划分为256*4个区域,也就是2的32次方个区域,得到每个区域保存本区域的向量。

 

 

 

*************************原文   https://blog.csdn.net/zlb872551601/article/details/103704874  *******************

选择合适索引的方法,大概需要注意三个方面的知识

1   是否需要精确的结果

flat可以做到精确查询,indexflatl2 ,他不压缩向量,不支持添加id,只支持顺序添加

2   是否关心内存

由于faiss所有的索引都是存储在ram中

如果不需要关心内存为HNSWx     ----如果有些担心为 ...FLAT----------相当关心内存为PCARx   SQ8 -----非常关系内存为  OPQx_y  PQx

3  数据集有多大

如果向量数量低于1百万:”…,IVFx,…”

如果向量数量位于1百万-1千万之间:”…,IMI2x10,…”

如果向量数量位于1千万-1亿之间:”…,IMI2x12,…”

如果向量数量位于1亿-10亿之间:”…,IMI2x14,…”

 

 

faiss快速的原因是  不管库中的向量有多少,计算次数都是固定的,都是与聚类中心做计算,只不过库中的向量多,查表的次数就多了。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM