1. 前言

随着信息技术和互联网的发展, 我们已经步入了一个信息过载的时代,这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战:

  • 信息消费者:如何从大量的信息中找到自己感兴趣的信息?
  • 信息生产者:如何让自己生产的信息脱颖而出, 受到广大用户的关注?

为了解决这个矛盾, 推荐系统应时而生, 并飞速前进,在用户和信息之间架起了一道桥梁,一方面帮助用户发现对自己有价值的信息, 一方面让信息能够展现在对它感兴趣的用户前面。 推荐系统近几年有了深度学习的助推发展之势迅猛, 从前深度学习的传统推荐模型(协同过滤,矩阵分解,LR, FM, FFM, GBDT)到深度学习的浪潮之巅(DNN, Deep Crossing, DIN, DIEN, Wide&Deep, Deep&Cross, DeepFM, AFM, NFM, PNN, FNN, DRN), 现在正无时无刻不影响着大众的生活。

推荐系统通过分析用户的历史行为给用户的兴趣建模, 从而主动给用户推荐给能够满足他们兴趣和需求的信息, 能够真正的“懂你”。 想上网购物的时候, 推荐系统在帮我们挑选商品, 想看资讯的时候, 推荐系统为我们准备了感兴趣的新闻, 想学习充电的时候, 推荐系统为我们提供最合适的课程, 想消遣放松的时候, 推荐系统为我们奉上欲罢不能的短视频…, 所以当我们淹没在信息的海洋时, 推荐系统正在拨开一层层波浪, 为我们追寻多姿多彩的生活!

这段时间刚好开始学习推荐系统, 通过王喆老师的《深度学习推荐系统》已经梳理好了知识体系, 了解了当前推荐系统领域各种主流的模型架构和技术。 所以接下来的时间就开始对这棵大树开枝散叶,对每一块知识点进行学习总结。 所以接下来一块目睹推荐系统的风采吧!

这次整理重点放在推荐系统的模型方面, 前面已经把传统的推荐模型梳理完毕, 下面正式进入深度学习的浪潮之巅。在2016年, 随着微软的Deep Crossing, 谷歌的Wide&Deep以及FNN、PNN等一大批优秀的深度学习模型被提出, 推挤系统和计算广告领域全面进入了深度学习时代, 时至今日, 依然是主流。 在进入深度学习时代, 推荐模型主要有下面两个进展:

  1. 与传统的机器学习模型相比, 深度学习模型的表达能力更强, 能够挖掘更多数据中隐藏的模式
  2. 深度学习模型结构非常灵活, 能够根据业务场景和数据特点, 灵活调整模型结构, 使模型与应用场景完美契合

所以, 后面开始尝试整理深度学习推荐模型,它们以多层感知机(MLP)为核心, 通过改变神经网络结构进行演化,它们的演化关系依然拿书上的一张图片, 便于梳理关系脉络, 对知识有个宏观的把握:


今天是推荐系统深度学习模型的第二篇,整理NeuralCF和PNN模型, 这两个模型的进化方式是改变了特征的交叉方式。但是在具体说这两个模型之前, 先说点题外的东西, 换一个思路来理一理前面整理的模型。 前面已经尝试整理了四篇文章把传统的推荐算法过了一遍,其实这里面是贯穿着推荐算法中两个根本性思路的, 一个是用户和条目的表征, 也就是如何更好地把用户特征和物品特征信息表示出来, 隐语义模型(MF)就是属于这个思路上的, 使用了embedding的思路去表示用户和物品, 从而用向量的乘积表示用户对物品的喜好程度。 第二个思路是特征交叉, 即考虑特征之间的交互信息以丰富数据的表达能力, 因子分解机(FM)的家族就是致力于解决这个问题上的。

进入深度学习时代之后, 所谓“万变不离其宗”, 依然会是这两个根本性的思路, 只不过由于深度学习模型强大的学习能力, 有的依然会专走用户和条目表征的思路,有的会专走特征交叉的思路, 还有的“脚踏两只”, 前面整理AutoRec和Deep Crossing模型我们说是在神经网络的复杂度和层数方面进行的进化,而这两个模型也是使用深度学习从用户和条目表征的角度解决推荐问题的方案, 因为它们并没有刻意去研究特征与特征之间的两两或者三三的交互(没有应对特征交叉的能力), 而是用全连接隐层把所有特征进行了统一的交叉学习, 这在很多场景下其实是不太合理的(这样可能会使的即使没有半毛钱关系的特征在这种情况下也会发生点关系,也可能会使几个很亲密的特征也很难擦出点火花),没有什么针对性, 所以使得模型的学习能力受到限制。另外, 虽然感觉Deep Crossing用了embedding, stacking, 残差等, 但是模型的结构还是不够复杂,于是乎就有了今天整理的这两个模型, 这两个模型更注重于研究特征交叉的方式, 当然他们也同时考虑了用户和条目表征的问题。

这就是今天要介绍的两个主角模型Neural CF模型和PNN模型了, Neural CF模型是从传统的协同过滤方法(MF)的基础上进行的改进, 把MF里面用户向量和物品向量的点积操作换成了多层的神经网络, 使得两个向量可以做更充分的交叉, 得到更多有价值的特征组合信息, 另外一个就是神经网络的激活函数可以引入更多的非线性, 让模型的表达能力更强。首先会介绍这个模型的相关原理细节, 包括MF的不足(论文里面作者特意说了个场景)然后引出NeuralCF模型, 介绍通用的NCF框架, 然后介绍其两个实例(GMF和MLP), 然后将他俩组合起来就是最终的模型架构, 最后为了更好地理解工作细节, 用pytorch模型进行复现,然后基于之前用的MovieLens数据集玩一个小实战。 NeuralCF模型有个不足的地方, 就是它只用到了用户向量和物品向量, 可以看成一个MF的加强版, 但是它没有考虑其他的特征信息, 这无疑是一种浪费, 所以Product-based Neural Network(PNN)模型是在加入多组特征的基础上研究的特征交叉, 这个模型和Deep Crossing模型的架构类似, 只不过把Deep Crossing的stacking层换成了Product层, 也就是不同特征的embedding向量不再是简单的堆叠, 而是两两交互, 更有针对性的获取特征之间的交叉信息。 在这里面研究了两两特征之间的内积和外积两种交叉方式, 提出了具体的两种模型IPNN和OPNN。 同样对于该模型, 也是先介绍架构原理, 介绍论文中的一些计算细节(感觉论文里面的一些公式有点难懂,所以复现了一下之后又重新进行的理解),然后就是pytorch复现这个模型基于Criteo数据集玩一个点击率预测。 今天的这篇文章会有些长, 但是每个模块都分的比较清晰, 根据目录进行相应模块的查阅即可。

大纲如下

  • 简单回顾一下MF, 看看存在的问题
  • Neural CF模型的原理及(NCF框架及两个实例GMF和MLP的原理)
  • Neural CF模型pytorch复现
  • PNN 模型的原理
  • PNN 模型的pytorch复现
  • 总结

Ok, let’s go!

2. 简单回顾一下MF, 看看存在的问题

关于矩阵分解的详细介绍, 可以参考之前整理的AI上推荐 之 隐语义模型(LFM)和矩阵分解(MF), 这里简单的回顾一下矩阵分解算法的原理: 矩阵分解是试图在协同过滤共现矩阵的基础上, 使用更稠密的隐向量表示用户和物品, 挖掘用户和物品的隐含兴趣和隐含特征, 在一定程度上弥补协同过滤模型处理稀疏矩阵能力不足的问题。具体做法就是把共现矩阵分解成用户矩阵Q和物品矩阵P相乘的形式, 这时候如果预测某个用户u对某个物品i的打分, 直接puTqip_u^Tq_ipuTqi就可以得到, 其中pup_upuqiq_iqi是用户u和物品i的隐向量, 而学习隐向量的过程我们是先随机初始化两个参数矩阵Q和P, 然后根据已有评分的值求损失, 通过梯度下降一步一步的更新参数得到的。

而上面这个隐向量的学习过程, 在深度学习中, 就可以看成是一个简单的神经网络表示, 用户向量和物品向量可以看成embedding的方法, 而最终的评分值(预测值), 就是用户向量和物品向量内积后的“相似度”。 而这步内积运算, 就可以看成一个神经单元里面的计算了。 用王喆老师书里面的一个图来看一下:


但是这个模型由于结构太简单,计算也太简单, 使得输出层无法对目标进行有效的拟合。 在实际问题中, 会发现往往模型会出现欠拟合的状态, NeuralCF的作者说内积运算其实不足以可靠的预测评分, 还举了一个例子, 我们来看一下:

上图中, 左边的就是我们说的共现矩阵(user-item)矩阵, 观察这个矩阵,可以计算出u1,u2,u3u_1, u_2, u_3u1,u2,u3u4u_4u4之间的相似度。 会发现共线矩阵里面u4u_4u4u1u_1u1最相似, 其次是u3u_3u3, 最后是u2u_2u2。 但是如果我们把u1,u2,u3u_1, u_2, u_3u1,u2,u3用隐向量的方式表现出来, 右图, 其中pip_ipiuiu_iui的隐向量。 会发现u2u_2u2u3u_3u3挺相似, 而和u1u_1u1的相似度就小一些(不如u3u_3u3)。
But, 如果此时我们想把p4p_4p4画出来, 由于p4p_4p4p1p_1p1最近, 那么无论是虚线里面的哪种情况, 都会发现p4p_4p4p2p_2p2p4p_4p4p3p_3p3的相似度要打, 这在左边是不成立的。 也就是说隐空间中,对于p4p_4p4来说, 左边的这种相似关系没法具体在隐空间中表示出来。 直观的看, 是隐向量计算相似度的时候存在问题, 因为相似度是夹角衡量的, 夹角关系在降维之后有可能发生了错乱, 但是这间接的说明了单单使用内积不足以可靠的预测评分。所以为了更好地学习用户和商品的隐向量与评分之间的关系, 基于深度学习网络, 作者想出了用一个多层的神经网络来替换简单的内积运算来增强模型的学习能力, 这个就是Neural CF的框架了。作者的这句话直接一语道破玄机:

3. Neural CF模型的原理

Neural CF是2017年新加坡国立大学的研究人员提出的一个模型, 提出的动机就是看着MF的内积操作比较简单, 表达能力不强, 而此时正是深度学习的浪潮啊, 所以作者就用一个“多层的神经网络+输出层”替换了矩阵分解里面的内积操作, 这样做一是让用户向量和物品向量做更充分的交叉, 得到更多有价值的特征组合信息。 二是引入更多的非线性特征, 让模型的表达能力更强。 变换图如下(王喆老师的《深度学习推荐系统》):


这里的改进就是多层神经网络替换掉了原来的内积操作。 这里可以多提一点就是特征交叉的方式有很多种, 内积算是一种, 多层神经网络加入更多非线性,模拟更复杂的交叉函数也是一种, 所以如何进行特征之间的有效交叉也是一个可以研究的点。 后面的PNN, Deep&Cross模型中, 还会看到更多可行的互操作(交叉)方式, 我们自己感兴趣的话也可以设计, 如果有效, 就可以发paper了哈哈。下面再来详细说一下右边这个结构。

3.1 具体细节

论文里面的这个结构看起来更清晰一些:


这个说是一种模型, 不如说是一种general NCF框架, 因为向量交叉的方式可以有很多种, 如果这里是内积操作, 那么这个NCF框架就成了普通的MF, 如果这里是多层神经网络, 那么这个框架就成了一种MLP的网络。 框架的计算公式如下:
f(PTvuU,QTviI)=ϕout(ϕX(…ϕ2(ϕ1(PTvuU,QTviI))…))f\left(\mathbf{P}^{T} \mathbf{v}_{u}^{U}, \mathbf{Q}^{T} \mathbf{v}_{i}^{I}\right)=\phi_{\text {out}}\left(\phi_{X}\left(\ldots \phi_{2}\left(\phi_{1}\left(\mathbf{P}^{T} \mathbf{v}_{u}^{U}, \mathbf{Q}^{T} \mathbf{v}_{i}^{I}\right)\right) \ldots\right)\right) f(PTvuU,QTviI)=ϕout(ϕX(ϕ2(ϕ1(PTvuU,QTviI))))

这个公式, 如果熟悉神经网络前向传播过程就很容易理解了, 不做过多解释, 而模型的训练过程的话, 就是神经网络的训练过程, 损失函数这里可以用平方损失(预测评分), 或者是交叉熵损失(分类问题, 判断用户对物品是不是感兴趣)。

3.1.1 GMF模型和MLP模型

作者指出如果上图中的 Neural CF Layers 部分做的工作就是将 user 和 item 的 Embedding 做点积(对应元素相乘),得到一个和 Embedding 等长的向量,然后交给 logistics regression。也就是:

y^ui=aout(hT(pu⊙qi))\hat{y}_{u i}=a_{\text {out}}\left(\mathbf{h}^{T}\left(\mathbf{p}_{\mathbf{u}} \odot \mathbf{q}_{\mathbf{i}}\right)\right)y^ui=aout(hT(puqi))
⊙\odot表示对应元素相乘。 与普通的MF不同的是, 这里的隐向量进行对应元素相乘之后会有个权重, 也就是各个隐向量维度的重要性不一定相同了。 如果hhh是一个全1向量的话, 那模型实际上就是MF了。 这也就是Generalized Matrix Factorization (GMF)名字的来历。

既然都说了,MF存在问题,那自然要改进了,改进方法就是引入多层感知机。把 user 和 item 的 Embedding 拼起来,然后输入给多层感知机,就可以了。上面也提到过MLP 能够引入非线性的变换,有能力捕获到更加复杂的特征组合。有望利用 user 和 item 的隐向量,学得一个更好的模型。 公式如下:
z1=ϕ1(pu,qi)=[puqi]ϕ2(z1)=a2(W2Tz1+b2)…ϕL(zL−1)=aL(WLTzL−1+bL)y^ui=σ(hTϕL(zL−1))\begin{aligned} \mathbf{z}_{1} &=\phi_{1}\left(\mathbf{p}_{u}, \mathbf{q}_{i}\right)=\left[\begin{array}{c} \mathbf{p}_{u} \\ \mathbf{q}_{i} \end{array}\right] \\ \phi_{2}\left(\mathbf{z}_{1}\right) &=a_{2}\left(\mathbf{W}_{2}^{T} \mathbf{z}_{1}+\mathbf{b}_{2}\right) \\ & \ldots \\ \phi_{L}\left(\mathbf{z}_{L-1}\right) &=a_{L}\left(\mathbf{W}_{L}^{T} \mathbf{z}_{L-1}+\mathbf{b}_{L}\right) \\ \hat{y}_{u i} &=\sigma\left(\mathbf{h}^{T} \phi_{L}\left(\mathbf{z}_{L-1}\right)\right) \end{aligned} z1ϕ2(z1)ϕL(zL1)y^ui=ϕ1(pu,qi)=[puqi]=a2(W2Tz1+b2)=aL(WLTzL1+bL)=σ(hTϕL(zL1))
这里作者说层与层之间激活函数比较好用的ReLU。

所以对于NCF框架, 根据交叉方式的不同就有上面的两个实例模型GMF和MLP, 前者是用线性的方式建模了特征交叉, 而后者是引入了非线性的方式建模了特征交叉, 那么两者合起来效果是不是会更好呢?

3.1.2 GMF和MLP的结合

果真, 作者就这么做了, 提出了Neural CF的混合模型版, 整合了原始的Neural CF模型和以元素积伟互操作的广义矩阵分解模型, 使得模型有了更强的线性组合和非线性组合的表达能力。


有了前面的铺垫, 这个模型也就很简单了吧, 就是两块, 左边是GMF, 右边是MLP, 模型的前向传播过程是这样:
ϕGMF=puG⊙qiGϕMLP=aL(WLT(aL−1(…a2(W2T[puMqiM]+b2)…)+bL)y^ui=σ(hT[ϕGMFϕMLP])\begin{aligned} \phi^{G M F} &=\mathbf{p}_{u}^{G} \odot \mathbf{q}_{i}^{G} \\ \phi^{M L P} &=a_{L}\left(\mathbf{W}_{L}^{T}\left(a_{L-1}\left(\ldots a_{2}\left(\mathbf{W}_{2}^{T}\left[\begin{array}{l} \mathbf{p}_{u}^{M} \\ \mathbf{q}_{i}^{M} \end{array}\right]+\mathbf{b}_{2}\right) \ldots\right)+\mathbf{b}_{L}\right)\right.\\ \hat{y}_{u i} &=\sigma\left(\mathbf{h}^{T}\left[\begin{array}{l} \phi^{G M F} \\ \phi^{M L P} \end{array}\right]\right) \end{aligned} ϕGMFϕMLPy^ui=puGqiG=aL(WLT(aL1(a2(W2T[puMqiM]+b2))+bL)=σ(hT[ϕGMFϕMLP])
这里我们要注意的一个细节, 就是这俩模型的embedding向量是单独学习的, 并不是共享的, 作者在论文里面也给出了原因, 就是这样会更加的灵活,可以根据模型的复杂程度确定不同的隐向量的维度, 然后单独去各自的模型计算, 计算的结果进行合并, 再过一层全连接得到最后的输出。 公式+图应该很容易明白了。

这个就是Neural CF模型的原理了, 真实训练的时候, 作者建议用pre-training的方式:


这个模型结构并不是很复杂, 并且涉及到的特征只有用户和物品自身的特征向量。 所以通过下面的复现, 再看看里面的细节应该可以有一个较深的理解了。

4. Neural CF模型的复现

这次使用的数据集是MovieLen电影评分数据集(处理过), 由于篇幅的原因, 这里我依然是只给出模型复现的代码, 关于模型的训练过程, 数据预处理的过程, 可以参考最后的GitHub链接。 这里主要是通过代码和上面的图更好地掌握这个模型。我们再把上面的模型架构图拿过来, 主要分析一下代码写的时候的逻辑: 由于篇幅原因, 这里只看最终的Neural MF模型, 至于GMF和MLP各自的模型, 可以参考后面的GitHub链接, 包括与训练的过程。


我们可以发现, 这个模型由左右两部分组成, 左边的就是一个GMF层, 这个实现的时候也非常简单, 接收用户和物品的embedding向量, 然后做一个内积运算。 右边是一个多层的神经网络, 接收的也是用户和物品的embedding向量, 然后经过了多个全连接层, 然后拼接起来再过一个全连接层得到最后的输出, 具体的模型代码如下:

class NeuralMF(nn.Module):def __init__(self, num_users, num_items, mf_dim, layers):super(NeuralMF, self).__init__()# MF那边的embedding层self.MF_Embedding_User = nn.Embedding(num_embeddings=num_users, embedding_dim=mf_dim)self.MF_Embedding_Item = nn.Embedding(num_embeddings=num_items, embedding_dim=mf_dim)# MLP 那边的embedding层self.MLP_Embedding_User = nn.Embedding(num_embeddings=num_users, embedding_dim=layers[0] // 2)self.MLP_Embedding_Item = nn.Embedding(num_embeddings=num_items, embedding_dim=layers[0] // 2)# 全连接网络self.dnn_network = nn.ModuleList([nn.Linear(layer[0], layer[1]) for layer in list(zip(layers[:-1], layers[1:]))])self.linear = nn.Linear(layers[-1], mf_dim)# 合并之后self.linear2 = nn.Linear(2*mf_dim, 1)self.sigmoid = nn.Sigmoid()def forward(self, inputs):# 这个inputs是一个批次的数据, 所以后面的操作切记写成inputs[0], [1]这种, 这是针对某个样本了, 我们都是对列进行的操作# 先把输入转成long类型inputs = inputs.long()# MF模型的计算 用户和物品的embeddingMF_Embedding_User = self.MF_Embedding_User(inputs[:, 0])  # 这里踩了个坑, 千万不要写成[0], 我们这里是第一列MF_Embedding_Item = self.MF_Embedding_Item(inputs[:, 1])# 两个向量点积过一个全连接mf_vec = torch.mul(MF_Embedding_User, MF_Embedding_Item)# MLP 模型的计算MLP_Embedding_User = self.MLP_Embedding_User(inputs[:, 0])  MLP_Embedding_Item = self.MLP_Embedding_Item(inputs[:, 1])# 两个隐向量堆叠起来x = torch.cat([MLP_Embedding_User, MLP_Embedding_Item], dim=-1)# l全连接网络for linear in self.dnn_network:x = linear(x)x = F.relu(x)mlp_vec = self.linear(x)# 合并两个vector = torch.cat([mf_vec, mlp_vec], dim=-1)# linerlinear = self.linear2(vector)output = self.sigmoid(linear)return output

这个模型并不是很复杂, 所以对于入门来说也是刚刚好。 关于预训练部分, 我们得知道如何获取到某些具体层的参数并知道如何进行修改, model.state_dict()是一个有序字典, 这里面会保存网络的层及其参数,具体细节可以参考后面的链接。

这个就是Neural CF模型了的全部内容了。

下面看一下这个模型的优势, NeuralCF模型实际上提出了一个模型框架, 基于用户向量和物品向量这两个embedding层, 利用不同的互操作进行特征的交叉组合, 并可以灵活进行不同互操作层的拼接。 这里可以看出深度模型构建推荐模型的优势—利用神经网络理论上能够拟合任意函数的能力, 灵活组合特征, 按需增加或者减少模型复杂度。 这个是More Powerful的!

但是这个模型也有局限性, 因为这个模型是在原来协同过滤的思想上进行的改进, 所以Neural CF并没有引入更多其他类型特征, 造成了一种可用信息的浪费。也就是有效资源并没有好好的利用起来。

那么, 如何更好地既能够加入多组特征, 又能够好好的特征交叉呢? PNN模型给出了这个问题的解决思路。

5. PNN 模型的原理

PNN模型叫做Product-based Neural Networks, 这是2016年上海交大团队在ICDM会议上提出的一个模型。

这个模型和上一篇里面的Deep Crossing长得很像, 我们先来看看它的结构:


PNN模型在输入、Embedding层, 多层神经网络及最后的输出层与DeepCrossing没有区别, 唯一的就是Stacking层换成了这里的Product层。 因为我们不是分析了DeepCrossing是把所有特征进行了交叉, 没有针对性嘛, 所以PNN这里就弄了个Product层, 专门进行特征之间的交叉的, 并且还提出了两种特征交叉的方式。所以这里我们重点来研究下这个网络架构。

5.1 输入层

这个不同多说了, 模型输入由NNN个特征域(Field)组成,都是离散稀疏的分类特征,如年龄、性别、id等(经过one-hot编码, 但是实际上我们知道, 真实复现的时候往往用LabelEncoder编码, 取相应位置的embedding)。并且这里还要注意一个细节, 就是如果这些输入都是类别型特征, 那我们数值型的怎么办? 数值型特征不在这里了, 需要等类别型特征交叉完了之后, 再统一合并, 具体的在代码中说。

5.2 Embedding层

这个和DeepCrossing一样, 对每一个离散稀疏的Field特征域进行Embedding操作,参数是通过神经网络的反向传播进行学习。
例如, 第iii个域的embedding向量fif_ifi是embedding的输出:
fi=W0ix[start i:endi]\boldsymbol{f}_{i}=\boldsymbol{W}_{0}^{i} \boldsymbol{x}\left[\text { start }_{i}: \mathrm{end}_{i}\right] fi=W0ix[starti:endi]
其中xxx表示包含多个域的输入特征向量, x[starti:endi]x[start_i:end_i]x[starti:endi]表示第iii个域的one-hot向量。 W0W_0W0表示embedding层的参数。不过在具体实现上, 并没有这么麻烦, 我们只要把iii特征域进行LabelEncoder编码, 相当于为这个域下面的值建了一个字典。 然后取embedding的时候, 只需要取对应下标值位置的embedding即可。 对于iii 的每一个特征值, 都是一个1×M1\times M1×M的向量, 这里的MMM表示隐向量的维度。

5.3 Product 层

这块比较重要, 也是这个模型的关键所在, 这里特意把这块拿了出来, 因为这里面有很多小细节, 如果仅仅看论文原文, 这里放一大推的公式, 一看就让人懵逼, 并且还有很多的上标下标, 我第一遍读的时候根本不知道作者在说啥, 最后手动画了一遍, 才大致上搞明白。


首先, 这一层的输入是NNN个特征域的embedding向量, Feature1,....FeatureNFeature 1, ....Feature NFeature1,....FeatureN, 这一层的输出会是lz,lpl_z, l_plz,lp, 其中这两个的计算如下:
lz=(lz1,lz2,…,lzn,…,lzD1),lzn=Wzn⊙zlp=(lp1,lp2,…,lpn,…,lpD1),lpn=Wpn⊙p\begin{array}{ll} \boldsymbol{l}_{\boldsymbol{z}}=\left(l_{z}^{1}, l_{z}^{2}, \ldots, l_{z}^{n}, \ldots, l_{z}^{D_{1}}\right), & l_{z}^{n}=\boldsymbol{W}_{z}^{n} \odot \boldsymbol{z} \\ \boldsymbol{l}_{p}=\left(l_{p}^{1}, l_{p}^{2}, \ldots, l_{p}^{n}, \ldots, l_{p}^{D_{1}}\right), & l_{p}^{n}=\boldsymbol{W}_{p}^{n} \odot \boldsymbol{p} \end{array} lz=(lz1,lz2,,lzn,,lzD1),lp=(lp1,lp2,,lpn,,lpD1),lzn=Wznzlpn=Wpnp
其中, Wzn,WpnW_z^n, W_p^nWzn,Wpn是乘积层的权重, D1D_1D1为该层的隐藏单元个数。这里的zzz指的所有特征域f1,f2,..fNf_1, f_2, ..f_Nf1,f2,..fN, 这里的ppp指的是两个embedding之间的互操作。这样定义的:
z=(z1,z2,…,zN)≜(f1,f2,…,fN)p={pi,j},i=1…N,j=1…N\begin{array}{l} z=\left(z_{1}, z_{2}, \ldots, z_{N}\right) \triangleq\left(f_{1}, f_{2}, \ldots, f_{N}\right) \\ p=\left\{p_{i, j}\right\}, i=1 \ldots N, j=1 \ldots N \end{array} z=(z1,z2,,zN)(f1,f2,,fN)p={pi,j},i=1N,j=1N
其中fi∈RM\boldsymbol{f}_{i} \in \mathbb{R}^{M}fiRMiii个域的embedding向量, pi,j=g(fi,fj)p_{i,j}=g(f_i,f_j)pi,j=g(fi,fj)定义为特征交互对, g(.)g(.)g(.)表示互操作的方式, 分为内积和外积两种操作方式。

这样看如果懵逼了的话, 其实是正常的, 反正我初次看的时候是懵逼的, 结合着图也没看明白说啥? 如果感觉没有懵的话, 那么lz,lpl_z, l_plz,lp的维度你能看出来是多少吗? lzn,lpnl_z^n, l_p^nlzn,lpn的维度又是多少? 哈哈 , 开个玩笑

AI上推荐 之 NeuralCF与PNN模型(改变特征交叉方式)相关推荐

  1. AI上推荐 之 AFM与DIN模型(当推荐系统遇上了注意力机制)

    1. 前言 随着信息技术和互联网的发展, 我们已经步入了一个信息过载的时代,这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战: 信息消费者:如何从大量的信息中找到自己感兴趣的信息? 信息生产 ...

  2. AI上推荐 之 逻辑回归模型与GBDT+LR(特征工程模型化的开端)

    1. 前言 随着信息技术和互联网的发展, 我们已经步入了一个信息过载的时代,这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战: 信息消费者:如何从大量的信息中找到自己感兴趣的信息? 信息生产 ...

  3. AI上推荐 之 AutoInt模型(Transformer开始玩特征交互)

    1. 写在前面 这段时间做优化模型的事情,正好和特征交互有关系,这个也是推荐系统里面一直探索的一个方向,从浅层模型的FM, FFM, HOFM, FwFM到深层模型的DNN, PNN, NFM, AF ...

  4. AI上推荐 之 SDM模型(建模用户长短期兴趣的Match模型)

    1. 写在前面 今天整理的是SDM模型(Sequential Deep Matching Model),依然是阿里团队在2019年CIKM上的一篇paper.和MIND模型一样,是一种序列召回模型,研 ...

  5. AI上推荐 之 YouTubeDNN模型(工业界推荐系统的灯火阑珊)

    1. 写在前面 这个系列很久没有更新了, 主要是前段时间经历了一波秋招, 后面的方向可能稍微偏数据挖掘和cv多一些,所以向这两块又稍微延展了一下,没来得及看推荐相关的论文,这次借着和如意大佬整理fun ...

  6. AI上推荐 之 基于内容的推荐(ContentBasedRecommend)

    1. 前言 随着信息技术和互联网的发展, 我们已经步入了一个信息过载的时代,这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战: 信息消费者:如何从大量的信息中找到自己感兴趣的信息? 信息生产 ...

  7. AI上推荐 之 MMOE(多任务yyds)

    1. 写在前面 这篇文章开始多任务模型的学习,算是把多任务模型这块的坑填一下哈哈. 随着推荐技术的蓬勃发展,目前越来越多的推荐场景,往往并不是单纯的优化一个指标,比如: 视频推荐领域: 推荐排序任务不 ...

  8. AI上推荐 之 多任务loss优化(自适应权重篇)

    1. 写在前面 在多任务学习中,往往会将多个相关的任务放在一起来学习.例如在推荐系统中,排序模型同时预估候选的点击率和浏览时间.相对于单任务学习,多任务学习有以下优势: 多个任务共享一个模型,占用内存 ...

  9. 特征筛选(2)——基于模型的特征筛选方法

    [Kaggle]Telco Customer Churn 电信用户流失预测案例 第三部分导读   在案例的第二部分中,我们详细介绍了常用特征转化方法,其中有些是模型训练之必须,如自然数编码.独热编码, ...

  10. 推荐系统(5)-深度推荐模型-AutoRec、DeepCrossing、NeuralCF、PNN、WideDeep、FNN、DeepFM、NFM

    GBDT+LR 1. AutoRec-2015 2. Deep Crossing-2016 3. NeuralCF-2016 4. PNN-2016 5. Wide&Deep-2016 6. ...

最新文章

  1. JPA关系映射之one-to-many和many-to-one
  2. AttributeError: 'NoneType' object has no attribute '__array_interface__'
  3. 云通讯短信验证码实例
  4. 数据库系统实训——实验四——视图
  5. 数据结构中三表合一的实现
  6. 差分隐私与机器学习的综述【笔记】
  7. idea 创建 spring 配置文件
  8. mysql优化-面试题
  9. 学英语---(2)脱口而出100句经典英语口语
  10. java 获取mongodb的连接数
  11. jQuery.获取子节点
  12. 超快速的端到端实例分割模型,手把手教你用opencv部署Yolact
  13. 概率密度,概率分布和联合概率分布
  14. linux上传下载覆盖文件的命令
  15. stm32f1系列直接存储器存取---DMA
  16. 春节不断电之机器学习 —— 决策树
  17. 送你4句口诀 云存储选型不再犯难
  18. [附源码]java毕业设计网上书店系统
  19. GC8418 数字光纤音频解码芯片 光纤解码芯片 MS8412替代
  20. [网络安全学习篇1]:windowsxp、windows2003、windows7、windows2008系统部署(千峰网络安全视频笔记)

热门文章

  1. 2008年最吸引眼球的10只股票
  2. Navicat Premium基本使用
  3. 【亲测】服务器事件查看器打不开报错,mmc无法创建管理单元怎么办
  4. 【iOS-Cocos2d游戏开发之十六】添加本地通知(UILocalNotification)以及添加系统组件滚动视图(UIScrollView)!【2011年11月15日更新】
  5. PHP实现域名whois查询的代码(数据源万网、新网)
  6. 深度学习-TextDetection
  7. [置顶] 而立之年——三线城市程序员的年终告白
  8. 【MFC】进度条:Progress Control控件
  9. 大数据发展与情报资源整合的关系探索
  10. 如何将多个mp3文件合并成一个?