facebook Faiss的基本使用示例

轉載自: https://blog.csdn.net/sparkexpert/article/details/68922307

對faiss進行基本的案例學習,具體步驟如下:

step1:構造實驗數據

step2:爲向量集構建IndexFlatL2索引,它是最簡單的索引類型,只執行強力L2距離搜索

step3:進行簡單的k-近鄰搜索

結果如下:

NOTE:

1.程序輸出爲查詢向量的最近鄰的4個向量的索引

2.在機器上執行上述搜索需要約3.3秒。

step4:加快搜索速度

方法:

通過使用IndexIVFFlat索引,將數據集分割成多個,我們在d維空間中定義Voronoi單元,每個數據庫向量落在其中一個單元格中。在搜索時,只有查詢x所在的單元格中包含的數據庫向量y和幾個相鄰的數據庫向量y與查詢向量進行比較。

搜索方法有兩個參數:nlist(單元格數),nprobe(執行搜索訪問的單元格數(nlist以外))

對於nprobe = 1,結果如下:

 

結果和上面的強力搜索類似,但是不同(見上文)。這是因爲一些結果不在完全相同的Voronoi細胞。因此,訪問更多的單元格可能是有用的。

設置nprobe = 10,結果如下:

這是正確的結果。

但注意:在這種情況下獲得完美的結果只是數據分佈的一個假象,因爲它在x軸上有一個強大的組件,這使得它更容易處理。nprobe參數始終是調整速度和結果精度之間權衡的一種方式。設置nprobe = nlist給出與強力搜索相同的結果(但較慢)。

  step5:進一步縮小存儲空間

我們看到的索引IndexFlatL2和IndexIVFFlat都存儲完整的向量。 爲了擴展到非常大的數據集,Faiss提供了基於產品量化器的有損壓縮來壓縮存儲的向量的變體。壓縮的方法基於乘積量化。


結果如下:

我們可以觀察到最近的鄰居被正確地找到(它是矢量ID本身),但是向量自身的估計距離不是0,儘管它遠遠低於與其他鄰居的距離。這是由於有損壓縮。

另外搜索真實查詢時,雖然結果大多是錯誤的,但是它們在正確的空間區域,而對於真實數據,情況更好,因爲:

1.統一數據很難進行索引,因爲沒有規律性可以被利用來聚集或降低維度

2. 對於自然數據,語義最近鄰居往往比不相關的結果更接近。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章