Steffen Rendle於2010年提出Factorization Machines(下面簡稱FM),並發布開源工具libFM。
一、與其他模型的對比
與SVM相比,FM對特征之間的依賴關系用factorized parameters來表示。對於輸入數據是非常稀疏(比如自動推薦系統),FM搞的定,而SVM搞不定,因為訓出的SVM模型會面臨較高的bias。還有一點,通常對帶非線性核函數的SVM,需要在對偶問題上進行求解;而FM可以不用轉為對偶問題,直接進行優化。
目前還有很多不同的factorization models,比如matrix factorization和一些特殊的模型SVD++, PITF, FPMC。這些模型的一個缺點是它們只適用於某些特定的輸入數據,優化算法也需要根據問題專門設計。而經過一些變換,可以看出FM囊括了這些方法。
二、模型簡介
2-way FM(degree = 2)是FM中具有代表性,且比較簡單的一種。就以其為例展開介紹。其對輸出值是如下建模:

公式說明:
(1) 模型的參數包括:;
(2) n是特征維度;
(3) k是定義factorization維度的超參數,是正整數。
(4) 在FM中,如何對特征之間的依賴關系建模?首先用k維向量去描述每個維度,然后對2個維度所對應的vi和vj求點積,以此來刻畫2個特征之間的特征關系。如果需要刻畫x(x>2)個特征之間的關系,可以用x-way FM模型。
(5) 表面上看式子的第3項的計算復雜度為O(kn2),但其實可以經過簡單的數學處理,計算復雜度降為O(kn)。
三、模型分析
他的思想應該是從推薦系統中經典的SVD模型(因子分解模型)得到的,經典的SVD模型當中相當於只有兩種類型的feature,一類feature是user,一類feature是item,而libFM是把這個模型推廣到了多類feature的情況。為簡單起見,考慮因子維數為1的情況,SVD模型用a∗ba∗b來作為對打分的預測。而libFM要面對的是多類feature,假設是3類,那么就用a∗b+b∗c+c∗aa∗b+b∗c+c∗a來作為對結果的預測。這時候就要問了,如果feature很多,這不就有平方量級的乘法次數了么?當然不是,libFM的文章中提到,他利用((a+b+c)2−a2−b2−c2)/2((a+b+c)2−a2−b2−c2)/2來計算剛才的式子,但是你可以看到,他們其實是相等的,不同的是,這樣的計算量只是線性復雜度的。當然libFM也同時支持bias項,這和經典SVD模型類似。
以上就是libFM的創新之處,其實如果很了解SVD模型,那這個改進並不難理解。
論文中還提到,經典的SVD++模型等對於SVD模型的改進,也只是libFM的一個子集而已。只要合適的去添加feature即可。比如SVD++模型就相當於對每個item增加一個feature,來描述用戶是否也給這個item打過分即可。所以有了libFM以后,最需要人工解決的問題就是添加合適的feature了。
另外再說明一下推薦系統的數據如何轉化成libFM接受的形式。假設User ID范圍是[0,99],Item ID范圍是[0,199],則定義feature 0到feature 99對應於User,feature 100到feature 299對應於Item,假設第一條打分記錄是User 4對Item 9的打分,則feature 4和feature 109的取值為1,其余feature取值都是0。由於數據文件是稀疏格式的,所以取值為0的feature都不用寫,這樣文件不會太大。其余對經典SVD模型的改進就需要增加一些對應feature。他的代碼中,每條記錄是使用map存儲feature的,可以隨機存取任意一個feature的值(但是可能用鏈表就可以了?因為一般都是順序訪問的)。
FM可以用於多種預測問題,包括回歸、分類和排序。對不同的預測問題,可以選擇合適的loss term和regularization term。另外,FM的梯度也很容易求。