CTR 模型之 Deep Cross (DCN) 与 xDeepFM 解读
CTR 系列文章:
本篇文章講解 CTR 經典模型 Deep & Cross (DCN) 與 xDeepFM,之所以把這兩個模型放一起講是因為它們有很近的“血緣關系”。理解了 DCN 的思想,再去理解 xDeepFM 就不覺得困難了。
以下文章對這兩個模型的講解很到位:
首先了解揭秘 Deep & Cross : 如何自動構造高階交叉特征
推薦系統遇上深度學習(二十二)–DeepFM升級版XDeepFM模型強勢來襲!
xDeepFM:名副其實的 ”Deep” Factorization Machine
因此,本文主要是對上述文章內容的梳理。
Deep & Cross (DCN)
首先來看看網絡結構:
首先來看看網絡的輸入部分。元素特征需要做如下處理:
對sparse特征進行embedding,對于multi-hot的sparse特征,embedding之后再做一個簡單的average pooling;
對dense特征歸一化,然后和embedding特征拼接,作為隨后Cross層與Deep層的共同輸入:
x0=[xembed,1T,xembed,2T,...xembed,kT,xdenseT]Tx_0 = [x^T_{embed, 1},x^T_{embed, 2},...x^T_{embed, k},x^T_{dense}]^T x0?=[xembed,1T?,xembed,2T?,...xembed,kT?,xdenseT?]T
接下來看看 Cross 部分。
上圖中模型的左半部分是包含了許多層的 Cross network,目標是以顯式、可控、高效的方式自動構建有限高階交叉特征。其中第 l+1l + 1l+1 層的計算過程為:
xl+1=f(xl,wl,bl)+xl=x0xlTwl+bl+xlx_{l+1} = f(x_l, w_l, b_l)+x_l =x_0x^T_lw_l + b_l + x_l xl+1?=f(xl?,wl?,bl?)+xl?=x0?xlT?wl?+bl?+xl?
其中,xl+1,xl,x0x_{l+1}, x_l, x_0xl+1?,xl?,x0? 是 d 維向量。計算過程有兩個特點:
為什么這么設計呢?先看一些計算的例子:
假設 Cross 網絡有兩層,x0=[x0,1x0,2]Tx_0 = [x_{0, 1} x_{0, 2}]^Tx0?=[x0,1?x0,2?]T,為方便討論令 bi=0b_i = 0bi?=0,則有:
x1=x0x0Tw0+x0=[x0,1x0,2][x0,1,x0,2][w0,1w0,2]+[x0,1x0,2]=[w0,1x0,12+w0,2x0,1x0,2+x0,1w0,1x0,2x0,1+w0,2x0,22+x0,2]\begin{aligned} \boldsymbol{x}_{1} &=\boldsymbol{x}_{0} \boldsymbol{x}_{0}^{T} \boldsymbol{w}_{0}+\boldsymbol{x}_{0}=\left[\begin{array}{c} x_{0,1} \\ x_{0,2} \end{array}\right]\left[x_{0,1}, x_{0,2}\right]\left[\begin{array}{c} w_{0,1} \\ w_{0,2} \end{array}\right]+\left[\begin{array}{c} x_{0,1} \\ x_{0,2} \end{array}\right]=\left[\begin{array}{c} w_{0,1} x_{0,1}^{2}+w_{0,2} x_{0,1} x_{0,2}+x_{0,1} \\ w_{0,1} x_{0,2} x_{0,1}+w_{0,2} x_{0,2}^{2}+x_{0,2} \end{array}\right] \\ \end{aligned} x1??=x0?x0T?w0?+x0?=[x0,1?x0,2??][x0,1?,x0,2?][w0,1?w0,2??]+[x0,1?x0,2??]=[w0,1?x0,12?+w0,2?x0,1?x0,2?+x0,1?w0,1?x0,2?x0,1?+w0,2?x0,22?+x0,2??]?
進而有:
x2=x0x1Tw1+x1=[w1,1x0,1x1,1+w1,2x0,1x1,2+x1,1w1,1x0.2x1,1+w1,2x0,2x1,2+x1,2]=[w0,1w1,1z0,13+(w0,2w1,1+w0,1w1,2)x0,12x0,2+w0,2w1,2x0,1x0,22+(w0,1+w1,1)x0,12+(w?0,2+w1,2)x0,1z0,2+x0,1???????]\begin{aligned} x_{2}=& x_{0} x_{1}^{T} w_{1}+x_{1} \\ =&\left[\begin{array}{c} w_{1,1} x_{0,1} x_{1,1}+w_{1,2} x_{0,1} x_{1,2}+x_{1,1} \\ w_{1,1} x_{0.2} x_{1,1}+w_{1,2} x_{0,2} x_{1,2}+x_{1,2} \\ \end{array}\right] \\ =& \left[\begin{array}{c} {w_{0,1} w_{1,1} z_{0,1}^{3}+\left(w_{0,2} w_{1,1}+w_{0,1} w_{1,2}\right) x_{0,1}^{2} x_{0,2}+w_{0,2} w_{1,2} x_{0,1} x_{0,2}^{2}+\left(w_{0,1}+w_{1,1}\right) x_{0,1}^{2}+\left(\operatorname{w}_{0,2}+w_{1,2}\right) x_{0,1} z_{0,2}+x_{0,1}} \\ \cdot \cdot \cdot \cdot \cdot \cdot \cdot \end{array}\right] \end{aligned} x2?===?x0?x1T?w1?+x1?[w1,1?x0,1?x1,1?+w1,2?x0,1?x1,2?+x1,1?w1,1?x0.2?x1,1?+w1,2?x0,2?x1,2?+x1,2??][w0,1?w1,1?z0,13?+(w0,2?w1,1?+w0,1?w1,2?)x0,12?x0,2?+w0,2?w1,2?x0,1?x0,22?+(w0,1?+w1,1?)x0,12?+(w0,2?+w1,2?)x0,1?z0,2?+x0,1?????????]?
可以看到 x1x_1x1? 包含了從一階到二階所有的可能交叉組合,而 x2x_2x2? 包含了從一階到三階的所有可能交叉組合,并且有下面的特點:
這里對第三點加以解釋:如果每個交叉特征有獨立的參數,那么當訓練樣本中某個交叉特征 xixjx_i x_jxi?xj? 沒有出現,那么此交叉特征的權重參數就是 0 。而參數共享的情況下,權重幾乎不可能是 0,并且對于一些噪聲數據也可以由大部分正常樣本來糾正參數的學習。
要注意的是,輸入的 x0x_0x0? 是在 embedding 之后得到的,后續的交叉也是對 embedding 后的數值進行交叉。直接將 sparse 特征輸入網絡進行交叉才是最合理的做法,但是這么做的話參數過多,所以先進行一次 embedding 操作,這實際上也是一種 trade-off。
其他的 DNN 部分和輸出的部分都比較好理解,這里就不多做敘述了。
xDeepFM
我第一次看到 xDeepFM 以為是 DeepFM 的改進版本,后來才發現他更像是在 DCN 的基礎上改進的。
在正式講解之前,先了解下什么是 bit-wise 什么是vector-wise:
假設隱向量的維度為3維,如果兩個特征(對應的向量分別為(a1,b1,c1)和(a2,b2,c2)的話)在進行交互時,交互的形式類似于f(w1 * a1 * a2,w2 * b1 * b2 ,w3 * c1 * c2)的話,此時我們認為特征交互是發生在元素級(bit-wise)上。如果特征交互形式類似于 f(w * (a1 * a2 ,b1 * b2,c1 * c2))的話,那么我們認為特征交互是發生在特征向量級(vector-wise)。
對于包括 DCN 在內的許多模型在構造交叉特征時,都是以 bit-wise 的方式進行特征組合,而FM是以向量為最細粒度學習相關性,即vector-wise。xDeepFM的動機,正是將 FM 的 vector-wise 思想引入Cross部分。
下圖是 xDeepFM 的整體結構:
模型的輸入部分與 DCN 類似,本節重點講解 CIN 部分,如下圖所示:
CIN 的輸入來自 embedding 層,假設有 m 個 field,每個 field 的 embedding 維度為 D ,則輸入可以表示為矩陣 X0∈Rm?DX^0 \in \mathbb R^{m * D}X0∈Rm?D。
CIN 內部有 k 層,每一層都會輸出一個矩陣 Xk∈RHk?DX^k \in \mathbb R^{H_k * D}Xk∈RHk??D ,k 表示第 k 層的輸出, HkH_kHk? 表示第 k 層有 HkH_kHk? 個維度為 D 的向量。要得到 XkX^{k}Xk ,需要接收兩個矩陣作為輸入,一個是 Xk?1X^{k-1}Xk?1 ,另一個是 X0X^0X0 ,具體的計算公式如下:
Xh,?k=∑i=1Hk?1∑j=1mWijk,h(Xi,?k?1°Xj,?0)∈R1?D,where?1≤h≤Hk\boldsymbol{X}_{h, *}^{k}=\sum_{i=1}^{H_{k-1}} \sum_{j=1}^{m} \boldsymbol{W}_{i j}^{k, h}\left(\boldsymbol{X}_{i, *}^{k-1} \circ \boldsymbol{X}_{j, *}^{0}\right) \in \mathbb{R}^{1 * D}, \quad \text { where } 1 \leq h \leq H_{k} Xh,?k?=i=1∑Hk?1??j=1∑m?Wijk,h?(Xi,?k?1?°Xj,?0?)∈R1?D,?where?1≤h≤Hk?
其中 Wk,h∈RHk?1?mW^{k, h} \in \mathbb R^{H_{k-1} * m}Wk,h∈RHk?1??m,表示要得到第 k 層第 h 個向量所需要的權重矩陣, Hk?1H_{k-1}Hk?1? 表示第 k?1k-1k?1 層的輸出矩陣 Xk?1X^{k-1}Xk?1 由 Hk?1H_{k-1}Hk?1? 個維度為 D 的向量組成。°\circ° 表示Hadamard乘積,即逐元素乘,例如:
<a1,b1,c1>°<a2,b2,c2>=<a1b1,a2b2,a3b3><a_1, b_1, c_1> \circ <a_2, b_2, c_2> = <a_1b_1, a_2b_2, a_3b_3> <a1?,b1?,c1?>°<a2?,b2?,c2?>=<a1?b1?,a2?b2?,a3?b3?>
式子中 Xi,?k?1°Xj,?0\boldsymbol{X}_{i, *}^{k-1} \circ \boldsymbol{X}_{j, *}^{0}Xi,?k?1?°Xj,?0? 是表示取出 Xk?1X^{k-1}Xk?1 的第 iii 個向量與輸入層 X0X^{0}X0 中第 jjj 個向量進行 Hadamard 乘積運算。整個公式的計算過程可以用下圖表示:
上面的公式的計算結果只得到了第 h 個向量 Xh,?k\boldsymbol{X}_{h, *}^{k}Xh,?k? ,實際上我們會使用 HkH_kHk? 個不同的權重矩陣 Wk,hW^{k,h}Wk,h 來獲得不同的向量,最后這些向量拼接成輸出 Xk∈RHk?DX^{k} \in \mathbb R^{H_k * D}Xk∈RHk??D 。
需要注意的是,在第 lll 層實際上只包含了第 l+1l+1l+1 階的交叉特征,為了得到不同階的輸出,需要在每一層得到計算結果后通過 sum pooling 進行輸出。至于一階特征,則單獨由模型的結構圖最左側的 Linear 模塊進行加權求和。最右側的 DNN 模塊比較好理解,就不做解釋了。
從計算過程就可以看出此模型的復雜度比較高,需要的參數也比較多,因此訓練的時候可能出現過擬合現象,為此可以配合 Droupout 或者其他防止過擬合的方法使用。
總結
以上是生活随笔為你收集整理的CTR 模型之 Deep Cross (DCN) 与 xDeepFM 解读的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学生网上选课管理系统_选课管理系统
- 下一篇: 【CTR模型】TensorFlow2.0