万字详述推荐系统经典模型DCN,DCN_v2,PNN
公眾號:ChallengeHub(持續分析機器學習,數據挖掘,推薦系統,NLP方面的知識)
前言:
之前文章介紹了特征交叉的一些方式和幾種推薦系統中關于特征交叉的一些論文。上篇文章中主要介紹了wide&deep,deepFM,和NFM模型。其中wide&deep,和deepFM模型的特征交叉就一層,屬于淺度的特征交叉,NFM可以實現更深的特征交叉。這篇文章將介紹兩種經典的推薦模型,它們可以實現更深度的特征交叉。分別為DCN,DCN_v2和PNN。
1:DCN
論文名稱:Deep & Cross Network for Ad Click Predictions
論文鏈接:https://arxiv.org/pdf/1708.05123.pdf
論文結構:
模型結構解讀:
(1):x0=[xembed,1T,...xembed,kT,xdenseT]x_0=[x_{embed,1}^{T},...x_{embed,k}^{T},x_{dense}^{T}]x0?=[xembed,1T?,...xembed,kT?,xdenseT?]
x0x_0x0?代表的就是將輸入特征處理之后進行concat起來的結果。每篇論文其實對于特征的處理形式都不一樣,這篇論文是將類別的embedding,然后數值型的直接輸入,將所有特征處理后拼接成一個大的embedding就是x0x_0x0?。
(2)右邊結構:h1=ReLU(Wh,0x0+bh,0)h_1=ReLU(W_{h,0}x_0+b{h,0})h1?=ReLU(Wh,0?x0?+bh,0)
這就是一個普通的DNN結構,激活函數采用的是ReLu并沒有什么特殊之處。
(3)左側結構:xl+1=x0xlTwl+bl+xlx_{l+1}=x_0x_l^{T}w_l+b_l+x_lxl+1?=x0?xlT?wl?+bl?+xl?
這個就是DCN的核心之處了,x0x_0x0?是一個維度為ddd的列向量,wlw_lwl?,dld_ldl?同樣是一個ddd維度的向量,是模型的參數。公式可視化之后是這樣的:
(4)上方結構:p=σ([xL1T,hL2Twlogits])p=\sigma([x_{L_1}^{T},h_{L_2}^{T}w_{logits}])p=σ([xL1?T?,hL2?T?wlogits?])
將左側和右側得到的兩個embedding直接concat起來成為一個大的embedding,經過一個淺層的神經網絡輸出一個一維數字,再經過一個sigmoid函數就是最終的結果了。
2:DCN_V2
論文名稱:DCN V2: Improved Deep & Cross Network and Practical Lessons for Web-scale Learning to Rank Systems
論文地址:https://arxiv.org/pdf/2008.13535v2.pdf
看論文的名字,就知道該模型與DCN很相似了,該模型確實基于DCN的一個改進模型。與DCN最大的區別是特征交叉的地方有一點點地差異:
仔細一對比的話就是將DCN中一維向量wlw_lwl?改變成了二維矩陣WWW。除此之外,這篇論文中還提出了DCN的兩種結構:
一篇論文肯定不會這么簡單嘛,工作量這么少的論文也發不了頂會呀。于是作者們又對DCN進行了改進,原因是DCN_V2中計算的復雜度太高了。
模型改進:
改進的地方同樣來自于特征交叉的地方,論文中說的讓人有點不能理解,我們直接看修改的部分吧:
(1):由于將特征embedding之后再拼接起來成了一個ddd維的向量,這個ddd太大了,而矩陣WWW的維度是d×dd\times dd×d。所有導致這個計算的復雜度就很高了,于是我們可以W=UVTW=UV^{T}W=UVT,類似于矩陣分解的方法,將維度比較大的d×dd\times dd×d矩陣分解成兩個維度小一些的d×rd\times rd×r矩陣。其中rrr遠小于ddd。這種方法叫做矩陣的低階分解,和SVD有點類似。這也我們的交叉公式就發生了變化:
原來 :xl+1=x0⊙(Wlxl+bl)+xlx_{l+1}=x_0\odot(W_lx_l+b_l)+x_lxl+1?=x0?⊙(Wl?xl?+bl?)+xl?
現在:xl+1=x0⊙(Ul(VlTxl)+bl)+xlx_{l+1}=x_0\odot(U_l(V_{l}^{T}x_l)+b_l)+x_lxl+1?=x0?⊙(Ul?(VlT?xl?)+bl?)+xl?
參數的數量和運算的復雜度都有效的變低了。
(2):收到今年比較受歡迎的 Mixture-of-Experts (MoE)的影響,作者將這種結構也放入了交叉中之中。于是我們的交叉的公式又變為了以下的形式:
xl+1=∑i=1KGi(xl)Ei(xl)+xlx_{l+1}=\sum_{i=1}^{K}G_i(x_l)E_i(x_l)+x_lxl+1?=i=1∑K?Gi?(xl?)Ei?(xl?)+xl?
Ei(xl)=x0⊙(Uli(VliTxl)+bl)E_i(x_l)=x_0\odot(U_{l}^i(V_{l}^{iT}x_l)+b_l)Ei?(xl?)=x0?⊙(Uli?(VliT?xl?)+bl?)
其中GiG_iGi?就是一個門函數,可以是sigmoid或者是softmax。
(3):增加非線性。
Ei(xl)=x0⊙(Uli?g(Cli?g(VliTxl))+bl)E_i(x_l)=x_0\odot(U_{l}^i \cdot g(C_{l}^{i}\cdot g(V_{l}^{iT}x_l))+b_l)Ei?(xl?)=x0?⊙(Uli??g(Cli??g(VliT?xl?))+bl?)
注:論文中用的是點乘,但是從淺夢大佬的代碼中用的是正常的矩陣乘法。我也認為是矩陣乘法,否則最后Uli?g(Cli?g(VliTxl))U_{l}^i \cdot g(C_{l}^{i}\cdot g(V_{l}^{iT}x_l))Uli??g(Cli??g(VliT?xl?))的維度對不上,如果是矩陣乘法的話,那么CliC_{l}^{i}Cli?的維度則為r×rr\times rr×r。
改進的后模型據作者所說在降低了30%的復雜度的情況下,保留了模型的精度,模型可以稱之為:the mixture of low-rank DCN(DCN-Mix)。
大佬的代碼地址:https://github.com/shenweichen/DeepCTR-Torch/blob/bc881dcd417fec64f840b0cacce124bc86b3687c/deepctr_torch/layers/interaction.py#L464-L537
靈魂問答
這篇文章比較有趣的是關于實現部分是采用問答的形式展開的,總共有5個問題,同樣也給出了答案。擔憂翻譯問題于是我附上了英文。(文中對mDCN應該就是DCN-Mix的意思,命名有點混亂,希望我沒弄錯)
(1):什么時候特征交互學習方法會比基于relu的DNN更有效?
(When would feature interaction learning methods become more efficient than ReLU-based DNN)
從論文后續的答案中,作者從三個方面回答了該問題(不過更像是回答怎樣可以提升DCN_v2的效果)
a:提升交叉的復雜度
文中使用了三種二維的交叉方法(xix_ixi?代表的是某個特征),按照交叉的復雜程度有以下三種。
然后就是三種交叉的結果:
b:DCN中各個部分的作用
c:提升交叉的階數
總結:總而言之,即使使用更深更大的網絡,ReLU 在捕獲顯式特征交叉(乘法關系)方面效率低下。 當交叉模式變得更復雜時,精度會大大降低。 DCN 準確地捕獲了簡單的交叉模式,但無法捕捉更復雜的交叉模式。 另一方面,DCN-V2 對復雜的交叉模式保持準確和高效
(2):如果去除掉DNN結構的話,各種交叉方法的表現是怎么樣的?
(How does the feature-interaction component of each baseline perform without integrating with DNN)
總結:高階方法表現出優于二階方法的性能。 這表明高階交叉在該數據集中是有意義的。在高階方法中,交叉網絡取得了最好的性能,與 DNN 相比略勝一籌。
(3):DCN-Mix的于基礎的DCN_v2相比表現如何,我們應該這么在模型的精確度和模型的消耗之間進行平衡(以DCN為例)。
(How does the proposed mDCN approaches compare to the baselines? Could we achieve healthier trade-off between model accuracy and cost through mDCN and the mixture of low-rank DCN)
總結:在所有方法中,DCN-V2效果最好,同時相比性能不差; DCN-Mix 進一步降低了模型消耗,在模型性能和效果之間取得了更好的平衡。(作者主要對比了DCN_v2和DCN-Mix與其它模型之間的效果)
(4):DCN-Mix參與與模型效果之間的關系
(Q4 How does the settings in mDCN affect model quality)
上圖左邊展現的是DNN模型和Cross NetWork在不同網絡層數下的效果。右側是展現在不同的矩陣維度情況下的效果。(這個matrix rank就是在改進模型中Wl,r×dW_l,r\times dWl?,r×d中rrr的大小,也就是從高維分解為低維中,低維的數量)。
(5):DCN-Mix是否捕捉到了重要的特征交叉?模型的解釋性如何?
(Q5 Is mDCN capturing important feature crosses? Does the model provide good understandabilit)
作者直接從實驗結果回答了該問題。左側是DCN_v2中的WWW權重矩陣,右側顯示的特征交叉,顏色越深代表者交叉越重要,從兩張圖的重合程度可以看出還是學到了一些重要的顯示交叉特征,比如gender-UserId和Movied-UserId。
作為近年來推薦系統中的SOTA模型,這篇論文還是有很多啟發的。DCN的改進,高階矩陣分解等操作還是很有學習的意義。并且實驗階段給我們展示了很多擴展性的工作。
PNN
論文地址:https://arxiv.org/pdf/1611.00144v1.pdf
模型結構:
首先看模型結構,從下面往上面看,第一層input就到embedding就不需要再解釋了吧。
(1)z\boldsymbol{z}z:zzz就是簡單地將所有feature地embedding直接復制過去。
其中z=(z1,z2,...zN)===(f1,f2,...fN)\boldsymbol{z}=(\boldsymbol{z_1},\boldsymbol{z_2},...\boldsymbol{z_N})===(\boldsymbol{f_1},\boldsymbol{f_2},...\boldsymbol{f_N})z=(z1?,z2?,...zN?)===(f1?,f2?,...fN?),.fi.\boldsymbol{f_i}.fi?就是特征iii的embedding。
(2) p\boldsymbol{p}p:pi,j,i=1...N,j=1...Np_{i,j},i=1...N,j=1...Npi,j?,i=1...N,j=1...N,其中pi,j=g(fi,fj)p_{i,j}=g(\boldsymbol{f_i},\boldsymbol{f_j})pi,j?=g(fi?,fj?),可以看出pi,jp_{i,j}pi,j?就是特征i,ji,ji,j之間交叉的結果。至于怎么交叉,我們稍后再說。
(3):從z,pz,pz,p層到達L1L_1L1?我感覺是我看這篇論文沒有想到的。
在我看來,應該就是將z\boldsymbol{z}z展開,再將p\boldsymbol{p}p展開,然后concat成一個一維的向量,然后再經過一層網絡得到L1,但其實并不是這樣的。我們介紹L1的構成:
l1=relu(lz+lp+b1)\boldsymbol{l}_1=relu(\boldsymbol{l}_z+\boldsymbol{l}_p+\boldsymbol{b}_1)l1?=relu(lz?+lp?+b1?)
可以看出lz,lp,b1\boldsymbol{l}_z,\boldsymbol{l}_p,\boldsymbol{b}_1lz?,lp?,b1?三個一維的向量加起來再經過relu得到的L1。與我看模型結構時的猜想并不一致。
首先我們來介紹lz\boldsymbol{l}_zlz?的構成:
lz=(lz1,lz2,...lzD1)\boldsymbol{l}_z=(l_z^1,l_z^2,...l_z^{D_1})lz?=(lz1?,lz2?,...lzD1??)
lzn=Wzn⊙z=∑i=1N∑j=1M(Wzn)i,jzi,jl_z^n=\boldsymbol{W}_z^n\odot \boldsymbol{z}=\sum_{i=1}^N\sum_{j=1}^M(\boldsymbol{W}_z^n)_{i,j}z_{i,j}lzn?=Wzn?⊙z=∑i=1N?∑j=1M?(Wzn?)i,j?zi,j?可以看出,Wzn\boldsymbol{W}_z^nWzn?時一個維度與z\boldsymbol{z}z完全相同的矩陣,最后lz\boldsymbol{l_z}lz?的維度有多少(D1D_1D1?),則Wzn\boldsymbol{W}_z^nWzn?的個數有多少。
同理我們可以得到:
lpn=Wpn⊙p=∑i=1N∑j=1N(Wpn)i,jpi,jl_p^n=\boldsymbol{W}_p^n\odot \boldsymbol{p}=\sum_{i=1}^N\sum_{j=1}^N(\boldsymbol{W}_p^n)_{i,j}p_{i,j}lpn?=Wpn?⊙p=∑i=1N?∑j=1N?(Wpn?)i,j?pi,j?。但是在求pi,jp_{i,j}pi,j?處作者提出了兩種方法。
第一種是IPNN
這種就是最常見的交叉了,pi,j=<fi,fj>=fiTfjp_{i,j}=<\boldsymbol{f_i},\boldsymbol{f_j}>=\boldsymbol{f_i^T}\boldsymbol{f_j}pi,j?=<fi?,fj?>=fiT?fj?
受到FM模型的啟發,將Wpn\boldsymbol{W_p^n}Wpn?轉化為兩個向量。即:Wpn=θnθnT\boldsymbol{W_p^n}=\boldsymbol{\theta^n}\boldsymbol{\theta^n}^TWpn?=θnθnT
因此原來的等式就可以變為:
lpn=Wpn⊙p=∑i=1N∑j=1NθinθjnT<fi,fj>=<∑i=1Nδin,∑i=1Nδin>l_p^n=\boldsymbol{W}_p^n\odot p=\sum_{i=1}^N\sum_{j=1}^N{\theta_i^n}{\theta_j^n}^T<\boldsymbol{f_i},\boldsymbol{f_j}>=<\sum_{i=1}^N\delta_i^n,\sum_{i=1}^N\delta_i^n>lpn?=Wpn?⊙p=i=1∑N?j=1∑N?θin?θjn?T<fi?,fj?>=<i=1∑N?δin?,i=1∑N?δin?>
此時:δin=θinfi\delta_i^n={\theta_i^n}\boldsymbol{f_i}δin?=θin?fi?。可得lpn=(∣∣∑i=1δi1∣∣,...∣∣∑i=1δin∣∣)l_p^n=(||\sum_{i=1}\delta_i^1||,...||\sum_{i=1}\delta_i^n||)lpn?=(∣∣∑i=1?δi1?∣∣,...∣∣∑i=1?δin?∣∣)。引入這種方法與FM的初衷也是一樣,為了降低計算的復雜度,同時也可以減少參數的數量。
本來計算的時間復雜度為:O(N2(D1+M)O(N^2(D_1+M)O(N2(D1?+M)(NNN是特征的數量,MMM為特征embedding的維度,D1D_1D1?為最后lp\boldsymbol{l_p}lp?的維度)。由于pi,jp_{i,j}pi,j?只需要計算一次,時間復雜度并不是直接的O(N2D1M)O(N^2D_1M)O(N2D1?M)。通過降維后時間復雜度為O(ND1M)O(ND_1M)O(ND1?M)。
這種通過矩陣分解的方式減少參數數量,降低計算的復雜度在推薦模型中應用還是很多的,上面的DCN-M同樣也應用到了。
第二種是OPNN
這種交叉比較少見,pi,j=fifjT\boldsymbol{p_{i,j}}=\boldsymbol{f_i}\boldsymbol{f_j}^Tpi,j?=fi?fj?T。在IPNN中p_{i,j}是一個數字,但是在OPNN中,則是一個矩陣,pi,j\boldsymbol{p_{i,j}}pi,j?的維度為M×MM \times MM×M。此時p\boldsymbol{p}p再也不是根據pi,j\boldsymbol{p_{i,j}}pi,j?,而是這樣的:
p=∑i=1N∑j=1NfifiT\boldsymbol{p}=\sum_{i=1}^N\sum_{j=1}^N\boldsymbol{f_i}\boldsymbol{f_i}^Tp=i=1∑N?j=1∑N?fi?fi?T
總結來說,有N個特征,那么就會交叉N的平方次,每次交叉都會形成一個矩陣,將N的平方和矩陣相加起來就可以得到p\boldsymbol{p}p了。直觀來說就是將上面那個正方形的矩陣層層疊加,最后得到一個相同大小的矩陣。該矩陣的維度同樣為M×MM\times MM×M。此時計算的復雜度達到驚人的O(N2D1M2)O(N^2D_1M^2)O(N2D1?M2)。
同樣上面的公式還是可以進行優化的:
p=f∑f∑T\boldsymbol{p}=\boldsymbol{f_{\sum}}\boldsymbol{f_{\sum}}^Tp=f∑?f∑?T
其中f∑=∑iNfi\boldsymbol{f_{\sum}}=\sum_i^N\boldsymbol{f_i}f∑?=∑iN?fi?。然后直接采用公式lpn=Wpn⊙pl_p^n=\boldsymbol{W}_p^n\odot \boldsymbol{p}lpn?=Wpn?⊙p就可以得到我們要的結果。
以上就是關于推薦系統中經典模型DCN,DCN_v2,PNN模型的詳細介紹,介紹得很詳細,對于我自己來說相當于重新仔細地學習了一遍,收獲不淺,更加了解了模型中的具體細節。同時也希望可以給有興趣學習推薦模型的一些朋友有一定的幫助。
此外,喜歡數據挖掘,推薦系統,nlp的朋友可以關注我們公眾號,然后回復加群添加我好友。
總結
以上是生活随笔為你收集整理的万字详述推荐系统经典模型DCN,DCN_v2,PNN的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无线调试神器:无线WiFi串口透传模块使
- 下一篇: 记录一次自己搭建服务器的历程(机架式服务