DCN模型是組合了顯式和隱式特徵交叉的一個模型。如果瞭解WD模型的話,簡單的說這篇文章就是把WD模型的wide側改成了cross網絡,用來顯式的做一些特徵的交叉,因爲DNN雖然有着擬合任意模型的能力,但是世界上沒有免費的午餐,所以顯式的定義特徵交叉還是很有必要的。
論文下載地址:https://arxiv.org/pdf/1708.05123.pdf
這裏我對一些常用的ctr預估模型進行了復現,其中也包括了DCN模型,可以參考一些:https://github.com/Shicoder/Deep_Rec/blob/master/Deep_Rank
1.模型結構
結構圖如下所示:
2.模型輸入
我們從下到上,先看模型的輸入,如下所示
這個也是推薦領域常見的輸入方式,將實值類的特徵stack起來,稀疏的類別特徵做embedding。然後整體concat起來作爲模型的輸入。
3.模型核心結構
再往上走一步
先看右邊的模型,就是一個正常的全連接網絡。
關鍵的是左邊的cross 網絡。
如果直接看圖上的公式會有點誤導,直接看文章給出的每一層x的計算公式和具體的可視化圖
公式:
交叉層可視化圖:
這樣就比較清楚了,每一層的計算中都有,是一個列向量,所以這個計算過程相當於把交叉網絡輸入的每個維度分發到不同的維度上,再利用w把分發出去的值合併起來,以此來達到交叉特徵的效果。
舉個栗子?
假設輸入的是一個三維的向量,那麼第一層交叉層的計算如下圖:
看一下過程就很清楚了。
而每一層中的參數只有和 ,如果輸入數據的維度是d,交叉層的層數是,那麼整個交叉網絡的參數只有d*L*2,也大大減少了參數的數量。
4.最後的輸出
交叉網絡和深度網絡的輸出是他們最後一層神經網絡節點值。這裏和wide and deep 模型不同的是,wide and deep模型最後的輸出只有一個節點,模型直接將wide和deep兩個子模型的輸出的單個值加起來送入激活函數。
而這裏是將cross網絡輸出的向量和deep輸出的向量concate起來,再做一層的全連接,才送入激活函數。
具體實現代碼github上很多。
完