推荐算法丨经典模型梳理
NeuralCF
paper: Neural Collaborative Filtering
矩阵分解
在协同过滤中提到可以用矩阵分解的方法来解决向量过于稀疏的问题。从深度学习的视角看待矩阵分解模型,那么矩阵分解层的用户隐向量和物品隐向量完全可以看作⼀种Embedding方法。
矩阵分解方法中,我们先将用户向量和物品向量通过一个权重矩阵映射成稠密的低维隐向量,然后再将两个隐向量求内积得到相似度,这⾥的“相似度”就是对评分的预测。
因为矩阵分解模型结构较为简单,实际使用往往会欠拟合。
NeuralCF
NeuralCF简单来说,就是用更加复杂的神经网络来替换矩阵分解中的内积操作。
GMF
GMF即广义的矩阵分解模型。矩阵分解模型中采用了内积的互操作方式。为了进⼀步让向量在各维度上进⾏充分交叉,可以通过求用户隐向量和物品隐向量的哈达玛积(即长度相等的向量对应位置相乘)得到一个新的向量,再将新向量通过一个线性层拟合预测目标。
这种方式跟传统的矩阵分解相比,相当于给哈达玛积的每个维度加上了一个权重(事实上,内积就等于哈达玛积各个维度之和,而线性层相当于把哈达玛积各个维度做加权和)。因此这种方法表达能力更强,但仍然比较有限。
MLP
可以用MLP来替代矩阵分解中的内积操作,这使得模型能够拟合更加复杂的情况。具体而言,这种方法会先将用户隐向量和物品隐向量进行拼接,然后通过多个全连接层,最后映射成一维来拟合预测目标。这种方法结构上与DNN十分相似。
混合方法
除了用单种互操作,还可以把通过不同互操作网络得到的特征向量拼接起来,交由输出层进⾏⽬标拟合。
上图整合了前面提到的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的乘积层分为Z部分和P部分。其中Z部分较为简单,实际上就是所有特征的embedding向量直接进行拼接,在图中表现为所有特征都乘以常量1。
复杂的是P部分。P部分的元素
在得到Z和P之后,两部分先分别映射成
关于g函数论文里给出了内积和外积两种映射方法。
内积
一种方法是对所有特征的embedding向量两两做内积运算:
接下来看P矩阵如何映射成
从P到
复杂度可通过矩阵分解进行优化。
外积
使用外积操作时,g函数变为了:
这样做虽然降低了复杂度,但是会丢失很多有价值的信息。比如,年龄和性别两个特征不在同一个向量空间中,不具备任何可比性,因此强行相加不具备实际意义。而同类的embedding可以进行相加,比如将⽤户浏览过的多个物品的embedding进⾏平均。
相比于全连接层无差别化的处理,PNN模型更有针对性地强调了不同特征之间的交互,从而让模型更容易捕获特征的交叉信息。
PNN模型的局限性在于,为了优化训练效率而采用的大量简化操作会丢失有价值的信息,并且对所有特征进行无差别的交叉忽略了原始特征向量中包含的有价值信息。
Wide&Deep
paper: Wide & Deep Learning for Recommender Systems
Wide&Deep模型由单层的wide部分和多层的deep部分组成,使模型兼具逻辑回归的记忆能力和深层神经网络的泛化能力。
- 记忆能力:模型直接学习并利用历史数据中物品或特征的共现频率的能力。
- 泛化能力:模型传递特征的相关性,以及发掘稀疏特征与最终标签相关性的能力。
有些特征对最终标签有直接的影响,这样的特征称为“强特征”。对于这样的特征,使用协同过滤、逻辑回归这样简单的模型可以让模型记住这些特征对推荐结果强有力的影响。使用深层神经网络特征会被反复交叉,模型对特征的记忆反而没有那么深刻。
而深度神经网络这样复杂的网络的优势在于:
- 引入了隐向量,使得数据稀少的用户和物品也能生成隐向量,将全局数据传递到稀疏物品上。
- 特征多次自动组合,可以深度挖掘数据中的潜在模式。
Wide&Deep模型将简单模型和深度神经网络结合在一起:
Google Play团队将已安装应用和曝光应用作为wide部分的输入。这个选择是基于业务理解进行的。这两个特征经过Embedding之后同样会作为deep部分的输入。
Wide部分
以已安装应用和曝光应用两个特征为例。Wide部分组合这两个特征的函数被称为交叉积变换函数:
这个函数乍一看很不直观,事实上它非常简单,我们可以通过例子来理解。
例如第k个组合特征为AND(user_installe
d_app=netflix,impression_app=pandora),则只有当“user_installed_app=netflix”和“impression_app=pandora”这两个特征同时为1时,
为什么呢?假设user_installed_app=netflix这个特征为
以上是论文中举的例子,如果这个例子还是比较费解也没关系,这里将举一个更详细的例子。
假设有抖音、bilibili、小红书三款app,则输入的向量为
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网络和深度网络,再将两个网络的输出连接后进入输出层。
Cross网络
Cross网络的目的是增加特征之间的交互力度。假设第l层交叉层的输出向量为
每个交叉层首先对
我们可以看到每一层的将上一层的输出作为一个加项。这类似于残差网络,使得输出不会偏离太多。
交叉层通过求外积的方式实现了特征交叉。
举个简单的例子,假设
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的函数如下:
举个例子。假如特征域i有3个维度,即输入神经元有3个。这三个维度对应的隐向量分别为
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的FM部分和DNN部分共享相同的Embedding层。图中的权重1连接是默认权重为1的连接,权重不需要进行训练;而标准连接的权重需要进行训练。
再来回忆一下FM的函数:
DNN部分与常规的模型没有什么区别,这里不再说明。
模型最后的输出为
论文作者将DeepFM与其他模型进行了比较,具体在前面介绍其他模型时有所提及,这里不再展开。
NFM
paper: Neural Factorization Machines for Sparse Predictive Analytics
FM一般只能进行二阶的特征交叉,如果扩展到三阶以上会导致复杂度极高,这限制了FM模型的表达能力。NFM的核心思路在于,用一个表达能力更强的函数替代原FM中二阶隐向量内积的部分,即:
NFM在embedding层和DNN之间引入了一个特征交叉池化层(Bi-Interaction
Pooling),该层的数学表示为:
在经过池化后,向量继续进入上层神经网络。
相比于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的注意力机制中,候选广告作为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范数:
进一步地,我们可以用
Dice激活函数
PReLU是一个常用的激活函数,其定义如下:
DIEN
paper: Deep Interest Evolution Network for Click-Through Rate Prediction
DIN将用户的兴趣考虑了进去。但是DIN所用的方法并不完全贴合实际情况,主要体现在用户的行为和兴趣并不完全等价,我们很难通过表现出来的行为去挖掘用户潜在的兴趣。DIN忽略了用户历史行为的序列信息,即只是基于所有历史购买行为综合推荐,而不是针对“下一次购买”推荐。
论文提出,人的兴趣是多种多样的,同一时刻下有着多种不同的兴趣,应该用兴趣状态来描述。每个兴趣都是动态变化的,都有属于它们各自的演化过程。并且兴趣的发展是有一定前后关联的。兴趣的多样性导致了兴趣漂移的现象:在相邻的访问中,用户的兴趣可能会存在很大的不同,并且用户的某个行为可能取决于很久前的行为。
基于兴趣的这些特点,作者引入了GRU的结构来从用户的序列信息中提取出用户的兴趣状态,模拟用户兴趣的演化规律。其中关键在于:
- 从用户的历史行为中抽取出用户各个时刻下的兴趣状态;
- 利用注意力机制找到与候选广告相关的那部分兴趣的演化过程,判断用户下一时刻对该兴趣的感兴趣程度。
DIEN使用兴趣进化网络(下图中彩色部分)来替换DIN中关于用户兴趣的embedding部分。兴趣进化网络分为行为序列层、兴趣抽取层、兴趣进化层三层,其中行为序列层与普通的embedding层一致,模拟用户兴趣的关键在于兴趣抽取层和兴趣进化层。
兴趣抽取层
兴趣抽取层的基本结构是GRU。相比RNN,GRU解决了梯度消失的问题;相比LSTM,GRU的参数量更少。兴趣抽取层的作用在于,挖掘并提取出每个时刻下用户行为背后隐藏的兴趣状态。
每个GRU单元的公式如下:
然而,隐状态向量
兴趣进化层
前面提到,兴趣具有多样性,并且存在兴趣漂移的现象。兴趣之间虽然可以相互影响,但每种兴趣都有其自己的进化路径。兴趣进化层的作用就在于,模拟与目标广告相关的兴趣进化路径。我们所关心的是和目标广告相关的兴趣,因此在兴趣进化层使用了注意力机制来提取出这部分兴趣。
兴趣进化层采用的注意力得分计算公式为:
随后将使用注意力得分和兴趣抽取层的输出
AIGRU
GRU with attentional input
(AIGRU)直接使用注意力分数来影响兴趣进化层的输入,即:
AGRU
Attention based GRU(AGRU)的做法是用
AUGRU
GRUwithattentional update gate (AUGRU)对AGRU进行了进一步改进: