Wide&Deep versus DeepFM

最近在回顧一下深度學習在推薦系統上的應用,重點回顧了兩個比較著名的模型:Wide&Deep 和 DeepFM。剛好前者是谷歌研究員提出的,後者是有三位作者來自華爲,又剛好最近這兩家公司的話題性這麼強……emmmmm

推薦系統

推薦系統的一般架構如下,主要包括兩部分的算法:

圖一 推薦系統一般架構

其一是用戶query進來的時候需要對其進行粗過濾,即圖中retrieval部分,這個步驟的目的在於過濾不相關的信息,或者去除過時的內容等,可以通過一些機器學習算法或者人工制定的規則實現,這個步驟將過濾掉大部分的item,僅剩下一個相對較小的候選集(例如100條);其二是圖中的ranking部分,即精排序過程,這個步驟將retrieval出來的候選集按用戶感興趣的程度或者query相關性進行排序,目的是將最適合的item放在前面。而CTR預測一般就是最終排序的步驟。

Wide&Deep

推薦系統面臨的一個重要挑戰是對memorizationgenerization的均衡,這個關係跟強化學習中的探索利用的權衡關係很類似。打個比方,比如一個新聞app,我經常在新聞app看NBA新聞,那毫無疑問需要給我推薦更多NBA或者球星之類的方向上高度相關新聞,這是memorization。但只給我推薦籃球新聞會造成用戶體驗很差,所以需要給我推薦一些別的我可能喜歡的資訊,這就是generization。

Memorization很好解決,例如傳統的基於內容的協同過濾就能很棒的解決這個問題,因爲在歷史訓練數據中這些模式很明顯,很容易挖掘。但generization並不好處理,因爲這些推薦內容的相關性相當隱蔽(例如啤酒尿布這個經典案例),甚至與用戶目前的一些特徵上很少共現,但generization又很重要,它可以拓寬推薦內容的多樣性。

出於易用性、可伸縮性和可解析性,工業上的在線推薦和排序系統廣泛採用邏輯迴歸之類的廣義線性模型,而這些模型通常是使用one-hot編碼後的二值化特徵來訓練的。Memorization的實現可以通過特徵之間交叉相乘(在二值特徵中即相當於二次多項式)得到,而generization可以通過使用粗粒度的特徵的交叉相乘來完成。但這種做法的一個天然限制就是對於很少共現的內容很難泛化,試想一下,某兩個item的交叉相乘項在大部分用戶上基本上都爲0,那麼這個特徵的重要度是十分有限的。

Wide&Deep,顧名思義就是由wide和deep兩部分組成:wide部分採用LR負責memorization的學習deep部分採用embedding+DNN負責generization的學習。網絡結構圖如下

圖二 Wide&Deep網絡結構

Wide部分

Wide部分其實就是多項式迴歸,輸入特徵是one-one編碼並交叉乘積後的二值化特徵,假設xRdx\in{R^d}
f(x)=w0+i=1dwixi+j[1,d],k>jvj,kxjxkf(x) = w_0+\sum_{i=1}^{d}w_{i}*x_{i}+\sum_{j\in{[1,d]},k>{j}}v_{j,k}*x_j*x_k

Deep部分

Deep部分是傳統的前饋神經網絡,對於定類特徵,會先對其進行嵌入操作,即對每個類別特徵嵌入到低維的稠密向量。

Wide&Deep

Wide部分和Deep部分加權彙總再經過一個sigmoid激活函數得到最後的預測值
P(yx)=σ(wwideT[x,ϕ(x)]+wdeepTalf+b)P(y|x)=\sigma(w_{wide}^{T}[x,\phi(x)]+w_{deep}^{T}a^{lf}+b)

式中,σ\sigma是sigmoid函數,wwidew_{wide}代表wide部分的模型權值,wdeepw_{deep}代表deep部分最後一層輸出要乘上的權值,bb是偏置值。換句話而言,Wide&Deep這個模型本質上是一個邏輯迴歸,它的輸入特徵由兩部分組成而已,又或者,可以看成是一個有交叉乘積特徵輔助決策的DNN。

Wide&Deep的訓練策略是聯合訓練(joint training),作者特意強調了聯合訓練和集成學習的區別:

  • 聯合訓練是將各個部分按一個權值加權彙總得到一個預測結果,並在訓練的時候根據同一個誤差信號一起更新權值
  • 集成學習是各個基模型獨立地訓練,它們之間互不干擾,可以自己獨立完成自己的訓練,只是最終的結果也是彙總或者投票產生

模型結構

圖三 Wide&Deep網絡結構

Wide部分由已安裝的app和曝光的app等特徵的交叉乘積組成,Deep部分每個類別特徵都映射到32維的向量,然後把連續型特徵和嵌入特徵拼接起來,用三層DNN來計算。

DeepFM

Wide&Deep模型雖然綜合了generization和memorization,但依然沒有避免一定的特徵工程。DeepFM是Wide&Deep的改進版本,FM(Factorization Machine)作爲Wide部分(這部分paper稱爲FM部分),DNN作爲Deep部分。而DeepFM是end-to-end的,也就是它只需要把原始特徵丟進去訓練得到點擊概率值就可以了,Wide部分也不需要額外的特徵工程。抽象來說,總體結構還是跟Wide&Deep挺像的。
y^=sigmoid(yFM+yDNN)\hat{y} = sigmoid(y_{FM}+y_{DNN})

FM

跟Wide部分一樣,FM部分也是用來學習特徵交互信息的。在之前談及的Wide部分有個比較尷尬的情況,本來one-hot編碼之後出來的特徵向量已經足夠稀疏了,再交叉乘積轉換一下出來的特徵會更加稀疏(要xix_ixjx_j同時爲1時)。FM模型在處理特徵交互信息上則更爲先進:每個類別特徵xix_i都嵌入到一個低維的稠密向量viv_i特徵交互就變成了兩個稠密向量viv_ivjv_j之間的內積,這樣就避免了交互特徵過於稀疏的尷尬,而且內積也可以很好的衡量兩個特徵向量之間的關聯度,這一個特性從餘弦夾角公式就可以看出來。
yFM=<w,x>+j1=1dj2=j1+1d<vi,vj>xixjy_{FM}= <{w,x}>+\sum_{j_1=1}^{d}\sum_{j_2=j_1+1}^{d}{<{v_i,v_j}>x_{i}\cdot{x_{j}}}

其中,wRdw\in{R^d}vRkv\in{R^k}<..>\lt..\gt代表內積。

圖四 FM部分結構

Deep

DeepFM的Deep部分其實跟Wide&Deep的Deep部分沒有太大的區別,唯一的區別在於,在DeepFM原始特徵會被同時用於Deep和FM兩部分,也就是特徵是共享(shared)的,而Wide&Deep中並不如此。而FM中用來學習交互信息的嵌入特徵向量也會作爲Deep中的嵌入向量,這麼一來,在迭代優化這個網絡的時候,這部分的嵌入特徵會在兩部分同時得到誤差反饋信號而更新,而在Wide&Deep中,這部分的信號只來自於Wide部分的加權誤差。

圖五 Deep部分結構

模型結構

圖六 DeepFM模型結構

DeepFM可以說是Wide&Deep的改進版,但是更好的學習了低階和高階特徵,也避免了特徵交互的稀疏性並且直接用端對端的方式實現模型訓練,不需要任何額外的特徵工程。

參考資料

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