淺析Faiss在推薦系統中的應用及原理

以前在業務中應用了許多Faiss,也看了幾篇關於Faiss的論文,簡單記錄下Faiss的一些屬性和應用。Faiss是Facebook的AI團隊開源的一套用於作聚類或者類似性搜索的軟件庫,底層是用C++實現。Faiss由於超級優越的性能,被普遍應用於推薦相關的業務當中。接下來分Faiss在推薦業務應用和Faiss的基本原理兩部分進行介紹。git

1 Faiss在推薦業務中的應用

在個人認知裏,基本上50%以上的手機APP的推薦業務會應用到Faiss服務,可見應用之廣。那Faiss到底是在哪一個模塊使用呢,經過下方這個圖給你們介紹:github

屏幕快照 2020-05-05 下午5.36.50.png

你們都知道推薦業務包含排序和召回兩個模塊,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個向量進行編碼。

image.png

 

也就是說把編碼從原始的1024個向量須要32bit,壓縮成了只須要log(256),8位來表示。這樣每一個向量的索引就減小了許多。

image.png

 

參考文檔(衷心感謝如下老師們的貢獻):

(1)http://www.fabwrite.com/productquantization

(2)https://github.com/facebookresearch/faiss

相關文章
相關標籤/搜索