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