日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CTR 模型之 Deep Cross (DCN) 与 xDeepFM 解读

發布時間:2023/12/19 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CTR 模型之 Deep Cross (DCN) 与 xDeepFM 解读 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

CTR 系列文章:

  • 廣告點擊率(CTR)預測經典模型 GBDT + LR 理解與實踐(附數據 + 代碼)
  • CTR經典模型串講:FM / FFM / 雙線性 FFM 相關推導與理解
  • CTR深度學習模型之 DeepFM 模型解讀
  • 【CTR模型】TensorFlow2.0 的 DeepFM 實現與實戰(附代碼+數據)
  • CTR 模型之 Deep & Cross (DCN) 與 xDeepFM 解讀
  • 【CTR模型】TensorFlow2.0 的 DCN(Deep & Cross Network) 實現與實戰(附代碼+數據)
  • 【CTR模型】TensorFlow2.0 的 xDeepFM 實現與實戰(附代碼+數據)
  • 本篇文章講解 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 維向量。計算過程有兩個特點:

  • 輸出神經元個數與輸入網絡的 x0x_0x0? 維度相同;
  • 每一層的 fff 都是在擬合 xl+1?xlx_{l+1} - x_lxl+1??xl? 的殘差,這樣可以減緩梯度消失問題,使得網絡更深。
  • 為什么這么設計呢?先看一些計算的例子:

    假設 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? 包含了從一階到三階的所有可能交叉組合,并且有下面的特點:

  • 有限高階:交叉的階數由層數決定,深度 LcL_cLc? 具最高有 Lc+1L_c + 1Lc?+1 階的交叉特征;
  • 參數線性增長:模型參數數量與輸入維度成線性增長關系:2×d×Lc2\times d \times L_c2×d×Lc?
  • 參數共享:并不是每個交叉組合都具有獨立的權重參數,而是共享了 2×d×Lc2\times d \times L_c2×d×Lc? 個權重參數。參數共享機制使得模型具有更強的泛化性和魯棒性。
  • 這里對第三點加以解釋:如果每個交叉特征有獨立的參數,那么當訓練樣本中某個交叉特征 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}X0Rm?D

    CIN 內部有 k 層,每一層都會輸出一個矩陣 Xk∈RHk?DX^k \in \mathbb R^{H_k * D}XkRHk??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=1Hk?1??j=1m?Wijk,h?(Xi,?k?1?°Xj,?0?)R1?D,?where?1hHk?
    其中 Wk,h∈RHk?1?mW^{k, h} \in \mathbb R^{H_{k-1} * m}Wk,hRHk?1??m,表示要得到第 k 層第 h 個向量所需要的權重矩陣, Hk?1H_{k-1}Hk?1? 表示第 k?1k-1k?1 層的輸出矩陣 Xk?1X^{k-1}Xk?1Hk?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}XkRHk??D

    需要注意的是,在第 lll 層實際上只包含了第 l+1l+1l+1 階的交叉特征,為了得到不同階的輸出,需要在每一層得到計算結果后通過 sum pooling 進行輸出。至于一階特征,則單獨由模型的結構圖最左側的 Linear 模塊進行加權求和。最右側的 DNN 模塊比較好理解,就不做解釋了。

    從計算過程就可以看出此模型的復雜度比較高,需要的參數也比較多,因此訓練的時候可能出現過擬合現象,為此可以配合 Droupout 或者其他防止過擬合的方法使用。

    總結

    以上是生活随笔為你收集整理的CTR 模型之 Deep Cross (DCN) 与 xDeepFM 解读的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。