NeuralCF
paper: Neural
Collaborative Filtering
矩阵分解
在协同过滤中提到可以用矩阵分解的方法来解决向量过于稀疏的问题。从深度学习的视角看待矩阵分解模型,那么矩阵分解层的用户隐向量和物品隐向量完全可以看作⼀种Embedding方法。
矩阵分解方法中,我们先将用户向量和物品向量通过一个权重矩阵映射成稠密的低维隐向量,然后再将两个隐向量求内积得到相似度,这⾥的“相似度”就是对评分的预测。
因为矩阵分解模型结构较为简单,实际使用往往会欠拟合。
NeuralCF
NeuralCF简单来说,就是用更加复杂的神经网络来替换矩阵分解中的内积操作。
GMF
GMF即广义的矩阵分解模型。矩阵分解模型中采用了内积的互操作方式。为了进⼀步让向量在各维度上进⾏充分交叉,可以通过求用户隐向量和物品隐向量的哈达玛积(即长度相等的向量对应位置相乘)得到一个新的向量,再将新向量通过一个线性层拟合预测目标。
这种方式跟传统的矩阵分解相比,相当于给哈达玛积的每个维度加上了一个权重(事实上,内积就等于哈达玛积各个维度之和,而线性层相当于把哈达玛积各个维度做加权和)。因此这种方法表达能力更强,但仍然比较有限。
MLP
可以用MLP来替代矩阵分解中的内积操作,这使得模型能够拟合更加复杂的情况。具体而言,这种方法会先将用户隐向量和物品隐向量进行拼接,然后通过多个全连接层,最后映射成一维来拟合预测目标。这种方法结构上与DNN十分相似。
混合方法
除了用单种互操作,还可以把通过不同互操作网络得到的特征向量拼接起来,交由输出层进⾏⽬标拟合。
neuralCF
上图整合了前面提到的GMF和MLP方法。首先在embedding层映射成两组用户隐向量和物品隐向量,分别用于GMF和MLP。然后将GMF和MLP生成的向量进行拼接进入输出层,最终拟合预测目标。
NeuralCF实际上是一个模型框架,基于⽤户向量和物品向量这两个Embedding层,利⽤不同的互操作层进行特征的交叉组合,并且可以灵活地进行不同互操作层的拼接。
由于基于协同过滤的思想,NeuralCF模型也是基于共现矩阵,并没有引入更多其他类型的特征。
PNN
paper: Product-based
Neural Networks for User Response Prediction
PNN模型的提出同样是为了解决CTR预估问题。PNN使用乘积层(Product
Layer)代替了Deep
Crossing模型的stacking层,从而更有针对性地获取特征之间的交叉信息。在其余部分,PNN与Deep
Crossing基本相同,因此在此重点讨论PNN模型的乘积层。
pnn
如模型图所示,PNN的乘积层分为Z部分和P部分。其中Z部分较为简单,实际上就是所有特征的embedding向量直接进行拼接,在图中表现为所有特征都乘以常量1。
复杂的是P部分。P部分的元素。这里的g是一个可替换的映射函数,是特征的embedding向量。
在得到Z和P之后,两部分先分别映射成维的向量,然后再进行拼接输入上层神经网络。
关于g函数论文里给出了内积和外积两种映射方法。
内积
一种方法是对所有特征的embedding向量两两做内积运算:
两个向量的内积是一个标量,因此最终P是一个N×N矩阵(N为特征域数量)。设embedding维度为M,则每次求内积复杂度为O(M),求P矩阵的复杂度为。
接下来看P矩阵如何映射成向量。
从P到事实上就是一个全连接网络。对于向量中的每个元素,有。其中⊙表示内积。容易看出这一部分的复杂度为。
复杂度可通过矩阵分解进行优化。
外积
使用外积操作时,g函数变为了:
两个embedding向量求外积的结果是M×M矩阵,因此生成的P是一个N×N×M×M的张量。显然会产生很大的时间复杂度。论文中提出使用“叠加”的方法来降低时间复杂度,也就是直接对所有外积进行求和:
可以看出,叠加矩阵P就是让所有embedding向量做一个sum
pooling,再进行外积操作,最终得到的P是个M×M矩阵。
这样做虽然降低了复杂度,但是会丢失很多有价值的信息。比如,年龄和性别两个特征不在同一个向量空间中,不具备任何可比性,因此强行相加不具备实际意义。而同类的embedding可以进行相加,比如将⽤户浏览过的多个物品的embedding进⾏平均。
相比于全连接层无差别化的处理,PNN模型更有针对性地强调了不同特征之间的交互,从而让模型更容易捕获特征的交叉信息。
PNN模型的局限性在于,为了优化训练效率而采用的大量简化操作会丢失有价值的信息,并且对所有特征进行无差别的交叉忽略了原始特征向量中包含的有价值信息。
Wide&Deep
paper: Wide & Deep
Learning for Recommender Systems
Wide&Deep模型由单层的wide部分和多层的deep部分组成,使模型兼具逻辑回归的记忆能力和深层神经网络的泛化能力。
- 记忆能力:模型直接学习并利用历史数据中物品或特征的共现频率的能力。
- 泛化能力:模型传递特征的相关性,以及发掘稀疏特征与最终标签相关性的能力。
有些特征对最终标签有直接的影响,这样的特征称为“强特征”。对于这样的特征,使用协同过滤、逻辑回归这样简单的模型可以让模型记住这些特征对推荐结果强有力的影响。使用深层神经网络特征会被反复交叉,模型对特征的记忆反而没有那么深刻。
而深度神经网络这样复杂的网络的优势在于:
- 引入了隐向量,使得数据稀少的用户和物品也能生成隐向量,将全局数据传递到稀疏物品上。
- 特征多次自动组合,可以深度挖掘数据中的潜在模式。
Wide&Deep模型将简单模型和深度神经网络结合在一起:
Wide&Deep
Google
Play团队将已安装应用和曝光应用作为wide部分的输入。这个选择是基于业务理解进行的。这两个特征经过Embedding之后同样会作为deep部分的输入。
Wide部分
以已安装应用和曝光应用两个特征为例。Wide部分组合这两个特征的函数被称为交叉积变换函数:
当第i个特征属于第k个组合特征时,的值为1,否则为0。d为输入特征的维度,输入特征为。
这个函数乍一看很不直观,事实上它非常简单,我们可以通过例子来理解。
例如第k个组合特征为AND(user_installe
d_app=netflix,impression_app=pandora),则只有当“user_installed_app=netflix”和“impression_app=pandora”这两个特征同时为1时,才为1,否则为0。
为什么呢?假设user_installed_app=netflix这个特征为,值为0,则,故而最后连乘的结果也为0。有(0, 0)、(0, 1)、(1,
0)、(1, 1)这四种组合情况,只有当出现(0, 1)这种情况时,才会为0。
以上是论文中举的例子,如果这个例子还是比较费解也没关系,这里将举一个更详细的例子。
假设有抖音、bilibili、小红书三款app,则输入的向量为,前三个维度表示用户是否安装抖音、bilibili、小红书,后三个维度表示抖音、bilibili、小红书三个app是否曝光过。经过交叉积变化可以得到一个维度为9的向量。如果输入的向量为[1, 0,
0]和[0, 0,
1],则表示用户已安装了抖音并且已向其曝光小红书。那么组合的结果为[0, 0,
0, 0, 0, 0, 1, 0,
0],其中第7个维度表示(已安装应用=抖音,曝光应用=小红书)的组合。事实上,输出向量的维度可以经过人工筛选出一些特征组合。
Deep部分
Deep部分实际上就是深度神经网络,将稀疏特征进行embedding,和稠密变量拼接后进入MLP网络。
Deep&Cross
paper: DCN:Deep &
Cross Network for Ad Click Predictions
Wide&Deep模型的Wide部分需要经过人工筛选,十分繁琐。如果特征组合使用二阶FM表达能力会不足,用高阶的则复杂度会过高。
Deep&Cross的主要思想使用Cross网络替代原来的Wide部分。Cross网络可以进行自动的特征交叉,并且复杂度是线性的。
从模型图可以看出,DCN网络同样是将稀疏特征进行embedding,然后和稠密特征进行拼接,分别进入Cross网络和深度网络,再将两个网络的输出连接后进入输出层。
DCN
Cross网络
Cross网络的目的是增加特征之间的交互力度。假设第l层交叉层的输出向量为,那么第l+1层的输出向量为: 
每个交叉层首先对求外积,然后乘以一个权重向量,在加上偏置向量和得到输出。
我们可以看到每一层的将上一层的输出作为一个加项。这类似于残差网络,使得输出不会偏离太多。
交叉层通过求外积的方式实现了特征交叉。
举个简单的例子,假设,则: 可以看出包含了所有特征的二阶项。同理,可以获得更加高阶的交叉。
FM与深度学习的结合
FNN
paper: Deep learning over
multi-field categorical data- Acase study on user response
prediction
FNN的核心在于使用FM的隐向量完成Embedding层的初始化。
神经网络的参数初始化往往采用随机初始化。由于Embedding层的输入极端稀疏,而且Embedding层的参数量十分庞大,往往占据整个神经网络的大半,因此Embedding层的收敛速度非常缓慢。
FNN用FM模型训练好的各特征隐向量初始化Embedding层参数,使得初始化的参数更加接近目标最优点,加速神经网络收敛。
FM的函数如下: FM会给每个特征i训练一个隐向量。我们使用这些隐向量来初始化Embedding层的权重。具体而言,假设FM隐向量的维度为m,第i个特征域的第k维特征的隐向量是,那么隐向量的第l维
就会成为连接输⼊神经元k和Embedding神经元l之间连接权重的初始值。注意我们在训练FM时是没有划分特征域的,但在embedding时则需要每个特征域都会有对应的embedding层。
举个例子。假如特征域i有3个维度,即输入神经元有3个。这三个维度对应的隐向量分别为,那么对应的embedding向量维度应该为2(embedding向量的维度),这个embedding向量会初始化为
FNN模型存在很多不足,例如:
- 两阶段的训练模型,应用过程不太方便,且调参困难;
- 模型能力受限于FM表征能力的上限;
- 只关注于高阶组合特征交叉,容易丢失记忆能力;
但是FNN为embedding预训练提供了借鉴思路。
DeepFM
paper: DeepFM: A
Factorization-Machine based Neural Network for CTR Prediction
DeepFM同样是对Wide&Deep模型的改进。Wide&Deep模型的Wide部分不具备自动的特征组合能力,往往需要人为地进行特征的选择,这一过程十分繁琐,并且人的经验不一定可靠。Deep&Cross模型同样是基于此进行改进。Deep&Cross使用Cross网络代替Wide部分,而DeepFM使用FM来代替Wide部分。
DeepFM
DeepFM的FM部分和DNN部分共享相同的Embedding层。图中的权重1连接是默认权重为1的连接,权重不需要进行训练;而标准连接的权重需要进行训练。
再来回忆一下FM的函数:
在DeepFM模型中,FM层由一阶部分和二阶部分构成。FM层的一阶部分对输入的稀疏特征求加权和,即图中FM层的加法操作;FM层的二阶部分直接使用embedding向量作为隐向量,即将特征Embedding后的结果两两作内积。
DNN部分与常规的模型没有什么区别,这里不再说明。
模型最后的输出为
论文作者将DeepFM与其他模型进行了比较,具体在前面介绍其他模型时有所提及,这里不再展开。
DeepFM与其他模型比较
NFM
paper: Neural
Factorization Machines for Sparse Predictive Analytics
FM一般只能进行二阶的特征交叉,如果扩展到三阶以上会导致复杂度极高,这限制了FM模型的表达能力。NFM的核心思路在于,用一个表达能力更强的函数替代原FM中二阶隐向量内积的部分,即:
NFM使用深度学习网络来替代FM的二阶部分,其模型结构如下:
NFM
NFM在embedding层和DNN之间引入了一个特征交叉池化层(Bi-Interaction
Pooling),该层的数学表示为:
这个池化层和FM二阶部分的区别在于,这里用的是元素积,而FM用的是内积。事实上,内积就相当于把元素积的所有维度进行求和。
在经过池化后,向量继续进入上层神经网络。
相比于FM,NFM能进行更高阶的交叉。
相比于DNN,NFM在低层就能学到包含更多信息的组合特征,使后续隐藏层能更容易学到有用的高阶交叉特征,只需要很少的隐藏层就可以学到高阶的特征信息,使得模型结构更浅更简单。
图中的NFM忽略了低阶特征。如果加入一阶部分,相当于在Wide&Deep的Deep部分加入了特征交叉池化层,加强了特征交叉。
DIN
paper: Deep Interest
Network for Click-Through Rate Prediction
DIN是阿里巴巴针对电商广告推荐提出的模型。DIN引入了用户历史行为特征。作者认为用户兴趣多种多样且变化多端,而用户的兴趣往往蕴含在其历史行为中。因此考虑用户的历史行为对于用户是否会点击广告很有帮助。DIN模型考虑用户的历史交互商品与当前商品广告的相关性,模拟出用户对目标商品的感兴趣程度,并将之作为一个特征输入模型。
模型结构
用户历史行为特征包括点击过的商品、店铺、类目等,对于用户的历史行为特征,DIN采用multi-hot的编码方式。
DIN
如模型结构图所示,在DIN的注意力机制中,候选广告作为query,用户历史行为特征作为key和value。key和query通过activation
unit计算得到注意力分数(可以认为是每一个历史交互物品和候选广告的相关性),并使用注意力分数对value进行加权得到用户的兴趣表示。
这个过程可以理解为从用户的历史交互物品中提取出和候选广告相关的部分并进行加总。得到的向量是用户和候选物品相关的兴趣表示。这个向量和其他特征进行拼接,进入上层神经网络。
Activation
unit的输入为key和value。key和value求元素积,并将其元素积、key、value三者拼接输入上层神经网络,得到最终的注意力分数(很多代码复现这里还加入了key和value之差,但我在原论文中似乎未找到关于这项操作的说明,可以根据实际效果进行激活单元结构的选择)。
训练细节
Mini-batch正则化
模型训练往往会产生过拟合的现象,常规的防止过拟合的做法有L1、L2正则化、dropout等。但在DIN的训练中,这些效果都不是很好。
当参数量过于庞大时,使用L1和L2正则化计算量会非常庞大。当不进行正则化时,使用SGD只需要更新当前batch非零稀疏特征的参数。而加入正则化后,每个batch都需要计算全部参数的l1或l2范数。
作者提出一种叫mini-batch aware
regularization的方法,只需要计算每个小批次出现的稀疏特征参数的l2范数:
在这个函数中,是整个embedding矩阵,其中D是embedding向量的维度,K是总特征数。B是小批次的数量。。表示是否非零。表示该mini-batch中特征j为1的样本数,因为这个函数会遍历整个输入特征矩阵(batch_size×K),每出现一次都会加一遍,因此需要除以以保证只加了一遍。
进一步地,我们可以用表示小批次中是否存在第j个特征非零,然后将正则项近似为:
这与原来的函数区别在于,每项的系数不再固定为1了,而变成了。这意味着出现次数更多的特征会受到更小的惩罚。
Dice激活函数
PReLU是一个常用的激活函数,其定义如下: 其中。PReLU将0作为一个分界点,当每一层的输入有着不一样的分布时,固定地将0作为分界点并不合适。因此作者提出了Dice激活函数:
其中E[s]和Var[s]分别表示小批次的均值和方差。ϵ被设为常量。这里p(s)相当于对s进行标准化操作后再求sigmoid。这样p(s)就变成了一条平滑的曲线,并且曲线的中点为E[s]。Var[s]影响了p(s)函数的胖瘦,Var[s]越大,p(s)越胖。
PReLU和Dice
DIEN
paper: Deep Interest
Evolution Network for Click-Through Rate Prediction
DIN将用户的兴趣考虑了进去。但是DIN所用的方法并不完全贴合实际情况,主要体现在用户的行为和兴趣并不完全等价,我们很难通过表现出来的行为去挖掘用户潜在的兴趣。DIN忽略了用户历史行为的序列信息,即只是基于所有历史购买行为综合推荐,而不是针对“下一次购买”推荐。
论文提出,人的兴趣是多种多样的,同一时刻下有着多种不同的兴趣,应该用兴趣状态来描述。每个兴趣都是动态变化的,都有属于它们各自的演化过程。并且兴趣的发展是有一定前后关联的。兴趣的多样性导致了兴趣漂移的现象:在相邻的访问中,用户的兴趣可能会存在很大的不同,并且用户的某个行为可能取决于很久前的行为。
基于兴趣的这些特点,作者引入了GRU的结构来从用户的序列信息中提取出用户的兴趣状态,模拟用户兴趣的演化规律。其中关键在于:
- 从用户的历史行为中抽取出用户各个时刻下的兴趣状态;
- 利用注意力机制找到与候选广告相关的那部分兴趣的演化过程,判断用户下一时刻对该兴趣的感兴趣程度。
DIEN使用兴趣进化网络(下图中彩色部分)来替换DIN中关于用户兴趣的embedding部分。兴趣进化网络分为行为序列层、兴趣抽取层、兴趣进化层三层,其中行为序列层与普通的embedding层一致,模拟用户兴趣的关键在于兴趣抽取层和兴趣进化层。
DIEN
兴趣抽取层
兴趣抽取层的基本结构是GRU。相比RNN,GRU解决了梯度消失的问题;相比LSTM,GRU的参数量更少。兴趣抽取层的作用在于,挖掘并提取出每个时刻下用户行为背后隐藏的兴趣状态。
每个GRU单元的公式如下: 其中是输入状态向量,也就是行为序列层的Embedding向量e(t),代表了用户的第t个行为。是GRU网络中第t个隐状态向量。表示元素积。
然而,隐状态向量仅捕获行为间的依赖关系,并不能有效表示兴趣。由于点击行为只和最终兴趣有关,因此常规的交叉熵损失函数只能监督最终的兴趣预测,而(t<T)不能得到有效的监督。因此,作者又提出了辅助损失,使用行为来监督兴趣状态的学习。除了使用真实的作为正样本以外,还从其他物品中选取一个作为负样本,这样就构成了一对正负样本(如模型图中的Auxiliary
Loss部分)。表示第b个样本第t+1个行为的embedding向量。辅助损失函数为:
其中。表示用户i的第t个隐藏状态。会乘以一个系数后加入到总损失中。
兴趣进化层
前面提到,兴趣具有多样性,并且存在兴趣漂移的现象。兴趣之间虽然可以相互影响,但每种兴趣都有其自己的进化路径。兴趣进化层的作用就在于,模拟与目标广告相关的兴趣进化路径。我们所关心的是和目标广告相关的兴趣,因此在兴趣进化层使用了注意力机制来提取出这部分兴趣。
兴趣进化层采用的注意力得分计算公式为: 其中为目标广告,计算出和的相关性,随后通过softmax进行归一化处理。这里的注意力分数计算也可以使用更加复杂的模型,比如使用DIN的activation
unit,以目标广告为query,隐状态向量为key。
随后将使用注意力得分和兴趣抽取层的输出作为输入,计算出兴趣进化层的隐状态。这个计算过程结合了注意力机制和GRU,作者介绍了几种方法。
AIGRU
GRU with attentional input
(AIGRU)直接使用注意力分数来影响兴趣进化层的输入,即: AIGRU的想法非常简单,就是使用注意力分数对进行放缩。但AIGRU的效果并不好,因为即便为0,即当前行为与目标广告完全无关,隐状态向量仍然会发生变化(若当前行为与目标广告完全无关,则我们期待的结果应该是,但AIGRU显然无法满足)。
AGRU
Attention based GRU(AGRU)的做法是用替换掉了更新门,即: 这种做法下,当为0时,隐状态将保留上一个时刻的状态。并且越大,对隐状态的更新程度也将越高。然而,因为是个标量,而被替换掉的更新门是个向量,会导致每个维度上乘以的系数变得一样,从而忽略了不同维度的重要性差异。
AUGRU
GRUwithattentional update gate (AUGRU)对AGRU进行了进一步改进: 相比于AGRU直接用替换掉更新门,AUGRU只是使用作为更新门的权重,这样既保留了AGRU的优点,又保留了不同维度的重要性差异。如此一来,每一步的局部激活都能强化相关兴趣的作用,减弱兴趣漂移的干扰。