以前在業務中應用了許多Faiss,也看了幾篇關於Faiss的論文,簡單記錄下Faiss的一些屬性和應用。Faiss是Facebook的AI團隊開源的一套用於作聚類或者類似性搜索的軟件庫,底層是用C++實現。Faiss由於超級優越的性能,被普遍應用於推薦相關的業務當中。接下來分Faiss在推薦業務應用和Faiss的基本原理兩部分進行介紹。git
1 Faiss在推薦業務中的應用
在個人認知裏,基本上50%以上的手機APP的推薦業務會應用到Faiss服務,可見應用之廣。那Faiss到底是在哪一個模塊使用呢,經過下方這個圖給你們介紹:github
你們都知道推薦業務包含排序和召回兩個模塊,Faiss比較多的應用在召回模塊。召回業務中有不少是向量生成類的算法,好比Graph Embedding、ALS Embedding、FM Embedding等。ALS就是經典的矩陣分解算法,它能夠將User和Item的行爲數據利用矩陣分解的方式生成User向量和Item向量,這些向量分別表明User和Item的屬性(工科研究生矩陣論課程學過矩陣分解,不懂的同窗要補課了)。算法
當咱們拿到了User和Item的向量,只要計算出哪些Item和User的向量距離較短(最簡單的解法是算歐式距離),就能夠得出User偏心的Item。可是當User和Item的數量巨大的時候,設想下某短視頻平臺,天天有上百萬User登陸,有存量的上千萬的Item短視頻,怎麼能快速的計算出向量距離,就成了一個亟待解決的技術難點,由於推薦業務的召回模塊須要在50ms之內拿到結果。這也就是Faiss的價值所在,Faiss幾乎能夠在10ms內完成百萬*百萬以上的向量距離計算,它是怎麼實現的呢?性能
2 Faiss原理
向量計算是一個最經典的時空優化問題,在查詢過程當中創建更多地索引當然能夠提高查詢速度,可是卻有佔據了存儲空間,咱們但願系統能夠即減小索引又能提高查詢性能。優化
爲了獲得時間和空間的最優,Faiss使用了PCA和PQ兩個手段進行向量壓縮和編碼,固然還有其它的一些優化手段,可是PCA和PQ是最爲核心的。編碼
PCA降維
PCA是一種降維手段,簡單理解就是將高維向量變爲低圍,這樣就能夠有效的節省存儲空間,PCA我以前介紹過,今天就很少說了。有興趣能夠看下個人博客:spa
個人博客-PCA.net
你們看下圖綠色的點,它實際上是二維的,既有縱向座標的屬性也有橫向座標的屬性,能夠用PCA方式讓它變爲一維,這樣就成了紅色這樣的點簇、視頻
PQ編碼
Product quantization(乘積量化PQ),PQ是一種創建索引的方式。這裏參考這篇文章爲你們說明:http://www.fabwrite.com/productquantizationblog
假設原始向量是1024維,能夠把它拆解成8個子向量,每一個子向量128維。
而後對每一個字向量的所有50k數據分別做Kmeans計算,假設設置Kmeans的K爲256。就獲得了8組,每組256箇中心點這樣的碼本,這個碼本能夠對50k個向量進行編碼。
也就是說把編碼從原始的1024個向量須要32bit,壓縮成了只須要log(256),8位來表示。這樣每一個向量的索引就減小了許多。
參考文檔(衷心感謝如下老師們的貢獻):