推薦系統模型之 FM

什麼是FM模型

FM英文全稱是「Factorization Machine」,簡稱FM模型,中文名「因子分解機」。算法

FM模型其實有些年頭了,是2010年由Rendle提出的,可是真正在各大廠大規模在CTR預估和推薦領域普遍使用,其實也就是最近幾年的事。性能優化

FM模型 原理參考: https://zhuanlan.zhihu.com/p/50426292ide

 

不過我給個我的判斷:我以爲FM是推薦系統工程師應該熟練掌握和應用的必備算法,即便你看不少DNN版本的排序模型,你應該大多數狀況會看到它的影子,性能

緣由其實很簡單:特徵組合對於推薦排序是很是很是重要的,而FM這個思路已經很簡潔優雅地體現了這個思想了(主要是二階特徵組合)。學習

DNN模型同樣離不開這個特色,而MLP結構是種低效率地捕獲特徵組合的結構,因此即便是深度模型,目前同樣還離不開相似FM這個可以直白地直接去組合特徵的部分。測試

這是你會反覆發現它的緣由所在,固然也許是它本人,也許不必定是它本人,可是必定是它的變體。大數據

 

 

從LR到SVM再到FM模型

一、LR模型是CTR預估領域早期最成功的模型,大多工業推薦排序系統採起LR這種「線性模型+人工特徵組合引入非線性」的模式。由於LR模型具備簡單方便易解釋容易上規模等諸多好處,因此目前仍然有很多實際系統仍然採起這種模式。可是,LR模型最大的缺陷就是人工特徵工程,耗時費力費人力資源,那麼可否將特徵組合的能力體如今模型層面呢?優化

二、其實想達到這一點並不難,如上圖在計算公式里加入二階特徵組合便可,任意兩個特徵進行組合,能夠將這個組合出的特徵看做一個新特徵,融入線性模型中。而組合特徵的權重能夠用來表示,和一階特徵權重同樣,這個組合特徵權重在訓練階段學習得到。其實這種二階特徵組合的使用方式,和多項式核SVM是等價的。雖然這個模型看上去貌似解決了二階特徵組合問題了,可是它有個潛在的問題:它對組合特徵建模,泛化能力比較弱,尤爲是在大規模稀疏特徵存在的場景下,這個毛病尤爲突出,好比CTR預估和推薦排序,這些場景的最大特色就是特徵的大規模稀疏。因此上述模型並未在工業界普遍採用。那麼,有什麼辦法可以解決這個問題嗎?編碼

三、因而,FM模型此刻能夠閃亮登場了。如上圖所示,FM模型也直接引入任意兩個特徵的二階特徵組合,和SVM模型最大的不一樣,在於特徵組合權重的計算方法。FM對於每一個特徵,學習一個大小爲k的一維向量,因而,兩個特徵 x_ix_j 的特徵組合的權重值,經過特徵對應的向量 v_iv_j 的內積 ⟨v_i,v_j ⟩ 來表示。這本質上是在對特徵進行embedding化表徵,和目前很是常見的各類實體embedding本質思想是一脈相承的,可是很明顯在FM這麼作的年代(2010年),尚未如今能看到的各類眼花繚亂的embedding的形式與概念。因此FM做爲特徵embedding,能夠看做當前深度學習裏各類embedding方法的老前輩。固然,FM這種模式有它的前輩模型嗎?有,等會會談。其實,和目前的各類深度DNN排序模型比,它僅僅是少了2層或者3層MLP隱層,用來直接對多階特徵非線性組合建模而已,其它方面基本相同。

四、那麼爲何說FM的這種特徵embedding模式,在大規模稀疏特徵應用環境下比較好用?爲何說它的泛化能力強呢?參考上圖說明。即便在訓練數據裏兩個特徵並未同時在訓練實例裏見到過,意味着 x_i  and x_j 一塊兒出現的次數爲0,若是換作SVM的模式,是沒法學會這個特徵組合的權重的。可是由於FM是學習單個特徵的embedding,並不依賴某個特定的特徵組合是否出現過,因此只要特徵 x_i 和其它任意特徵組合出現過,那麼就能夠學習本身對應的embedding向量。因而,儘管 x_i  and x_j 這個特徵組合沒有看到過,可是在預測的時候,若是看到這個新的特徵組合,由於 x_ix_j 都能學會本身對應的embedding,因此能夠經過內積算出這個新特徵組合的權重。這是爲什麼說FM模型泛化能力強的根本緣由。orm

其實本質上,這也是目前不少花樣的embedding的最核心特色,就是從0/1這種二值硬核匹配,切換爲向量軟匹配,使得原先匹配不上的,如今能在必定程度上算密切程度了,具有很好的泛化性能。

 

MF(Matrix Factorization,矩陣分解)和FM

一、MF(Matrix Factorization,矩陣分解)模型是個在推薦系統領域裏資格很深的老前輩協同過濾模型了。核心思想是經過兩個低維小矩陣(一個表明用戶embedding矩陣,一個表明物品embedding矩陣)的乘積計算,來模擬真實用戶點擊或評分產生的大的協同信息稀疏矩陣,本質上是編碼了用戶和物品協同信息的降維模型。
二、當訓練完成,每一個用戶和物品獲得對應的低維embedding表達後,若是要預測某個  User_i 對  Item_j 的評分的時候,只要它們作個內積計算  ⟨User_i,Item_j ⟩ ,這個得分就是預測得分。看到這裏,讓你想起了什麼嗎?

三、本質上,MF模型是FM模型的特例,MF能夠被認爲是隻有User ID 和Item ID這兩個特徵Fields的FM模型,MF將這兩類特徵經過矩陣分解,來達到將這兩類特徵embedding化表達的目的。而FM則能夠看做是MF模型的進一步拓展,除了User ID和Item ID這兩類特徵外,不少其它類型的特徵,均可以進一步融入FM模型裏,它將全部這些特徵轉化爲embedding低維向量表達,並計算任意兩個特徵embedding的內積,就是特徵組合的權重,若是FM只使用User ID 和Item ID,你套到FM公式裏,看看它的預測過程和MF的預測過程同樣嗎?

從誰更早使用特徵embedding表達這個角度來看的話,很明顯,和FM比起來,MF纔是真正的前輩,無非是特徵類型比較少而已。而FM繼承了MF的特徵embedding化表達這個優勢,同時引入了更多Side information做爲特徵,將更多特徵及Side information embedding化融入FM模型中。因此很明顯FM模型更靈活,能適應更多場合的應用範圍。

鑑於MF和FM以上錯綜複雜剪不斷理還亂的關係,我推論出下面的觀點(我的意見):

其一:在你有使用MF作協同過濾的想法的時候,暫時壓抑一下這種衝動,能夠優先考慮引入FM來作的,而非傳統的MF,由於能夠在實現等價功能的基礎上,很方便地融入其它任意你想加入的特徵,把手頭的事情作得更豐富多彩。

其二:從實際大規模數據場景下的應用來說,在排序階段,絕大多數只使用ID信息的模型是不實用的,沒有引入Side Information,也就是除了User ID/Item ID外的不少其它可用特徵的模型,是不具有實戰價值的。緣由很簡單,大多數真實應用場景中,User/Item有不少信息可用,而協同數據只是其中的一種,引入更多特徵明顯對於更精準地進行個性化推薦是很是有幫助的。而若是模型不支持更多特徵的便捷引入,明顯受限嚴重,很難真正實用,這也是爲什麼矩陣分解類的方法不多看到在Ranking階段使用,一般是做爲一路召回形式存在的緣由。

在數據量特別大的狀況下,若是在效果好和速度快之間作選擇,不少時候跑得快的簡單模型會勝出,這是爲什麼LR模型在CTR預估領域一直被普遍使用的緣由。

而FFM模型則是反例,咱們在幾個數據集合上測試過,FFM模型做爲排序模型,效果確實是要優於FM模型的,可是FFM模型對參數存儲量要求太多,以及沒法能作到FM的運行效率,若是中小數據規模作排序沒什麼問題,可是數據量一旦大起來,對資源和效率的要求會急劇升高,這是嚴重阻礙FFM模型大規模數據場景實用化的重要因素。

再順手談談DNN排序模型,如今貌似看着有不少版本的DNN排序模型,可是考慮到上面講的運算效率問題,你會發現太多所謂效果好的模型,其實不具有實用價值,算起來太複雜了,效果好得又頗有限,超大規模訓練或者在線 Serving速度根本跟不上。除非,大家公司有具有至關強悍實力的工程團隊,可以進行超大數據規模下的大規模性能優化,那當我上面這句話沒說。

我對排序模型,若是你打算推上線真用起來的話,建議是,沿着這個序列嘗試:FM-->DeepFM。你看着路徑有點短是嗎?確實比較短。若是DeepFM作不出效果,別再試着去嘗試更復雜的模型了,仍是多從其它方面考慮考慮優化方案爲好。有些複雜些的模型,也許效果確實好一些,在個別大公司也許真作上線了,可是極可能效果好不是算法的功勞,是工程能力強等多個因素共同致使的,人家能作,你未必作的了。至於被普遍嘗試的Wide &Deep,我我的對它有偏見,因此直接被我跳過了。固然,若是你原始線上版本是LR,是能夠直接先嚐試Wide&Deep的,可是即便如此,要我作升級方案,我給的建議會是這個序列:LR—>FM-->DeepFM—>乾點其餘的。



如何利用FM模型作統一的召回模型

上文書提到過,目前工業界推薦系統在召回階段,大多數採用了多路召回策略,好比典型的召回路有:基於用戶興趣標籤的召回;基於協同過濾的召回;基於熱點的召回;基於地域的召回;基於Topic的召回;基於命名實體的召回等等,除此外還有不少其它類型的召回路。

如今咱們來探討下第一個問題:在召回階段,可否用一個統一的模型把多路召回招安?就是說改形成利用單個模型,單路召回的模式?具體到這篇文章,就是說可否利用FM模型來把多路召回統一塊兒來?

在回答上述問題以前,我估計你會提出疑問:目前你們用多路召回用的好好的,爲啥要畫蛇添足,用一個模型把多路召回統一塊兒來呢?這個問題很是好,咱們確實應該先看這麼作的必要性。

 

統一召回和多路召回優缺點比較

咱們先來講明下統一召回和多路召回各自的優缺點,我以爲使用統一召回模式,相對多路召回有以下優勢:

首先,採用多路召回,每一路召回由於採起的策略或者模型不一樣,因此各自的召回模型得分不可比較,好比利用協同過濾召回找到的候選Item得分,與基於興趣標籤這一路召回找到的候選Item得分,徹底是不可比較的。這也是爲什麼要用第二階段Ranking來將分數統一的緣由。而若是採起統一的召回模型,好比FM模型,那麼不論候選項Item來自於哪裏,它們在召回階段的得分是徹底可比的。

其次,貌似在目前「召回+Ranking」兩階段推薦模型下,多路召回分數不可比這個問題不是特別大,由於咱們能夠依靠Ranking階段來讓它們可比便可。可是其實多路召回分數不可比會直接引起一個問題:對於每一路召回,咱們應該返回多少個Item是合適的呢?若是在多路召回模式下,這個問題就很難解決。既然分數不可比,那麼每一路召回多少候選項K就成爲了超參,須要不斷調整這個參數上線作AB測試,才能找到合適的數值。而若是召回路數特別多,因而每一路召回帶有一個超參K,就是這一路召回多少條候選項,這樣的超參組合空間是很是大的。因此到底哪一組超參是最優的,就很難定。其實現實狀況中,不少時候這個超參都是拍腦殼上線測試,找到最優的超參組合機率是很低的。

而若是假設咱們統一用FM模型來作召回,其實就不存在上面這個問題。這樣,咱們能夠在召回階段作到更好的個性化,好比有的用戶喜歡看熱門的內容,那麼熱門內容在召回階段返回的比例就高,而其它內容返回比例就低。因此,能夠認爲各路召回的這組超參數就徹底依靠FM模型調整成個性化的了,很明顯這是使用單路單模型作召回的一個特別明顯的好處。

再次,對於工業界大型的推薦系統來講,有極大的可能作召回的技術人員和作Ranking的技術人員是兩撥人。這裏隱含着一個潛在可能會發生的問題,好比召回階段新增了一路召回,可是作Ranking的哥們不知道這個事情,在Ranking的時候沒有把能體現新增召回路特性的特徵加到Ranking階段的特徵中。這樣體現出來的效果是:新增召回路看上去沒什麼用,由於即便你找回來了,並且用戶真的可能點擊,可是在排序階段死活排不上去。也就是說,在召回和排序之間可能存在信息鴻溝的問題,由於目前召回和排序二者的表達模式差別很大,排序階段以特徵爲表達方式,召回則以「路/策略/具體模型」爲表達方式,二者之間差別很大,是比較容易產生上述現象的。

可是若是咱們採用FM模型來作召回的話,新增一路召回就轉化爲新增特徵的問題,而這一點和Ranking階段在表現形式上是相同的,對於召回和排序兩個階段來講,二者都轉化成了新增特徵問題,因此兩個階段的改進語言體系統一,就不太容易出現上述現象。

上面三點,是我能想到的採用統一召回模型,相對多路召回的幾個好處。可是是否是多路召回必定不如統一召回呢?其實也不是,很明顯多路召回這種策略,上線一個新召回方式比較靈活,對線上的召回系統影響很小,由於不一樣路召回之間沒有耦合關係。可是若是採用統一召回,當想新增一種召回方式的時候,表現爲新增一種或者幾種特徵,可能須要徹底從新訓練一個新的FM模型,整個召回系統從新部署上線,靈活性比多路召回要差。

上面講的是必要性,講完了必要性,咱們下面先探討如何用FM模型作召回,而後再討論如何把多路召回改形成單路召回,這實際上是兩個不一樣的問題。

 

 
連接:https://zhuanlan.zhihu.com/p/58160982
相關文章
相關標籤/搜索