因子分解機系列--FM
1.FM背景
FM (Factorization Machine) 主要是為了解決數據稀疏的情況下,特征怎樣組合的問題。目前主要應用於CTR預估以及推薦系統中的概率計算。下圖是一個廣告分類的問題,根據用戶和廣告位相關的特征,預測用戶是否點擊了廣告。圖片來源,詳見參考1。

如上圖,clicked?為要預測label,由Country,Day,Ad_type三列共同決定。由於此三列都為category類別特征,很多模型不能直接用其來預測,所以需要先轉化為one-hot特征,即:

對於one-hot編碼后的特征,可以看到目前是7維,但對每一條樣本,平均只有3維特征有非0值,換言之樣本數據是很稀疏的,特別是在電商領域,例如一個商品品類有幾百種,那么one-hot后就是幾百個特征就只有一列值為1。
正如上圖中數據,在某些特征經過關聯之后,與label之間的相關性就會提高。例如,“USA”與“Thanksgiving”、“China”與“Chinese New Year”。這種關聯特征也很符合我們的主觀邏輯,比如'女'和'化妝品'、'男'和'籃球'。因此,引入兩個特征的組合作為新特征是非常有意義的。
2.FM模型
多項式模型是包含特征組合的最直觀的模型。在多項式模型中,特征 xi 和 xj 的組合采用 xixj 表示,即 xi 和 xj 都非零時,組合特征 xixj 才有意義。模型如下:
其中,n 代表樣本的特征數量,xi 是第 i 個特征的值,w0、wi、wij 是模型參數。這里我認為還有i的取值為1到n-1,j的取值是i+1到n,因為特征自己與自己結合沒有意義。(雖然很多資料都是1到n,如果有錯請指出)
相較與一般的線性模型,FM模型多了后半部分,也就是特征組合的部分。
從公式(1)可以看出,組合特征的參數一共有 n*(n−1)/2 個,因為特征要兩兩組合,而任意兩個參數都是獨立的。對於每個wij都需要xi和xj都非0的樣本來訓練,而樣本數據又很稀疏,可想而知wij應該不會訓練的太准確。
3.FM求解
問題來了,如何求解二次項次數呢?很自然的想到了矩陣分解。在model-based的協同過濾中,一個rating矩陣可以分解為user矩陣和item矩陣,每個user和item都可以采用一個隱向量表。比如下圖,我們把每個user表示成一個二維向量,同時把每個item表示成一個二維向量,(這里也就是k=2) 兩個向量的點積就是矩陣中user對item的打分。

所有二次項的系數構成一個二維矩陣W,這個矩陣就可以分解為 W=VV^T,V的第i行便是第i維特征的隱向量。換句話說,每個參數Wij = <Vi,Vj>。那現在要求Wij只要能求出輔助向量vi和vj即可。V定義如下:
那么Wij可以表示為:
那么相應的W不就可以表示為:
而我們要求的二次項系數,即是VV^T矩陣對角線的右下或左下部分。當然這里只考慮的是二階多項式模型。此時FM模型應為:
<Vi,Vj>其實就是向量的點乘。
根據(3)式,我們來計算下復雜度。這里設V為k維。(我是這樣計算的,如果有差別也應該是常數的差別)。
不過這里可以對(3)式進行化簡,時間復雜度就可以減少為線性的了。具體如下,這里記住Wij是W矩陣去除主對角線的一半就很好理解了。
利用SGD來訓練參數,
對於當Theta=Vif時,第一個求和公式中
是與i無關的,在每次迭代過程中,只需計算一次所有 f 的,就可以求得所有 vi,f 的梯度。顯然計算所有f的的復雜度是O(kn),此時再計算每個參數梯度的復雜度是O(1),得到梯度后,更新每個參數的復雜度也是O(1);模型參數一共有nk + n + 1個。因此,FM參數訓練的復雜度也是O(kn)。綜上可知,FM可以在線性時間訓練和預測,是一種非常高效的模型。
4.相關代碼
Github: https://github.com/Alarical/Recommend/tree/master/FM
參考github上大佬的FM-tensorflow實現(加了些注釋,捂臉)。代碼主要部分就是在函數中vectorize_dic,該函數是來構造一個矩陣,每行中有2個元素為1,方便后續做交叉特征,其他部分都是很平常的tf語句,結合注釋很容易理解。
5.參考資料
http://www.cs.cmu.edu/~wcohen/10-605/2015-guest-lecture/FM.pdf
https://github.com/babakx/fm_tensorflow/blob/master/fm_tensorflow.ipynb
https://www.jianshu.com/p/152ae633fb00
https://tech.meituan.com/2016/03/03/deep-understanding-of-ffm-principles-and-practices.html
https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/6340129.html