主要內容: git
在傳統的線性模型如LR中,每一個特徵都是獨立的,若是須要考慮特徵與特徵直接的交互做用,可能須要人工對特徵進行交叉組合;非線性SVM能夠對特徵進行kernel映射,可是在特徵高度稀疏的狀況下,並不能很好地進行學習;如今也有不少分解模型Factorization model如矩陣分解MF、SVD++等,這些模型能夠學習到特徵之間的交互隱藏關係,但基本上每一個模型都只適用於特定的輸入和場景。爲此,在高度稀疏的數據場景下如推薦系統,FM(Factorization Machine)出現了。 算法
下面全部的假設都是創建在稀疏數據的基礎上,舉個例子,根據用戶的評分歷史預測用戶對某部電影的打分,這裏的每一行對應一個樣本,Feature vector x表示特徵,Targer y表示預測結果。從下圖能夠看出,這是一個稀疏特徵的例子,後面的相關內容會以此爲例子進行說明。 app
特徵中的前四列表示用戶u(one-hot編碼,稀疏),接着五列表示電影i(ont-hot編碼,稀疏),再接下去五列表示用戶u對電影i的打分(歸一化特徵),緊接着一列表示時間(連續特徵),最後五列表示用戶u對電影i打分前評價過的最近一部電影(one-hot編碼,稀疏) svn
二元交叉的FM(2-way FM)目標函數以下: 函數
其中,w是輸入特徵的參數,<vi,vj>是輸入特徵i,j間的交叉參數,v是k維向量。 學習
前面兩個就是咱們熟知的線性模型,後面一個就是咱們須要學習的交叉組合特徵,正是FM區別與線性模型的地方。 測試
爲何要經過向量v的學習方式而不是簡單的wij參數呢? 優化
這是由於在稀疏條件下,這樣的表示方法打破了特徵的獨立性,可以更好地挖掘特徵之間的相關性。以上述電影爲例,咱們要估計用戶A和電影ST的關係w(A&ST)以更好地預測y,若是是簡單地考慮特徵之間的共現狀況來估計w(A&ST),從已有的訓練樣原本看,這二者並無共現,所以學習出來的w(A&ST)=0。而實際上,A和ST應該是存在某種聯繫的,從用戶角度來看,A和B都看過SW,而B還看過ST,說明A也可能喜歡ST,說明A頗有可能也喜歡ST。而經過向量v來表示用戶和電影,任意兩兩之間的交互都會影響v的更新,從前面舉的例子就能夠看過,A和B看過SW,這樣的交互關係就會致使v(ST)的學習更新,所以經過向量v的學習方式可以更好的挖掘特徵間的相互關係,尤爲在稀疏條件下。 編碼
可能有人會問,這樣兩兩交叉的複雜度應該O(k*n^2)吧,其實,經過數學公式的巧妙轉化一下,就能夠變成O(kn)了。轉化公式以下所示,其實就是利用了2xy = (x+y)^2 – x^2 – y^2的思路。 spa
FM能夠應用於不少預測任務,好比迴歸、分類、排序等等。
1.迴歸Regression:y^(x)直接做爲預測值,損失函數能夠採用least square error;
2.二值分類Binary Classification:y^(x)需轉化爲二值標籤,如0,1。損失函數能夠採用hinge loss或logit loss;
3.排序Rank:x可能須要轉化爲pair-wise的形式如(X^a,X^b),損失函數能夠採用pairwise loss
前面提到FM目標函數能夠在線性時間內完成,那麼對於大多數的損失函數而言,FM裏面的參數w和v更新經過隨機梯度降低SGD的方法一樣能夠在線性時間內完成,好比logit loss,hinge loss,square loss,模型參數的梯度計算以下:
這部分求和跟樣本i是獨立的,所以能夠預先計算好。
前面提到到都是二元交叉,其實能夠延伸到多元交叉,目標函數以下:(看起來複雜度好像很高,其實也是能夠在線性時間內完成的)
前面簡單地介紹了FM模型,總的來講,FM經過向量交叉學習的方式來挖掘特徵之間的相關性,有如下兩點好處:
1.在高度稀疏的條件下可以更好地挖掘數據特徵間的相關性,尤爲是對於在訓練樣本中沒出現的交叉數據;
2.FM在計算目標函數和在隨機梯度降低作優化學習時均可以在線性時間內完成。
SVM是你們熟知的支持向量機模型,其模型原理在這裏就不詳述了。
SVM的線性模型函數表示爲:
其非線性形式能夠經過核映射kernel mapping的方式獲得,以下所示:
其中多項式核表示爲:
當d=2時爲二次多項式,表示爲:
多項式核映射後的模型函數表示爲:
看到上面的式子,是否是以爲跟FM特別像?SVM和FM的主要區別在於,SVM的二元特徵交叉參數是獨立的,如wij,而FM的二元特徵交叉參數是兩個k維的向量vi、vj,這樣子的話,<vi,vj>和<vi,vk>就不是獨立的,而是相互影響的。
爲何線性SVM在和多項式SVM在稀疏條件下效果會比較差呢?線性svm只有一維特徵,不能挖掘深層次的組合特徵在實際預測中並無很好的表現;而多項式svn正如前面提到的,交叉的多個特徵須要在訓練集上共現才能被學習到,不然該對應的參數就爲0,這樣對於測試集上的case而言這樣的特徵就失去了意義,所以在稀疏條件下,SVM表現並不能讓人滿意。而FM不同,經過向量化的交叉,能夠學習到不一樣特徵之間的交互,進行提取到更深層次的抽象意義。
此外,FM和SVM的區別還體如今:1)FM能夠在原始形式下進行優化學習,而基於kernel的非線性SVM一般須要在對偶形式下進行;2)FM的模型預測是與訓練樣本獨立,而SVM則與部分訓練樣本有關,即支持向量。
這部分不詳述,其餘分解模型包括Matrix factorization (MF)、SVD++、PITF for Tag Recommendation、Factorized Personalized Markov Chains (FPMC),這些模型都只在特定場景下使用,輸入形式也比較單一(好比MF只適用於categorical variables),而FM經過對輸入特徵進行轉換,一樣可能夠實現以上模型的功能,並且FM的輸入能夠是任意實數域的數據,所以FM是一個更爲泛化和通用的模型。詳細內容參考:https://www.csie.ntu.edu.tw/~b97053/paper/Rendle2010FM.pdf
一、《Factorization Machines》