FM 原理與特點
適用場景
FM模型可以用于回歸任務(wù)、二分類任務(wù)、排名任務(wù),特別是在數(shù)據(jù)稀疏場景下,效果明顯,廣泛應(yīng)用于推薦系統(tǒng)、廣告系統(tǒng)等領(lǐng)域。
-
針對問題:
FM(Factorization Machine)主要是為了解決數(shù)據(jù)稀疏的情況下,特征怎樣組合的問題。
不同特征之間非獨立假設(shè)。
image.png
這個是它的原式,對于這個式子來說,前面兩項的復(fù)雜度是O(n),我們可以先忽略,重點來看最后一項。我們要做的就是通過數(shù)學(xué)公式的變形來對這一項進行化簡:
-
求解
image.png
-
多維擴展
> 2特征之間交互。
image.png
不好優(yōu)化,三重特征交叉過度稀疏,意義不大。 FM 實現(xiàn)
libfm-C++的 自己看 懶得記。
http://www.libfm.org/
FFM
就是在FM模型上加field,效果優(yōu)于FM,但是參數(shù)量太大,一般情況下不建議使用這種笨重的模型。
FFM是FM的一個特例,它更細致地刻畫了這個特征。首先它做了任意兩個特征組合,但是區(qū)別在于,怎么刻劃這個特征?FM只有一個向量,但FFM現(xiàn)在有兩個向量,也就意味著同一個特征,要和不同的fields進行組合的時候,會用不同的embedding去組合,它的參數(shù)量更多。對于一個特征來說,原先是一個vector,現(xiàn)在會拓成F個vector,F(xiàn)是特征fields的個數(shù),只要有跟其它特征的任意組合,就有一個vector來代表,這就是FFM的基本思想。
為了改進FFM參數(shù)量巨大不適合線上訓(xùn)練的特點,雙線性改進應(yīng)運而生。
原理:共享參數(shù)矩陣W。
三種組合W
最優(yōu)效果為組合方式。張俊林老師實驗結(jié)果顯示,隨著參數(shù)逐漸增多,雙線性FFM效果逐漸接近甚至趕超F(xiàn)FM。
結(jié)論與猜想:
- 共享參數(shù)矩陣,可以有效降低FFM的海量參數(shù),提升模型效率。
- 隨著共享矩陣參數(shù)逐漸復(fù)雜,模型效果提升就接近飽和,猜想可能存在一個共享參數(shù)矩陣的最優(yōu)邊界。
兩條演進路線:
一種,設(shè)計有效的FM新func使得有效捕捉二姐特征組合,第二種,討論高階特征。一般應(yīng)用中,第一種方式的收益,對于大多數(shù)場景,要優(yōu)于第二種,不是高階特征就一定有收益,除非高階特征的組合,對目標預(yù)測的效果有正向收益,否則,一般來說二階特征組合已經(jīng)滿足所需要的精度,且適合于實踐與部署。
DeepFM
基礎(chǔ)架構(gòu),基于W&D,LR替換為FM由人工交叉走向特征自動交叉。
FM部分:
sparsefeature做addition,共享的embedding之后的特征做隱向量點積。
Deep部分:
稀疏特征轉(zhuǎn)換為低維稠密向量。通常隨機初始化,
DeepCTR的方式,通過logistic loss function分別訓(xùn)練,合并輸出。
實際上由三部分構(gòu)成:linear+Second-order Interaction+DNN
xDeepFM 與特征交叉三巨頭
特征交叉三巨頭
理論上,XDeepFM更接近于DCN的模型結(jié)構(gòu),是DCN模型結(jié)構(gòu)的改進,模型由三部分組成:linear+DNN+CIN
解決元素級特征交互中bit-wise方式,模型訓(xùn)練域概念丟失問題,如圖所示
DCN的cross方式,先將field 的向量橫向 concat,作為一個輸入向量 x0,然后每層特征都會與 x0做內(nèi)積,得到更高一階的特征交互(DCN的Xl層輸出與Xl+1層輸出進行殘差擬合)。
如何改進?
CIN:
CIN與corss的主要差異:
- 采用vector-wise的方式使同field特征權(quán)重得以保持一致。
- 在第l層,cross包含從1~l+1層的所有特征組合,而CIN只包含l+1層的特征組合,每層輸出中間結(jié)果,然后X0再與每層做Hadamard乘積。
- 幾個問題
- CIN與FM的關(guān)系?
FM為CIN單層且壓縮矩陣W恒為1的特殊情況CIN。 -
W這個鬼東西貌似是關(guān)鍵?怎么求?
image.png
image.png
求解方式:一維卷積,deepctr里面實現(xiàn)可以去看類CIN下的call。
核心思想就是利用H^k+1 個尺寸為 m*H^k 的卷積核生成下一層隱層的狀態(tài),將三維矩陣壓縮為二維。
image.png
curr_out的大小是 Batch * Embedding Size * Layer size。然后把curr_out按照direct或者非direct的方式作為下一個隱層向量的輸入。filters采用默認glorot_uniform_initializer初始化。
純屬學(xué)習(xí) 不涉利益
ref:
https://zhuanlan.zhihu.com/p/343174108
*https://zhuanlan.zhihu.com/p/145436595
https://zhuanlan.zhihu.com/p/35526715
https://zhuanlan.zhihu.com/p/61096338
https://zhuanlan.zhihu.com/p/83784018
https://zhuanlan.zhihu.com/p/371849616
https://zhuanlan.zhihu.com/p/67795161
https://arxiv.org/pdf/1703.04247.pdf
https://zhuanlan.zhihu.com/p/154591869
https://zhuanlan.zhihu.com/p/109933924
https://zhuanlan.zhihu.com/p/45450361
https://www.cnblogs.com/talkaudiodev/p/14287562.html