ctr預估之Wide&Deep和DeepFM

之前寫了兩篇關於graph embedding的文章,這次換個主題,分享兩個ctr預估算法。一個是Wide&Deep,是谷歌16年提的算法《Wide & Deep Learning for Recommender Systems》,鏈接https://arxiv.org/pdf/1606.07792.pdf,這個算法是用在谷歌應用商店做排序的。另外一個是DeepFM,來自於華爲17年提出的《DeepFM: A Factorization-Machine based Neural Network for CTR Prediction》,鏈接https://arxiv.org/pdf/1703.04247.pdf,這個是華爲用在應用商店做排序的。這兩個算法既可以在廣告中做ctr預估,也可以在推薦系統中做排序。

ctr預估算法中最經典的莫過於邏輯迴歸LR,優勢是速度快,便於加特徵,可解釋。缺點也很明顯,就是無法直接擬合高階特徵,無法做特徵交叉,因此需要大量的人工特徵工程和專家經驗來做特徵交叉。後來出現的因子分解機FM,可以解決二階特徵交叉問題,但是不能解決高階特徵交叉。比如年輕男性喜歡玩射擊遊戲,就包括<年齡,性別,遊戲>3階特徵。最近幾年隨着深度學習的快速發展,工程師引入深度學習解決高階特徵交叉問題,並提出了一批算法,比如FNN,AFM,NFM,DeepCrossing以及Wide&Deep和DeepFM等,私以爲最後兩篇文章比較經典。

最早看這兩篇算法的時候,我的感覺是這兩個算法有什麼差別,不是一樣的嗎?最近重新細讀了一遍,才理解其中的不同。先來介紹一下Wide&Deep,模型結構如下圖所示。所謂Wide&Deep就是整個模型結構由wide部分和deep部分共同組成,圖中左邊是wide模型,一個邏輯迴歸,右邊是deep模型。假設輸入的都是類別特徵,deep模型的輸入是用one-hot表示的Sparse Features。比如,對手機型號這個特徵而言,市面上可能存在數千個手機型號,但是每個用戶只對應一個手機型號,那麼這個稀疏向量有幾千個維度,只有一個位置爲1,其餘位置爲0。將每個特徵以embedding表示,embedding是一個低維稠密向量。將高維稀疏特徵,映射到對應的embedding上去,將所有特徵的embedding水平拼接起來,生成圖中的Dense Embeddings,最後通過若干層神經網絡得到輸出。將wide和deep部分組合起來,就是圖中間的wide&deep模型。
在這裏插入圖片描述
公式化表達如下所示。其中,b表示偏置bias,a(l)a^{(l)}表示deep模型最後一層輸出,x表示原始的輸入特徵,注意還有一個ϕ(x)\phi(x),這個是原始特徵的特徵交叉。原文中提到wide&deep仍然需要做特徵工程實現特徵交叉,但是相比於原生的邏輯迴歸,只需要做少量的特徵交叉,大大減少了特徵工程的工作量,並且效果優於邏輯迴歸。原文對wide和deep模型的含義做了介紹,wide模型的特徵交叉部分主要負責記憶功能,記住樣本中出現過的特徵交叉。deep部分有泛化功能,學習特徵的embedding,泛化到那些未曾出現過的特徵交叉。

y^wide_deep=sigmoid(wwideT[x,ϕ(x)]+wdeepTa(l)+b)\hat y_{wide\_deep}=sigmoid ( w_{wide}^T \cdot [x, \phi(x)] + w_{deep} ^T\cdot a^{(l)} + b)

谷歌應用商店實際使用的模型結構如下圖所示。最右邊的Cross Product Transformation就是wide部分,是曝光app和用戶已安裝app的交叉特徵。剩下的就是deep部分,類別特徵都用embedding表示,維度是32。連續特徵包括年齡,安裝app數量等,經過預處理之後,和所有的embedding水平拼接在一起,作爲DNN的輸入,總維度是1200。值得一提的是,wide部分用帶L1正則化的FTRL優化,deep部分用AdaGrad做優化,兩個部分聯合訓練,驚歎還有這樣的騷操作。
在這裏插入圖片描述
再來介紹一下DeepFM,模型結構如下圖所示。黑色線表示帶有權重的連接,紅色線表示權重爲1的連接,藍色線表示one-hot映射到對應的embedding。圖中的Field表示一個特徵類別,比如手機型號是一個field,性別是一個field,地理位置是一個field。每個field用one-hot表示,構成最下面的Sparse Features。稀疏特徵有兩部分輸出,一部分是加權求和得到FM Layer中的第一個節點,另一部分索引對應的embedding得到Dense Embeddings。Dense Embeddings也有兩部分輸出,一部分是兩兩做點積輸出到FM Layer,另外一部分是拼接起來作爲Hidden Layer的輸入。
在這裏插入圖片描述

圖畫的比較複雜,直接看公式反而更簡單,公式在下面。也是兩部分組成,一部分是因子分解機FM,一部分是DNN,DNN和上面介紹的deep部分是相同的。需要注意的是,FM和DNN共享embedding。論文中做過試驗,將FM和DNN的embedding相互獨立,效果要差。關於DeepFM論文給出的物理意義是,FM部分負責一階特徵和二階交叉特徵,而DNN部分負責二階以上的高階特徵交叉。

yFM=&lt;w,x&gt;+ij&lt;vi,vj&gt;xixj+by_{FM}=&lt;w,x&gt; + \sum_i \sum_j &lt;v_i, v_j&gt; x_i x_j+b

y^DeepFM=sigmoid(yFM+YDNN)\hat y_{DeepFM}=sigmoid(y_{FM} + Y_{DNN})

論文中對DeepFM的超參做了調試,並基於他們給出的數據集給出了最優的超參:1)激活函數relu效果好於tanh,這與wide&deep的線上模型一致。2)每個隱層的unit在200到400之間效果最佳,相比wide&deep的unit數量要少一些。3)3層網絡效果最佳,這與wide&deep的隱層數量相同。4)在總的神經單元數量固定的情況下,constant結構效果最佳,constant表示每個隱層的unit數量相同;而wide&deep採用的是塔式結構,越往上unit數量越少。5)文中沒有說真實場景中embedding維度是多少,但是試驗中的embedding維度設置爲10,wide&deep中是32維,兩個都不大。

總結下wide&deep和DeepFM的異同:

1)兩者的DNN部分模型結構相同;

2)wide&deep需要做特徵工程,二階特徵交叉需要靠特徵工程來實現,通過wide部分發揮作用;

3)DeepFM完全不需要做特徵工程,直接輸入原始特徵即可,二階特徵交叉靠FM來實現,並且FM和DNN共享embedding;

4)從試驗結果來看DeepFM效果優於wide&deep。

文章的最後,提出一個我的疑問。前文中提到過field的定義,每一個特徵類別叫做field。有些field是單值的,即field裏邊只能出現一個值,不同值之間是互斥的,比如手機型號,性別,地理位置,這個可以用one-hot表示,只有一個位置是1。但是有些field是多值的,比如安裝app,用戶會安裝多個app,可以用multi-hot表示,多個位置爲1。那麼對於多值的field,這兩個算法是如何表達和處理的,兩篇文章都沒有提到。

在wide&deep中,不可能將所有app的embedding拼接在一起,因爲embedding維度是32,而輸入的拼接embedding的維度一共才1200,拼接不到40個app。有一種方式是將所有app的embedding求平均或者求和,但是文中完全沒有提到。而在DeepFM中,文章作者直接明確表示,每個field都是單值的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章