0%

推荐系统论文笔记

本文主要介绍一些自己阅读推荐统的论文笔记,会不定期更新,目前是排序学习的一些相关论文。

  • 排序是对一组物品列表按照某种方式进行排序,来最大化整个列表的效用的过程,广泛应用于搜索引擎、推荐系统、机器翻译、对话系统甚至计算生物学。一些监督机器学习技术经常被广泛应用在这些问题中,这些技术称作排序学习技术。

《DeepFM: A Factorization-Machine based Neural Network for CTR Prediction》

介绍

DeepFM是2017年提出的一种端到端模型,它解决了Wide & Deep Learning中手工设计特征的问题。DeepFM融合了Factorization Machine(FM)的推荐优势和Deep Learing的特征提取优势。其中FM部分能够建模特征间的低阶关联,Deep部分能够建模特征间的高阶关联。

DeepFM的主要优势如下:

  • FM+DNN:FM部分实现低阶的特征提取,DNN实现高阶的特征提取。同时无需做特征工程。
  • 训练高效:DeepFM的FM部分和Deep部分共享同一输入向量和嵌入向量。

DeepFM方法详解

假设数据集包含$n$个样本$(\mathbf{x},y)$,其中$y$是标签,取0和1;$\mathbf{x}$是由m个fields组成的数据,每条数据由$(u,i)$数据对组成,$u$和$i$分别指的是点播影院辅助信息和影片描述特征,它们可以包括类别字段(比如点播影院的省份、城市、影片的类型等),又可以包括连续值特征(比如影片评分等),其中类别型特征使用one-hot方式来表示,连续值特征先根据其分布离散化后,再使用one-hot方式表示。

DeepFM

DeepFM包含两部分:FM部分与Deep部分,分别负责低阶特征的提取和高阶特征的提取。这两部分共享同样的输入。对于特征$i$,标量$w_i$ 用于表示其一阶权重。隐向量$\mathbf{v}_i$用以表示特征$i$与其他特征之间的相互作用。$\mathbf{v}_i$在FM部分是用以对2阶特征进行建模,即特征之间的相互作用;$\mathbf{v}_i$输入到Deep部分则是用以进行高阶特征建模。DeepFM的预测结果可以写为:

DeepFM的框架如下:

上图是,它将Wide&Deep Learning中的Wide组件使用FM替换,并且两部分共享同一输入向量和嵌入向量。

其中最下面的稀疏特征层中,黄色圈和蓝色圈表示经过one-hot编码后原始稀疏特征(分别取值1和0),可以看到每个field中的黄色圈都有一条直接指向FM层中的Addition黑色的线,这代表FM中的一阶项;由Dense Embeddings层中指向FM的红色线代表的是FM模型中二阶项的$w_{ij}=⟨\mathbf{v}_i,\mathbf{v}_j⟩$中的$\mathbf{v}_i$和$\mathbf{v}_j$;而指向Deep部分中的黑色的线是稀疏特征嵌入后的稠密特征。

另外,之所以说不需要人工特征工程,是因为交叉特征工作是模型自动进行的,在输入侧不需要手动进行交叉特征处理。

FM部分

FM部分是一个因子分解机。因为引入了隐变量的原因,对于几乎不出现或者很少出现的隐变量,FM也可以很好的学习。

FM的输出公式如下:

Deep部分

深度部分是一个前馈神经网络,用以获取高阶特征间相互作用。与图像或者语音这类连续而且密集的输入不同,它的的输入一般是极其稀疏,超高维,离散型和连续型混合且多字段的。因此这儿需要在第一层隐含层之前,引入一个嵌入层来将输入向量压缩到低维稠密向量。

嵌入层的网络结构如下:

这个网络结构有两个关键点:

  • 虽然输入的每个field向量长度不一样,但是它们embedding出来的长度是固定的,上图示例的嵌入长度是k=5;
  • FM中的隐向量$V$作为该嵌入层的权重矩阵,以实现输入的field向量压缩到embedding向量的转换。隐向量$v_{ik}$是嵌入层中第i个field连接到嵌入层第k个节点的权重。

这里的第二点可以这样理解:假设我们的k=5,首先,对于输入的一条记录,同一个field 只有一个位置是1,那么在由输入得到dense向量的过程中,输入层只有一个神经元起作用,得到的dense向量其实就是输入层embedding层该神经元相连的五条线的权重,即$v{i1},v{i2},v{i3},v{i4},v_{i5}$ 。这五个值组合起来就是我们在FM中所提到的$\mathbf{v}_i$,在FM部分和DNN部分,这一块是共享权重的,对同一个特征来说,得到的$\mathbf{v}_i$是相同的。

与其他神经网络的关系

下面是FNN、PNN和Wide&Deep模型框架:

FNN是一个FM初始化的前馈神经网络,与DeepFM不同,它是用FM预训练出来的$V$来对Deep部分进行初始化,仅提取到了高阶特征,它有两个限制。

  • 嵌入层参数可能受FM影响过大。
  • 预训练阶段引入的开销降低了效率。

PNN为了捕获高阶交叉特征,PNN在嵌入层和第一层隐藏层之间增加了一个product层,根据 product 的不同,衍生出三种 PNN:IPNN,OPNN,PNN* 分别对应内积、外积、两者混合。和FNN一样,它只能学习到高阶的特征组合,没有对于1阶和2阶特征进行建模。

Wide&Deep将Wide组件和Deep组件进行融合,同时学习低阶和高阶特征,但是wide部分需要人工构造交叉特征。

下面是它们关于是否需要预训练、是否提取了高阶、低阶特征以及是否需要特征工程的比较:

实验部分

在这篇论文的实验部分中,介绍了所使用的数据集Criteo Dataset和Company∗ Dataset、评估指标AUC和Logloss、性能评估(CPU训练时间和GPU训练时间)、以及超参数学习(包括激活函数、弃权(Dropout)概率、每层神经元数目、隐藏层数目和网络形状)。

《BPR: Bayesian Personalized Ranking from Implicit Feedback》

介绍

目前排序算法大致被分为三类,分别是点对排序(Pointwise)、成对排序(Pairwise)和列表排序(Listwise)。BPR(Bayesian Personalized Ranking,贝叶斯个性化排序)就是属于成对方法(Pairwise)中的一种,成对排序对物品顺序关系是否合理进行判断,判断任意两个物品组成的物品对$$,是否满足顺序关系,从而最终完成物品的排序任务来得到推荐列表。

BPR建模思路

它基于这样的假设,比起其他没有被交互过的物品而言,用户更喜爱对交互过物品(而对于用户交互过的物品对之间不假设偏序关系,同样,对于用户没有交互过的物品对之间也不假设偏序关系)。从而将 “用户-物品 ”交互矩阵可以转换为物品对偏序关系矩阵。如下图所示:

上述是交互矩阵转换为物品偏序对矩阵的过程。所有用户的物品偏序对矩阵可以表示成3元组$< u,i,j >$,该三元组的含义为:相对于物品$j$,用更喜欢物品$i$,使用符号$i >u j$表示。令$D_s = {(u,i,j)|i \in I_u^+ \cap j \in I \backslash I_u^+ }$。$I{u}^{+}$表示用户$u$交互过的物品集合,同理,$U_{i}^{+}$表示与物品$i$交互过的用户集合,

在此基础上 ,作者提出了基于贝叶斯的个性化排序算法,其目标是最大化物品排序的后验概率。它有如下两个假设:一是每个用户对物品的偏好与其他用户无关,即,用户的偏好行为相互独立;二是每个用户在物品$i$和物品$j$之间的偏好和其他商品无关,即,每个用户对不同物品的偏序相互独立。

在BPR中,排序关系符号$>_u$满足完整性、反对称性和传递性,即对于用户集$U$和物品集$I$:

  1. 完整性:$\forall i,j\in I:i\neq j \Rightarrow i >_u j \cup j>_ui$
  2. 反对称性:$\forall i,j\in I:i>_uj \cap j>_ui\Rightarrow i=j$
  3. 传递性:$\forall i,j,k\in I:i>_uj \cap j>_uk\Rightarrow i>_uk$

另外,BPR用到了和funkSVD相似的矩阵分解模型,它满足:

其中左边$\overline{X}$表示BPR对于用户$U$和物品集$I$的对应的$U\times I$的预测排序矩阵,右边$H^T$分别表示希望得到的分解后的用户矩阵$W(|U|\times k)$和物品矩阵$H(|I|\times k)$。BPR是基于用户维度的,故,对于任意一个用户$u$,对应的任一个物品$i$,我们期望有:

最终目标是希望找到合适的矩阵$W$和$H$,让$\overline{X}$和$X$最相似。下面第3部分BPR的优化思路部分会介绍它和funkSVD有何不同。

BPR的算法优化思路

BPR基于最大后验估计$P(W,H|>_u)$来求解模型参数$W,H$,这里我们用$\Theta$来表示模型的参数$W,H$,$>_u$代表用户$u$对应所有商品的全序关系,则优化目标是$P(\Theta|>_u)$。根据贝叶斯公式,我们有:

由于我们求解假设了用户的排序和其他用户无关,那么对任意用户$u$来说,$P(>_u)$对所有的物品一样,所以有:

可以看出优化目标转化为两部分。$P(>_u|\Theta)$和样本数据集$D_s$有关,$P(\Theta)$和样本数据集$D_s$无关。

对于第一部分(似然部分),我们假设了用户之间偏好独立,对不同商品偏序独立,故有:

其中,

根据第2部分介绍到的完整性和反对称性,优化目标的第一部分可以简化为:

而对于$P(i>_uj|\Theta)$这个概率,我们可以使用下面这个式子来代替:

其中$\sigma(x)$是sigmoid函数,对于$\overline{x}{uij}(\Theta)$,我们要满足当$i>_uj$时,$\overline{x}{uij}(\Theta)>0$,反之,当$j >u i$时,$\overline{x}{uij}(\Theta)<0$;那么最简单表示这个性质的方法就是:

而$\overline{x}{ui},\overline{x}{uj}$就是矩阵$\overline{X}$对应位置的值,为了方便,暂不写$\Theta$;最终,第一部分的优化目标转化为:

对于第二部$P(\Theta)$,即,先验部分,可以根据参数的假设分布选择,如高斯分布:均值为0,协方差矩阵是$\lambda_\Theta I$,如下:

其中$\lambda_\Theta $是模型的正则化参数。最终,可以得到最大对数后验估计函数:

由于

我们求偏导可以得到如下式子:

BPR的算法流程

下面简要总结下BPR的算法训练流程:

输入:训练集$D_s$三元组,梯度步长$\alpha$, 正则化参数$\lambda$,分解矩阵维度$k$。          

输出:模型参数,矩阵W,H。

  1. 随机初始化矩阵$W,H$

  2. 迭代更新参数:

  3. 如果$W,H$收敛,则算法结束,输出$W,H$;否则回到步骤2。

当我们得到$W,H$后,可以计算出每一个用户$u$对应的任意一个商品的排序分数,最终选择排序分最高的若干商品输出。

BPR总结

BPR是基于矩阵分解的一种排序算法,但是和funkSVD之类的算法比,它不是做全局的评分优化,而是针对每一个用户自己的商品喜好分别做排序优化。这篇文章的主要贡献就是提出了上述BPR优化目标。BPR优化目标中的模型$\Theta$可以使用多种多样的模型,包括协同过滤、神经网络等等。

《From RankNet to LambdaRank to LambdaMART: An Overview》

介绍

LambdaMART是LambdaRank的提升树版本,而LambdaRank又是基于pairwise的RankNet。因此LambdaMART本质上也是属于pairwise排序算法,只不过引入Lambda梯度后,还显示的考察了列表级的排序指标,如NDCG等,将排序问题转化为回归决策树问题。因此,它算作是listwise中的一种排序算法。

LambdaMART模型从名字上可以拆分成Lambda和MART两部分:

  • MART表示底层训练模型用的是MART(Multiple Additive Regression Tree),也就是GBDT(GradientBoosting Decision Tree)。
  • Lambda是MART求解过程使用的梯度,其物理含义是一个待排序的物品列表下一次迭代时应该调整的排序方向(向上或者向下)和强度。

将MART和Lambda组合起来就是我们要介绍的LambdaMART。

下面逐个介绍RankNet、LambdaRank和LambdaMART三个模型。

RankNet

RankNet是一个pairwise模型,它和BPR非常像。创新之处都在于,原本Ranking常见的排序问题评价指标(NDCG、ERR、MAP和MRR)都无法求梯度,因此没法直接对评价指标做梯度下降,而它们将不适宜用梯度下降求解的 Ranking 问题,转化为对偏序概率的交叉熵损失函数的优化问题,从而适用梯度下降方法。

RankNet的最终目标是得到一个带参的算分函数:

根据这个算分函数,我们可以计算物品$x_i$和$x_j$的得分$s_i$和$s_j$,即:

然后根据得分计算二者的偏序概率:

其中$\sigma$是Sigmoid函数的参数,决定了Sigmoid曲线的形状。RankNet证明了如果知道一个待排序物品的排列中相邻两个物品之间的排序概率,则通过推导可以算出每两个物品之间的排序概率。因此对于一个待排序物品序列,只需计算相邻物品之间的排序概率,不需要计算所有pair,减少计算量。

接下来定义标签$S{ij}={1,-1,0}$,$\overline{P}{ij}=\frac{1}{2}(S{ij}+1)$是物品$x_i$比$x_j$排序靠前的真实概率,即当$x_i\rhd x_j$时,$S{ij}=1$,$\overline{P}{ij}=$1;当$x_j\rhd x_i$时,$S{ij}=-1$,$\overline{P}{ij}=0$;否则$S{ij}=0$,$\overline{P}_{ij}=\frac{1}{2}$。

定义交叉熵作为损失函数衡量$P{ij}$和$\overline{P}{ij}$的拟合程度:

上式利用了性质,$P=\frac{1}{1+e^{-x}}\rightarrow x=\log(\frac{P}{1-P}),P(1-P)=\frac{\partial P}{\partial x}$。

该损失函数有以下两个特点:

  • 当两个相关性不同的物品算出来的模型分数相同时,因为损失函数后半部分为$\log(1+e^{-\sigma\cdot(s_i-s_j)})$,损失函数的值大于0,仍会对这对pair做惩罚,使他们的排序位置区分开。
  • 损失函数是一个类线性函数,可以有效减少异常样本数据对模型的影响,因此具有鲁棒性。

RankNet采用神经网络模型优化损失函数,采用梯度下降法求解:

LambdaRank

在介绍LambdaRank的动机之前,我们先从一张图来考察RankNet学习过程中,列表的排序变化。

如上所示,每个线条表示物品,蓝色表示相关物品,灰色表示不相关物品,RankNet以pairwise error的方式计算损失,在某次迭代中,RankNet 将物品的顺序从左边变成了右边。于是我们可以看到:

  • RankNet 的梯度下降表现在结果的整体变化中是逆序对的下降。左图中,2~14不相关物品都排在了15号相关物品之前,这些不相关物品和15号物品构成的逆序对共13个,因此损失等价于为13;而右图中,将1号相关物品降到了4号,15号相关物品上升到了10号,此时逆序对的数量为3+8=11个,因此损失等价于11.
  • 对于一些强调最靠前的TopK个物品的排序指标(NDCG、ERR等)而言,上述优化不是理想的。例如,右图下一次迭代,在Ranknet中梯度优化方向如黑色箭头所示,此时损失可以下降到8;然而对于NDCG指标而言,我们更愿意看到红色箭头所示的优化方向(此时Ranknet同样是8,但是NDCG指标相比前一种情况上升了),即关注靠前位置的相关物品排序位置的提升。

LambdaRank正是基于这个思想演化而来,其中Lambda指的就是红色箭头,代表下一次迭代优化的方向和强度,也就是梯度。故,LambdaRank先对$\frac{\partial C}{\partial w_k}$做因式分解,如下:

其中:

代入上式得:

令:

考虑对于有序物品对$(i,j)$,有$S_{ij}=1$,于是有简化:

因此,考虑偏序对的对称性,对每个物品$x_i$,其Lambda为:

每个物品移动的方向和趋势取决于其他所有与之label不同的物品(比它靠前或比它靠后都考虑)。$i$比越多的物品$j$的真实排名越优,则$\lambda_i$越大;反之,越小。

同时LambdaRank在此基础上,考虑排序评价指标$Z$(比如$NDCG,\Delta|NDCG|$),把交换两个物品的位置引起的评价指标的变化$|\Delta Z_{ij}|$作为其中一个因子,如下:

可以看出,LambdaRank不是直接显示定义损失函数再求梯度的方式对排序问题进行求解,而是分析排序问题需要的梯度的物理意义,直接定义梯度,我们可以反推出LambdaRank的损失函数$L{ij}=\log(1+e^{-\sigma\cdot(s_i-s_j)})|\Delta Z{ij}|$。

LambdaRank相比RankNet的优势在于分解因式后训练速度变快,同时考虑了评价指标,直接对问题求解,效果更明显。

LambdaMART

LambdaRank重新定义了梯度,赋予了梯度新的物理意义,因此,所有可以使用梯度下降法求解的模型都可以使用这个梯度,MART(即GBDT)就是其中一种,MART的原理是直接在函数空间对函数进行求解,模型结果由许多棵树组成,每棵树的拟合目标是损失函数的梯度,在LambdaMART中就是Lambda。就变成这样:

  • MART是一个框架,缺少一个梯度
  • LambdaRank定义了一个梯度

    下面介绍LambdaMART的每一步工作:

  1. 每棵数的训练会先遍历所有的训练数据(label不同的物品对pair),计算每个pari互换位置导致的指标变化$|\Delta Z{ij}|$以及Lambda,即$\lambda{ij}=-\frac{1}{1+e^{\sigma\cdot(si-s_j)}}|\Delta Z{ij}|$,然后计算每个物品档的Lambda:$\lambdai=\sum{(i,j)\in P}\lambda{ij}-\sum{(j,i)\in P}\lambda_{ij}$,再计算每个$\lambda_i$的导数$w_i$,用于后面的牛顿迭代法(Newton step)求解叶子节点的数值。
  2. 创建回归树去拟合第一步生成的$\lambdai$,划分树节点的标准是均方差(MSE),生成一棵叶子节点数为k的回归树$R{km}$,$m$表示第$m$棵树。
  3. 对第二步生成的回归树,计算每个叶子节点的数值,采用牛顿迭代法求解,即对落入该叶子节点的物品集,用公式$\frac{\sum{x_i\in R{km}}\lambdai}{\sum{xi\in R{km}}w_i}$计算该叶子节点的输出值。
  4. 更新模型,将当前学习到的回归树加入到已有的模型中做回归。

LambdaMART有很多优势:

  1. 适用于排序场景:不是传统的通过分类或者回归的方法求解排序问题,而是直接求解。
  2. 损失函数可导:通过损失函数的转换,将类似于NDCG这种无法求导的排序评价指标转换成可以求导的函数,并且赋予了梯度的实际物理意义。
  3. 增量学习:由于每次训练可以在已有的模型上继续训练,因此适合于增量学习。
  4. 特征选择:因为是基于MART模型,因此也具有MART的优势,可以学到每个特征的重要性,可以做特征选择。
  5. 组合特征:因为采用树模型,因此可以学到不同特征组合情况。
  6. 适用于正负样本比例失衡的数据:因为模型的训练对象具有不同label的物品对pair,而不是预测每个物品的label,因此对正负样本比例失衡不敏感。