公众号: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,0x0+bh,0)
这就是一个普通的DNN结构,激活函数采用的是ReLu并没有什么特殊之处。
(3)左侧结构xl+1=x0xlTwl+bl+xlx_{l+1}=x_0x_l^{T}w_l+b_l+x_lxl+1=x0xlTwl+bl+xl
这个就是DCN的核心之处了,x0x_0x0是一个维度为ddd的列向量,wlw_lwldld_ldl同样是一个ddd维度的向量,是模型的参数。公式可视化之后是这样的:

(4)上方结构:p=σ([xL1T,hL2Twlogits])p=\sigma([x_{L_1}^{T},h_{L_2}^{T}w_{logits}])p=σ([xL1T,hL2Twlogits])
将左侧和右侧得到的两个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(Wlxl+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(VlTxl)+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=1KGi(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(VliTxl)+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(Ulig(Clig(VliTxl))+bl)
注:论文中用的是点乘,但是从浅梦大佬的代码中用的是正常的矩阵乘法。我也认为是矩阵乘法,否则最后Uli⋅g(Cli⋅g(VliTxl))U_{l}^i \cdot g(C_{l}^{i}\cdot g(V_{l}^{iT}x_l))Ulig(Clig(VliTxl))的维度对不上,如果是矩阵乘法的话,那么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×drrr的大小,也就是从高维分解为低维中,低维的数量)。

(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}zzzz就是简单地将所有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}ppi,j,i=1...N,j=1...Np_{i,j},i=1...N,j=1...Npi,j,i=1...Nj=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=Wznz=i=1Nj=1M(Wzn)i,jzi,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=Wpnp=i=1Nj=1N(Wpn)i,jpi,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>=fiTfj
受到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=Wpnp=i=1Nj=1NθinθjnT<fi,fj>=<i=1Nδin,i=1Nδin>
此时:δin=θinfi\delta_i^n={\theta_i^n}\boldsymbol{f_i}δin=θinfi。可得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(N2D1M)。通过降维后时间复杂度为O(ND1M)O(ND_1M)O(ND1M)

这种通过矩阵分解的方式减少参数数量,降低计算的复杂度在推荐模型中应用还是很多的,上面的DCN-M同样也应用到了。

第二种是OPNN


这种交叉比较少见,pi,j=fifjT\boldsymbol{p_{i,j}}=\boldsymbol{f_i}\boldsymbol{f_j}^Tpi,j=fifjT。在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=1Nj=1NfifiT
总结来说,有N个特征,那么就会交叉N的平方次,每次交叉都会形成一个矩阵,将N的平方和矩阵相加起来就可以得到p\boldsymbol{p}p了。直观来说就是将上面那个正方形的矩阵层层叠加,最后得到一个相同大小的矩阵。该矩阵的维度同样为M×MM\times MM×M。此时计算的复杂度达到惊人的O(N2D1M2)O(N^2D_1M^2)O(N2D1M2)

同样上面的公式还是可以进行优化的:
p=f∑f∑T\boldsymbol{p}=\boldsymbol{f_{\sum}}\boldsymbol{f_{\sum}}^Tp=ffT

其中f∑=∑iNfi\boldsymbol{f_{\sum}}=\sum_i^N\boldsymbol{f_i}f=iNfi。然后直接采用公式lpn=Wpn⊙pl_p^n=\boldsymbol{W}_p^n\odot \boldsymbol{p}lpn=Wpnp就可以得到我们要的结果。

以上就是关于推荐系统中经典模型DCN,DCN_v2,PNN模型的详细介绍,介绍得很详细,对于我自己来说相当于重新仔细地学习了一遍,收获不浅,更加了解了模型中的具体细节。同时也希望可以给有兴趣学习推荐模型的一些朋友有一定的帮助。

此外,喜欢数据挖掘,推荐系统,nlp的朋友可以关注我们公众号,然后回复加群添加我好友。

万字详述推荐系统经典模型DCN,DCN_v2,PNN相关推荐

  1. 推荐系统经典模型 Wide Deep 论文剖析

    作者 |  梁唐 来源 | TechFlow(id:TechFlow) 今天我们剖析的也是推荐领域的经典论文,叫做Wide & Deep Learning for Recommender Sy ...

  2. 机器学习从入门到精通150讲(一)-推荐系统经典模型Wide Deep(附部分代码)

    前言 在大规模特征的场景当中,我们通常(2016年之前)是使用将非线性特征应用在线性模型上的做法来实现的,使用这种方式,我们的输入会是一个非常稀疏的向量.虽然我们要实现这样的非线性特征,通过一些特征转 ...

  3. 推荐系统系列教程之十四:经典模型融合方法----线性模型和树模型的组合拳

    编者按:之前推出了<推荐系统系列教程>,反响不错,前面已经推出了十三期,今天按约推出第十四期:经典模型融合办法----线性模型和树模型的组合拳.希望朋友们多点"在看", ...

  4. 推荐系统-经典协同过滤算法【基于记忆的协同过滤算法、基于模型的协同过滤算法】

    推荐系统-经典协同过滤理论基础实践 1.协同过滤推荐方法CF简介 协同过滤CF 基于记忆的协同过滤 ---- 用户和物品的相似度矩阵 用户相似度的推荐 物品相似度推荐 UserCF用户协同过滤算法 I ...

  5. 广告点击率(CTR)预测经典模型 GBDT + LR 理解与实践(附数据 + 代码)

    CTR 系列文章: 广告点击率(CTR)预测经典模型 GBDT + LR 理解与实践(附数据 + 代码) CTR经典模型串讲:FM / FFM / 双线性 FFM 相关推导与理解 CTR深度学习模型之 ...

  6. 关于点击率模型,你知道这三点就够了 点击率预估的几个经典模型简介

    关于点击率模型,你知道这三点就够了 德川 2015年11月24日 阅读 2091 快速评论 说到广告,或者运营,关注的最多的就是点击率了.我们经常能听说某某科学家通过建立更好的点击率预测模型,为公司带 ...

  7. 推荐系统笔记(模型融合)

    思维导图: 推荐系统在技术实现上一般划分三个阶段:挖掘.召回.排序. 模型融合: 挖掘的工作就是对用户和物品做非常深入的结构化分析,对各个角度的特征都被呈现出来,并且建好索引,供召回阶段使用,大部分挖 ...

  8. 点击率预估的几个经典模型简介

     点击率预估的几个经典模型简介 2016-02-22 00:32 点击率预估是大数据技术应用的最经典问题之一,在计算广告,推荐系统,金融征信等等很多领域拥有广泛的应用.本文不打算对这个话题做个全面 ...

  9. CTR经典模型串讲:FM / FFM / 双线性 FFM 相关推导与理解

    CTR 系列文章: 广告点击率(CTR)预测经典模型 GBDT + LR 理解与实践(附数据 + 代码) CTR经典模型串讲:FM / FFM / 双线性 FFM 相关推导与理解 CTR深度学习模型之 ...

  10. 推荐系统-经典协同过滤理论基础实践

    推荐系统-经典协同过滤理论基础实践 1.协同过滤推荐方法CF简介 协同过滤CF 基于记忆的协同过滤 用户相似度的推荐 物品相似度推荐 UserCF用户协同过滤算法 ItemCF物品的协同过滤推荐算法 ...

最新文章

  1. 在Andoird studio 中用代码实现setId报错,而在ecplise中可以,的处理方法
  2. 攻读计算机视觉和机器学习硕士给我带来了什么?
  3. 用 Flask 来写个轻博客 (28) — 使用 Flask-Assets 压缩 CSS/JS 提升网页加载速度
  4. html a标签去掉下划线_让HTML元素动起来
  5. 储留香:一个智能运维系统就是一个中枢神经系统,我说的!
  6. js_!和!!的使用
  7. .net mysql数据库_.net连接MySQL数据库
  8. 自然语言处理 —— 2.7负采样
  9. 对android中ActionBar中setDisplayHomeAsUpEnabled和setHomeButtonEnabled和setDisplayShowHomeEnabled方法的理解...
  10. lhgcoreDialogPlugin v3.5.2 使用点滴
  11. MySQL 常用的查询命令
  12. mysql 系统序列号_mysql 序列号
  13. 计算机室 多媒体教室制度,多媒体教室计算机室规章制度.doc
  14. 惠普打印机故障代码_HP激光打印机常见故障代码
  15. N81新手入门全攻略——N81常规设置问答篇
  16. Github上的1000多本免费电子书重磅来袭!
  17. 摄像头防水性能测试软件,手机摄像头防水测试/气密性检测方法分享
  18. 史上最全最准的支付行业常用名词解释精选
  19. 应用泛函分析—距离空间
  20. python selenium 点击加载更多_Python Selenium 疑难杂症解方(三): 点击

热门文章

  1. 利用ISA防火墙发布邮件服务器并部署OWA访问
  2. VMware Workstation 与 Device/Credential Guard 不兼容.在禁用 Device/Credenti
  3. 关于环境光、漫反射、镜面反射
  4. Python自动化体系学习思维导图、知识点整理
  5. 网络流24题 餐巾计划(费用流)
  6. openlayers中海图的加载
  7. bash: scp: command not found
  8. 封装系统(以封装Windows 7为例)
  9. cαr怎么发音_元音字母
  10. python中执行py文件出错(提示File “stdin”,line 1,SyntaxError:invalid syntax)