FM/FFM/wide&deep/deepFM筆記

一,FM

FM在LR的基礎上,增加了交叉特徵,表達能力更強。FM爲每個特徵學習一個隱向量,在特徵交叉時,使用兩個特徵隱向量的內積作爲交叉特徵的權重。FM的模型是:
y ~ = w 0 + ∑ i = 1 n w i x i + ∑ i = 1 n ∑ j = i + 1 n < v i v j > x i x j \widetilde{y}=w _{0}+\sum_{i=1}^{n}w _{i}x _{i}+\sum_{i=1}^{n} \sum_{j=i+1}^{n}<v_{i}v_{j}>x_{i}x_{j} y =w0+i=1nwixi+i=1nj=i+1n<vivj>xixj
這點與矩陣分解類似。

在迴歸問題中,用預測值Y作爲最終的預測結果,再使用均方根誤差作爲優化目標。在分類問題中,通過映射函數,如sigmoid將y映射到不同的類別範圍上,再使用交叉熵損失函數作爲優化目標。
FM雖然捨棄了一些精確性,但是大大提升了泛化能力,對於稀疏數據尤其適合。
FM的訓練參數有n*k個。經過簡化FM在使用梯度下降訓練過程中的複雜度爲O(k*n)。

二,FFM

FFM引入了特徵域,每個特徵對應的不是唯一一個隱向量,而是一組隱向量。在Xi和Xj做特徵交叉的時候,Xi和Xj會各自從一組隱向量中挑出與對方特徵域對應的隱向量進行交叉。
y ~ = w 0 + ∑ i = 1 n w i x i + ∑ i = 1 n ∑ j = i + 1 n < v i , f j ∗ v j , f i > x i x j \widetilde{y}=w _{0}+\sum_{i=1}^{n}w _{i}x _{i}+\sum_{i=1}^{n} \sum_{j=i+1}^{n}<v_{i,f_{j}}*v_{j,f_{i}}>x_{i}x_{j} y =w0+i=1nwixi+i=1nj=i+1n<vi,fjvj,fi>xixj

每個特徵都是一個域,比如性別域,年齡域等。在實際的訓練過程中需要學習n個特徵在f個域上的k維隱向量,參數數量總共nnf個。

FFM的訓練參數有nnk個,在使用梯度下降訓練時其複雜度爲O(nnk)。

三,wide&&deep

記憶能力與泛化能力的綜合
是由單層wide部分和多層deep部分組成的混合模型。
wide部分

part 側重 層級 處理特徵 得到特徵
wide 記憶能力 單層 稀疏的特徵 強特徵
deep 泛化能力 多隱層 全部特徵 交叉特徵,挖掘特徵的數據模式

記憶能力:模型直接學習並利用歷史數據中物品或者特徵的「共現頻率」的能力。
泛化能力:模型傳遞特徵的相關性,以及發掘稀疏甚至從未出現過的稀有特徵與最終標籤相關性的能力。
wide&deep的架構圖如下所示:
在這裏插入圖片描述
Wide部分是廣義線性模型,即
y = w T [ x , ϕ ( x ) ] + b y = w^T[x,\phi{(x)}]+b y=wT[x,ϕ(x)]+b
其中x和 ϕ ( x ) \phi{(x)} ϕ(x)表示原始特徵和交叉特徵。
Deep部分是前饋網絡,網絡會對一些sparse(如ID類特徵)學習一個低維dense Embedding,然後和一些原始dense特徵一起作爲網絡的輸入。每一層計算:
a l + 1 = f ( W l a l + b l ) a^{l+1} = f(W^la^l+b^l) al+1=f(Wlal+bl)
其中 a l , b l , W l a^l,b^l,W^l al,bl,Wl是第l層**值、偏置和權重。f是**函數。
損失函數模型選取log-loss,wide&deep最後的預測輸出爲:
p ( y = 1 ∣ x ) = σ ( w w i d e T [ x , ϕ ( x ) ] + w w i d e T a l f + b ) p(y=1|x)=\sigma(w^T_{wide}[x,\phi{(x)}]+w^T_{wide}a^{l_f}+b) p(y=1x)=σ(wwideT[x,ϕ(x)]+wwideTalf+b)

其中 σ \sigma σ表示sigmoid函數, ϕ ( x ) \phi{(x)} ϕ(x)表示叉乘特徵, a l f a^{l_f} alf表示NN最後一層**值。
通過交叉積變換層完成特徵組合之後,wide部分將組合特徵輸入最終的LogLoss輸出層,與deep部分的輸出一同參與最後的目標擬合。

聯合訓練
聯合訓練(Joint Training)和集成(Ensemble)是不同的,集成是每個模型單獨訓練,再將模型的結果匯合。相比聯合訓練,集成的每個獨立模型都得學得足夠好纔有利於隨後的匯合,因此每個模型的model size也相對更大。而聯合訓練的wide部分只需要作一小部分的特徵叉乘來彌補deep部分的不足,不需要 一個full-size 的wide 模型。

在論文中,作者通過梯度的反向傳播,使用 mini-batch stochastic optimization 訓練參數,並對wide部分使用帶L1正則的Follow- the-regularized-leader (FTRL) 算法,對deep部分使用 AdaGrad算法。

四,deepFM

用FM代替wide&&deep中的wide部分。
左邊的FM部分對不同的特徵域的Embedding進行了兩兩交叉,也就是將Embedding向量當作原FM的特徵隱向量。最後將FM的輸出和Deep部分的輸出一起輸入到最後的輸出層,參與最後的目標擬合。
框架如下所示:
在這裏插入圖片描述
DeepFM 的結構與Wide & Deep的框架相似,差異在於將Wide部分的LR替換爲了FM,從而自動構造二階特徵叉乘,而非手工設計叉乘。
DeepFM中FM模型可以抽取low-order特徵,DNN可以抽取high-order特徵。無需Wide&Deep模型人工特徵工程。
FM部分的圖如下所示:
在這裏插入圖片描述
FM層與NN層 共享 embedding 層,而非各自學習各自部分的embedding。這麼做的好處是:
1)降低模型複雜度;
2)在embedding的學習中同時接收與來自「low & high order interaction」部分的反饋,從而學到更好的特徵表示。
Deep部分
該部分和Wide&Deep模型類似,是簡單的前饋網絡。在輸入特徵部分,由於原始特徵向量多是高緯度,高度稀疏,連續和類別混合的分域特徵,爲了更好的發揮DNN模型學習high-order特徵的能力,文中設計了一套子網絡結構,將原始的稀疏表示特徵映射爲稠密的特徵向量。
在這裏插入圖片描述
不同field特徵長度不同,但是子網絡輸出的向量需具有相同維度.
假設子網絡的輸出層爲:
a ( 0 ) = [ e 1 , e 2 , . . . , e m ] a^{(0)}=[e_1,e_2,...,e_m] a(0)=[e1,e2,...,em]
DNN網絡第i層表示爲:
a l + 1 = σ ( W ( l ) a ( l ) + b ( l ) ) a^{l+1}=\sigma(W^{(l)}a^{(l)}+b^{(l)}) al+1=σ(W(l)a(l)+b(l))
假設一共有H個隱藏層,DNN部分對CTR預測結果可以表示爲:
y D N N = σ ( W ∣ H ∣ + 1 a H + b ∣ H ∣ + 1 ) y_{DNN}=\sigma({W^{|H|+1}a^H+b^{|H|+1}}) yDNN=σ(WH+1aH+bH+1)
其中 σ \sigma σ表示**函數relu。

FM模型獲得特徵的2階表示,與DNN模型得到high-order高階特徵,輸入到模型聯合去訓練,結果可表示爲:
y ^ = s i g m o i d ( y F M + y D N N ) \hat{y} = sigmoid(y_{FM}+y_{DNN}) y^=sigmoid(yFM+yDNN)

參考鏈接:
FM與FFM:
深入理解FFM原理與實踐
FM以及優化公式推導:

wide&deep原理:
詳解 Wide&Deep 推薦框架
詳解 Wide & Deep 結構背後的動機-更細緻

DeepFM原理:
深度推薦模型之DeepFM