深度排序模型概述(一)Wide&Deep/xDeepFM


本文記錄幾個在廣告和推薦里面rank階段常用的模型。
廣告領域機器學習問題的輸入其實很大程度了影響了模型的選擇,因為輸入一般維度非常高,稀疏,同時包含連續性特征和離散型特征。模型即使到現在DeepFM類的方法,其實也都很簡單。模型的發展主要體現於對特征的充分挖掘上,比如利用低階和高階特征、嘗試自動學習交叉特征而非手動、嘗試更精准地實現高階特征(bounded-degree)。

廣告相關的領域最早大行其道的模型當屬LR模型,原因就是LR模型簡單,可解釋性好,拓展性高,精心細調之后模型效果也會非常好。人工特征工程的初期,加些交叉特征,無論是離線評估指標還是線上的業務指標都會很容易提高,當然大家都會很開心。吃掉容易收割的80%之后,基本上就到了瓶頸。這時候就會發現即使深挖業務場景貌似也找不到比較好的特征了,加了一堆特征搞不好效果還降了。繼續做得話,除了特征工程,還可以嘗試特征選擇,改進優化算法(比如加快收斂),在線學習之類的。
隨着業務的持續迭代,手動交叉特征被視為臟活累活,那肯定要想如何做自動交叉特征。這方面的工作同時也有進展。Rendle在2010年提出的FM模型。FM模型利用特征的隱向量做內積來實現特征的交叉。后續阮毓欽提出了Field-aware FM模型,一個特征對應多個隱向量,在criteo舉辦的ctr比賽上嶄露頭角。這些其實都已經算是ctr領域的常用套路。FM類模型由於復雜度的原因一般都只能實現二階交叉。所以不能利用高階交叉總會讓人感覺缺少點意思,畢竟很多場景高階交叉的確有意義。另外不得不提的特征組合的工作就是Facebook提出的gbdt+lr的方法,通過gbdt來實現監督式的特征組合。
淺層模型嘗試之后勢必要引入深層模型,畢竟深度學習很大作用就是作為特征表示學習。大廠引入肯定要更早一些,畢竟核心業務都要長時間持續投入人力進行模型優化。至於思路,我覺得可能跟現有市面上看到的模型差不多。一般多層感知機mlp認為可以實現特征高階交叉(high-order feature interactions)。
2016年出現wide&deep、fnn和pnn等工作。wide&deep算影響力比較大的工作了。wide部分是手動特征交叉(負責memorization),deep部分利用mlp來實現高階特征交叉(負責generalization),wide部分和deep部分joint train。fnn比較暴力,直接使用預訓練的fm隱向量傳給mlp。PNN則是先做特征交叉然后給mlp處理。fnn和pnn這兩種方法的缺點就是忽視了低階特征交叉。
2017年出現DeepFM、Deep&Cross和NFM等工作。DeepFM模型和Deep&Cross(包含下面要介紹的xDeepFM)都可以認為是Wide&Deep架構輸入和wide部分進行改進。DeepFM和之前模型相比優勢在於兩點,一個是相對於Wide&Deep不再需要手工構建wide部分,另一個相對於FNN把FM的隱向量參數直接作為網絡參數學習。DeepFM將embedding層結果輸入給FM和MLP,兩者輸出疊加,達到捕捉了低階和高階特征交叉的目的。Deep&Cross和DeepFM類似,cross network模塊可以實現bounded-degree feature interactions。
總結來說,涌現了這么模型,到底哪個好,我覺得很難一錘定音。每個模型都有存在的價值和合適的應用場景。有時候也不一定非得效果提示才行,有時候效果沒提升但是可以大大減少特征工程的工作也算有收益。根據實際的場景、業務需求和迭代階段選擇合適的模型,花費合理的成本,取得最大的業務價值才是最重要的。

深度排序模型的結構可以分為兩種,一種是並行結構,分別做低階和高階特征組合;一種是串行結構,如PNN、NFM、AFM等。這也構成了深度排序模型的兩條演進路線,如何更有效地捕獲特征組合是核心,沿着以下兩個演進路線發展:
一:更有效地捕獲二階特征:
Wide&Deep -> DeepFM -> NeuralFFM -> DeepFFM
二、顯式建模2階/3階/4階...K階特征組合:
DeepCross -> xDeepFM

Wide&Deep

Wide&Deep 模型的核心思想是結合線性模型的記憶能力(memorization)和 DNN 模型的泛化能力(generalization),在訓練過程中同時優化 2 個模型的參數,從而達到整體模型的預測能力最優。
記憶(memorization)即從歷史數據中發現item或者特征之間的相關性。
泛化(generalization)即相關性的傳遞,發現在歷史數據中很少或者沒有出現的新的特征組合。

網絡結構

Wide&Deep網絡結構

可以認為:Wide&Deep = LR + DNN

  • Wide部分
    實際上,Wide模型就是一個廣義線性模型:

\[y = w^T x + b \]

最終在y的基礎上增加\(Sigmoid\)函數作為最終的輸出。

  • Deep部分
    實際上,Deep模型是一個前饋神經網絡。深度神經網絡模型通常需要的輸入是連續的稠密特征,對於稀疏,高維的類別特征,通常首先將其轉換為低維的向量,這個過程也稱為embedding。

在訓練的時候,首先隨機初始化embedding向量,並在模型的訓練過程中逐漸修改該向量的值,即將向量作為參數參與模型的訓練。

  • Wide & Deep模型的聯合訓練(joint training)
    聯合訓練是指同時訓練Wide模型和Deep模型,並將兩個模型的結果的加權和作為最終的預測結果:

\[P(Y=1|x) = \sigma (w_{wide}^T [x,\Phi(x)] + w_{deep}^T a^{a(l_f)} + b ) \]

訓練的方法:

  • Wide模型:FTRL(Follow-the-regularized-leader)
  • Deep模型:AdaGrad

在推薦的場景中,最重要的行為數據是點擊(下載/購買)數據,傳統的Wide類型的特征可以對確定性的推薦很好的建模, 如果考慮到多樣性,就需要對稀疏數據和"沒有直接觀測到"的行為數據建模。deep部分可以對多階的行為傳導更好的表達。
值得注意的是,最后一層中Deep和Wide部分是如何合並到一起的. 文中的做法是將Wide部分的特征和Deep部分的最后一層的特征對齊,然后統一送入到一個邏輯回歸模型中。

應用

對於推薦系統,其最一般的結構如下圖所示:

Wide&Deep推薦系統
當一個用戶訪問app商店時,此時會產生一個請求,請求到達推薦系統后,推薦系統為該用戶返回推薦的apps列表。

在實際的推薦系統中,通常將推薦的過程分為兩個部分,即上圖中的Retrieval和Ranking,Retrieval負責從數據庫中檢索出與用戶相關的一些apps,Ranking負責對這些檢索出的apps打分,最終,按照分數的高低返回相應的列表給用戶。

Deep & Cross Network(DCN)

對比同樣來自 google 的工作 Wide & Deep ,DCN 不需要特征工程來獲得高階的交叉特征,對比 FM 系列的模型,DCN 擁有更高的計算效率並且能夠提取到更高階的交叉特征。

DCN

從網絡結構上面來看,該模型是非常簡單明了的,特征分為類別型與數值型,類別型特征經過 embedding 之后與數值型特征直接拼接作為模型的輸入。所有的特征分別經過 cross 和 deep 網絡,如果把這兩個網絡看作特征提取的話,經過提取后的特征向量拼接之后是常規的二分類,如果訓練數據是曝光和點擊,最后輸出的就可以看作點擊率了。

  • 離散特征嵌入
    離散特征嵌入這個想法最初來自於 Mikolov 的 word2vec 系列文章。最初解決的問題是詞的獨熱表示過於稀疏,並且不同詞之間的向量形式表示完全沒有聯系。具體思路在此不贅述,最終的實現是將一個上萬維的詞獨熱表示嵌入到了只有幾百維的稠密向量中。而嵌入的本質其實是構建一張隨機初始化的向量查找表,通過我們的訓練目標做有監督學習來得到不同詞在特定目標下,處於向量空間中的位置。
    將詞嵌入的思路推廣到其它的離散特征處理中,我們可以用同樣的方法將各種類別特征如“用戶性別”、“城市”、“日期”嵌入到稠密的向量空間中。經過這樣處理之后,自然就解決了原本 FM 遇到的特征稀疏問題。

  • 高階交叉特征
    在廣告場景下,特征交叉的組合與點擊率是有顯著相關的,例如,“USA”與“Thanksgiving”、“China”與“Chinese New Year”這樣的關聯特征,對用戶的點擊有着正向的影響。
    而本文開發了一個新的算子,來得到交叉特征:
    DCN
    即,

\[x_{l+1} = x_0 x_l^T w_l + b_l + x_l = f(x_l,w_l,b_l)+x_l \]

考慮 \(x₀\) 為輸入的特征及第一層的輸入,\(x\) 為 第 \(L\) 層的輸入,我們可以看到它的基本思路還是用矩陣乘法來實現特征的組合。

這是個遞推形式算子,所以使用它很容易能得到高於二階的交叉特征;並且該模型還用了殘差的思想,解決網絡性能退化的問題;此公式還有一個小的優化技巧,三矩陣相乘那個算子,用乘法結合律先計算后面兩個矩陣的積,這樣可以減少三分之一的計算復雜度。

DCN和同場景模型對比

在deepFM中, 進行了離散特征嵌入的操作,並且還將嵌入前的離散特征加入到了 FM 層;所以該網絡可以看作是傳統的 FM 、離散特征嵌入之后的 FM 和基本 DNN 三個模型融合的結果。
wide & deep 的思路中,deep 部分的做法和 deepFM 是大相徑庭的,關鍵的 wide 部分其實是離線的特征工程,根據業務場景提前完成了特征交叉等處理,該模型可以看作是 DNN 與離線特征模型的融合結果。
而從 DCN 的網絡中我們可以發現,deep 部分網絡除了使用離散嵌入特征外,還拼接了數值型特征;cross 部分網絡直接完成了特征組合,對比 FM 層它可以學到更高階的組合特征,對比 wide 網絡它不需要做線下的特征工程。

xDeepFm

傳統的推薦系統中,挖掘交叉特征主要依靠人工提取,這種做法主要有以下三種缺點:
1)重要的特征都是與應用場景息息相關的,針對每一種應用場景,工程師們都需要首先花費大量時間和精力深入了解數據的規律之后才能設計、提取出高效的高階交叉特征,因此人力成本高昂;
2)原始數據中往往包含大量稀疏的特征,例如用戶和物品的ID,交叉特征的維度空間是原始特征維度的乘積,因此很容易帶來維度災難的問題;
3)人工提取的交叉特征無法泛化到未曾在訓練樣本中出現過的模式中。
因此自動學習特征間的交互關系是十分有意義的。目前大部分相關的研究工作是基於因子分解機的框架,利用多層全連接神經網絡去自動學習特征間的高階交互關系。
xDeepFM主要是針對DeepFM和DCN的改進。例如FNN、PNN和DeepFM,其缺點是模型學習出的是隱式的交互特征,其形式是未知的、不可控的;同時它們的特征交互是發生在元素級(bit-wise)而不是特征向量之間(vector-wise),這一點違背了因子分解機的初衷。DCN模型,旨在顯式(explicitly)地學習高階特征交互,其優點是模型非常輕巧高效,但缺點是最終模型的表現形式是一種很特殊的向量擴張,同時特征交互依舊是發生在元素級上。

  • bit-wise VS vector-wise
    假設隱向量的維度為3維,如果兩個特征(對應的向量分別為(a1,b1,c1)和(a2,b2,c2)的話)在進行交互時,交互的形式類似於 $ f(w1 \ast a1 \ast a2,w2 \ast b1 \ast b2 ,w3 \ast c1 \ast c2) $ 的話,此時我們認為特征交互是發生在元素級(bit-wise)上。如果特征交互形式類似於 \(f(w \ast (a1 \ast a2 ,b1 \ast b2,c1 \ast c2))\)的話,那么我們認為特征交互是發生在特征向量級(vector-wise)。
  • explicitly VS implicitly
    顯式的特征交互和隱式的特征交互。以兩個特征為例\(x_i\)\(x_j\),在經過一系列變換后,我們可以表示成 \(w_{ij} \ast (x_i \ast x_j)\) 的形式,就可以認為是顯式特征交互,否則的話,是隱式的特征交互。

為了實現自動學習顯式的高階特征交互,同時使得交互發生在向量級上,xDeepFm提出了一種新的名為壓縮交互網絡(Compressed Interaction Network,簡稱CIN)的神經模型。在CIN中,隱向量是一個單元對象,因此我們將輸入的原特征和神經網絡中的隱層都分別組織成一個矩陣,記為X0和Xk。CIN中每一層的神經元都是根據前一層的隱層以及原特征向量推算而來,其計算公式如下:

\[X_{h,\ast}^k = \sum_{i=1}^{H_{k-1}}\sum_{j=1}^m{W_{ij}^{k,h}(X_{i,\ast}^{k-1} \cdot X_{j,\ast}^0)} \]

其中點乘的部分計算如下:

\[<a_1,a_2,a_3>\cdot<b_1,b_2,b_3>=<a_1b_1,a_2b_2,a_3b_3> \]

第k層隱層含有\(H_k\)條神經元向量。隱層的計算可以分成兩個步驟:(1)根據前一層隱層的狀態Xk和原特征矩陣X0,計算出一個中間結果\(Z^{k+1}\),它是一個三維的張量,如下圖所示:

CIN1

CIN的宏觀框架可以總結為下圖:

在這個中間結果上,我們用\(H^{k+1}\)個尺寸為\(m \ast H_k\)的卷積核生成下一層隱層的狀態,該過程如圖2所示。這一操作與計算機視覺中最流行的卷積神經網絡大體是一致的,唯一的區別在於卷積核的設計。CIN中一個神經元相關的接受域是垂直於特征維度D的整個平面,而CNN中的接受域是當前神經元周圍的局部小范圍區域,因此CIN中經過卷積操作得到的特征圖(Feature Map)是一個向量,而不是一個矩陣。
CIN2
CIN3

CIN的宏觀框架可以總結為下圖:
CIN宏觀框架

可以看出,它的特點是,最終學習出的特征交互的階數是由網絡的層數決定的,每一層隱層都通過一個池化操作連接到輸出層,從而保證了輸出單元可以見到不同階數的特征交互模式。同時不難看出,CIN的結構與循環神經網絡RNN是很類似的,即每一層的狀態是由前一層隱層的值與一個額外的輸入數據計算所得。不同的是,CIN中不同層的參數是不一樣的,而在RNN中是相同的;RNN中每次額外的輸入數據是不一樣的,而CIN中額外的輸入數據是固定的,始終是\(X^0\)
可以看到,CIN是通過(vector-wise)來學習特征之間的交互的,還有一個問題,就是它為什么是顯式的進行學習?我們先從\(X^1\)來開始看,\(X^1\)的第\(h\)個神經元向量可以表示成:

\[X_{h}^1 = \sum_{i \in [m] \ \ j \in [m]} W_{i,j}^{1,h}(X_{i}^{0} \cdot X_{j}^0) \]

進一步,\(X^2\)的第\(h\)個神經元向量可以表示成:

\[X_{h}^k = \sum_{i \in [m] \ \ j \in [m]} W_{i,j}^{k,h}(X_{i}^{k-1} \cdot X_{j}^0) \\ = \sum_{i \in [m] \ \ j \in [m]} ... \sum_{r \in [m] \ \ t \in [m]} \sum_{l \in [m] \ \ s \in [m]} W_{i,j}^{k,h} ... W_{l,s}^{1,r}(x_{j}^{0} \cdot ... \cdot x_{s}^0 \cdot x_{l}^0) \]

因此,我們能夠通過上面的式子對特征交互的形式進行一個很好的表示,它是顯式的學習特征交叉。

將CIN與線性回歸單元、全連接神經網絡單元組合在一起,得到最終的模型並命名為極深因子分解機xDeepFM,其結構如下圖:
xDeepFM
集成的CIN和DNN兩個模塊能夠幫助模型同時以顯式和隱式的方式學習高階的特征交互,而集成的線性模塊和深度神經模塊也讓模型兼具記憶與泛化的學習能力。值得一提的是,為了提高模型的通用性,xDeepFM中不同的模塊共享相同的輸入數據。而在具體的應用場景下,不同的模塊也可以接入各自不同的輸入數據,例如,線性模塊中依舊可以接入很多根據先驗知識提取的交叉特征來提高記憶能力,而在CIN或者DNN中,為了減少模型的計算復雜度,可以只導入一部分稀疏的特征子集。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM