推薦系統模型之 FM


什么是FM模型

FM英文全稱是“Factorization Machine”,簡稱FM模型,中文名“因子分解機”。

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

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

 

不過我給個個人判斷:我覺得FM是推薦系統工程師應該熟練掌握和應用的必備算法,即使你看很多DNN版本的排序模型,你應該大多數情況會看到它的影子,

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

DNN模型一樣離不開這個特點,而MLP結構是種低效率地捕獲特征組合的結構,所以即使是深度模型,目前一樣還離不開類似FM這個能夠直白地直接去組合特征的部分。

這是你會反復發現它的原因所在,當然也許是它本人,也許不一定是它本人,但是一定是它的變體。

 

 

從LR到SVM再到FM模型

1、LR模型是CTR預估領域早期最成功的模型,大多工業推薦排序系統采取LR這種“線性模型+人工特征組合引入非線性”的模式。因為LR模型具有簡單方便易解釋容易上規模等諸多好處,所以目前仍然有不少實際系統仍然采取這種模式。但是,LR模型最大的缺陷就是人工特征工程,耗時費力費人力資源,那么能否將特征組合的能力體現在模型層面呢?

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

3、於是,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隱層,用來直接對多階特征非線性組合建模而已,其它方面基本相同。

4、那么為什么說FM的這種特征embedding模式,在大規模稀疏特征應用環境下比較好用?為什么說它的泛化能力強呢?參考上圖說明。即使在訓練數據里兩個特征並未同時在訓練實例里見到過,意味着 x_i  and x_j 一起出現的次數為0,如果換做SVM的模式,是無法學會這個特征組合的權重的。但是因為FM是學習單個特征的embedding,並不依賴某個特定的特征組合是否出現過,所以只要特征 x_i 和其它任意特征組合出現過,那么就可以學習自己對應的embedding向量。於是,盡管 x_i  and x_j 這個特征組合沒有看到過,但是在預測的時候,如果看到這個新的特征組合,因為 x_ix_j 都能學會自己對應的embedding,所以可以通過內積算出這個新特征組合的權重。這是為何說FM模型泛化能力強的根本原因。

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

 

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

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

3、本質上,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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM