1.Faiss方法介紹:
faiss索(suo)(suo)(suo)(suo)引(yin)類(lei)(lei)(lei)型(xing)主要(yao)(yao)(yao)可(ke)以分(fen)為(wei)暴力檢(jian)索(suo)(suo)(suo)(suo)、乘積(ji)量化、局(ju)部敏感哈希、基(ji)于圖(tu)(tu)的(de)(de)(de)方法(fa)。向(xiang)量檢(jian)索(suo)(suo)(suo)(suo)問(wen)題通(tong)常需要(yao)(yao)(yao)考慮召回(hui)率(lv)、耗(hao)(hao)時(shi)以及(ji)內(nei)存占用(yong)三個問(wen)題,而(er)實際的(de)(de)(de)工業(ye)場景中,一般存在(zai)候(hou)選物(wu)料(liao)量級較(jiao)大(da),耗(hao)(hao)時(shi)要(yao)(yao)(yao)求高的(de)(de)(de)情(qing)況。對比(bi)faiss的(de)(de)(de)索(suo)(suo)(suo)(suo)引(yin)類(lei)(lei)(lei)型(xing),暴力檢(jian)索(suo)(suo)(suo)(suo)類(lei)(lei)(lei)索(suo)(suo)(suo)(suo)引(yin)雖然(ran)召回(hui)率(lv)百分(fen)百,但(dan)耗(hao)(hao)時(shi)無(wu)法(fa)接受。而(er)常用(yong)的(de)(de)(de)索(suo)(suo)(suo)(suo)引(yin)類(lei)(lei)(lei)型(xing)主要(yao)(yao)(yao)是(shi)(shi)乘積(ji)量化和(he)圖(tu)(tu)兩(liang)類(lei)(lei)(lei)標簽。其中,基(ji)于圖(tu)(tu)的(de)(de)(de)方法(fa)召回(hui)率(lv)可(ke)以逼近暴力檢(jian)索(suo)(suo)(suo)(suo)且(qie)耗(hao)(hao)時(shi)也略(lve)優于乘積(ji)量化類(lei)(lei)(lei)索(suo)(suo)(suo)(suo)引(yin),但(dan)是(shi)(shi)在(zai)構建索(suo)(suo)(suo)(suo)引(yin)過程中需要(yao)(yao)(yao)占用(yong)的(de)(de)(de)內(nei)存很大(da),如果能保證足(zu)夠的(de)(de)(de)資(zi)源,圖(tu)(tu)方法(fa)可(ke)以在(zai)耗(hao)(hao)時(shi)和(he)召回(hui)率(lv)上做到最優。乘積(ji)量化召回(hui)率(lv)低于圖(tu)(tu)方法(fa),但(dan)是(shi)(shi)能保證較(jiao)好的(de)(de)(de)耗(hao)(hao)時(shi)和(he)空間占用(yong),是(shi)(shi)在(zai)候(hou)選物(wu)料(liao)集較(jiao)大(da)時(shi)的(de)(de)(de)最優選擇。
2.相關方法和原理:
faiss三個最常見(jian)的索引是 indexflatl2 indexivfflat indexivfpq
1 indexflatl2 indexflatip為(wei)最(zui)基礎的精準查詢
2 indexivfflat稱為倒(dao)排文件索引(yin),是使用kmeans建(jian)立聚(ju)類中(zhong)(zhong)心,通過(guo)查詢最近的聚(ju)類中(zhong)(zhong)心,比較聚(ju)類中(zhong)(zhong)的所有向量得到(dao)相似(si)向量,是一種加速搜索方(fang)法(fa)的索引(yin)
3 indexivfpq 是(shi)(shi)一種(zhong)減小內存(cun)的(de)(de)索引(yin)方式,indexflatl2和indexivfflat 都會全(quan)量(liang)(liang)(liang)存(cun)儲(chu)所有的(de)(de)向量(liang)(liang)(liang)在內存(cun)中,面對大(da)數據量(liang)(liang)(liang),faiss提供一種(zhong)基于 pq的(de)(de)壓(ya)(ya)縮算(suan)法編(bian)碼向量(liang)(liang)(liang)到指定(ding)字節數來減小內存(cun)占用,但這種(zhong)情(qing)況下,存(cun)儲(chu)的(de)(de)向量(liang)(liang)(liang)是(shi)(shi)壓(ya)(ya)縮過的(de)(de),所以查(cha)詢的(de)(de)向量(liang)(liang)(liang)也(ye)是(shi)(shi)近似的(de)(de)。
4 index_factory是faiss實現的一個索引工廠模式,可以通(tong)過字符串來靈活(huo)的創(chuang)建索引,pca算法可以將向(xiang)量降到指定的維度。
訓(xun)練(lian)階段:對訓(xun)練(lian)樣(yang)本進行聚類,選取1024個(ge)(ge)類,那么1000個(ge)(ge)訓(xun)練(lian)樣(yang)本平均每個(ge)(ge)類就(jiu)只有一個(ge)(ge)向量,10萬個(ge)(ge)樣(yang)本,每個(ge)(ge)類都需(xu)要;
查詢階段:對(dui)查詢樣(yang)本計算(suan)1024個中心的(de)距離,這里(li)計算(suan)了1024次(ci),然后找到它所(suo)屬的(de)聚類(lei)中心,這里(li)如果有1000個查詢樣(yang)本,就(jiu)計算(suan)了1000*1024次(ci),那么對(dui)于(yu)庫(ku)中的(de)樣(yang)本,屬于(yu)其他(ta)聚類(lei)中心的(de)。
3.Faiss的安裝(工程化)
強烈建議安裝faiss 1.7.3以上版本(ben)
|
pip install faiss-cpu==1.7.3 # pip install faiss-gpu==1.7.2 # gpu安裝 |
4. Faiss開發
首先(xian),Faiss檢索相似向(xiang)量TopK的工程基本都能分為三步:
- 得到向量庫;
- 用faiss 構建index,并將向量添加到index中;
- 用faiss index 檢索。
5. Faiss常用index優缺點及使用場景
Faiss之所以能加速,是因為它用的檢索方式并非精確檢索,而是模糊檢索。既然是模糊檢索,那么必定有所損失,我們用召回率來表示模糊檢索相對于精確檢索的損失。
在(zai)(zai)我們(men)實際的(de)工程中,候(hou)選(xuan)向量(liang)的(de)數量(liang)級、index所占內存的(de)大小、檢(jian)索(suo)所需時間(jian)(是(shi)(shi)(shi)離(li)線檢(jian)索(suo)還是(shi)(shi)(shi)在(zai)(zai)線檢(jian)索(suo))、index構建時間(jian)、檢(jian)索(suo)的(de)召回率等都是(shi)(shi)(shi)我們(men)選(xuan)擇index時常常需要考慮的(de)地(di)方(fang)