推荐系统:序列推荐
今日的推荐系统算法主要还是基于用户偏好是静态不变的假设的。各种协同过滤的算法也都在没有考虑时间因素的情况下取得了不错的效果。
但是推荐系统所解决的问题内在本就是时间相关的, 如用户的兴趣是动态变化的, 物品的状态属性也不完全是一成不变的。 因此非序列推荐的推荐算法忽略其时间属性, 一定程度上是不合理的。
下面我们总结一些序列推荐的论文, 时间跨度为 2010-2019, 基本涵盖了 Markov Chains,RNN, CNN, Attention Mechanism, Memory Network 等技术, 方便大家了解序列推荐的发展。
- FPMC:Factorizing Personalized Markov Chains for Next-Basket Recommendation
- HRM:Learning Hierarchical Representation Model for Next Basket Recommendation
- GRU4Rec : SESSION-BASED RECOMMENDATIONS WITH RECURRENT NEURAL NETWORKS ICLR2016
- DREAM:A Dynamic Recurrent Model for Next Basket Recommendation
- RRN:Recurrent Recommender Networks
- SASRec: Self-Attentive Sequential Recommendation
- Caser: Personalized Top-N Sequential Recommendation via Convolutional Sequence Embedding
- TODO
FPMC:Factorizing Personalized Markov Chains for Next-Basket Recommendation
Rendle大佬2010年的文章。
思路很简单,维护user-item-item的状态转移立方体。根据用户上个时刻的购买行为预测下个时刻大概率会购买那个物品(item-item转移矩阵)。
整体的(所有用户的item-item)转移矩阵通过下图方式统计得到:

但是对于用户个体的item-item转移矩阵,则有稀疏无法统计的问题:

这时我们可以借鉴Factorization因子分解的思想,对user-item-item转移立方体进行因子分解:


其中uli表示,user u在买了item l后买item i的概率。
所以FPMC的最终公式:
做Basket推荐时:


做Item推荐时:

则可以看作MF和MC的结合。
训练损失函数使用SBPR。BPR是user u买正样本的分数高于负样本的分数,即对所有用户和所有正样本和所有负样本求和。SBPR多考虑了时间,即对所有用户和所有时间和所有正样本和所有负样本求和。
HRM:Learning Hierarchical Representation Model for Next Basket Recommendation
这是一篇2015年的论文。思想比较简单,就是通过上一个Basket中物品向量的aggregation和user向量的aggregation得到user在t时刻的兴趣向量,之后LFM,user向量和待选物品向量向量内积,经过softmax之后得到每个待选物品在下一个Basket的概率。


模型相对简单,就不多说了。目标函数用的是最大似然估计(MLE)的思想加负样本采样,具体不多研究了,面试问道就说忘了吧。
GRU4Rec : SESSION-BASED RECOMMENDATIONS WITH RECURRENT NEURAL NETWORKS ICLR2016
GRU4Rec是一个利用GRU对用户历史购买的序列行为进行建模,通过session-parrallel mini-batch和输出的sampling来加快训练速度,使用改进的bpr作为loss function。
session-parrallel mini-batch如下图:

是为了解决RNN输入,每个样本的timestep都不尽相同的问题,加快学习速度。其实也可以通过RNN的sequence length参数完成这个操作(补0然后加mask,补0的timestep不反向传播)。

输入session-parrallel之后的一个个batch的输入[batchsize,timestep,embedding_dim]。
然后每个时间步的输出都经过一层前馈神经网络,映射到所有待选物品。比如GRU最后一层输出m,一共有n个待选物品,最后的NN就是m到n的网络。
然后我们就得到了每个物品的分数,进而根据分数推荐物品。
对每个物品都进行计算和推荐计算量比较大,所以可以每次对正样本采样,只对output中一部分正样本进行loss计算(当然只有这部分正样本和采样得到的负样本对应的最后一层网络权重会变)。但个人感觉也可以不做正样本采样了现在(算力应该够了)。
最后使用BPRlos做目标函数。
DREAM:A Dynamic Recurrent Model for Next Basket Recommendation
FPMC只能对之前一个时间步的用户行为进行建模。HRM也是对用户前一个时间步的行为进行建模,而后进行向量内积。GRU4Rec则是使用GRU对多个时间步行为建模,最终输出各物品概率。
DREAM则是针对上面三个模型的缺点进行改良,一定程度也可以看作是HRM和GRU4Rec的结合体。
它对用户多个时间步行为建模,然后认为最后一个时间步的输出则是用户兴趣的动态表示,即用户在t时刻的向量,止呕做向量内积,得到各个物品的评分。(不过不像HRM一样,没经过softmax)。

然后DREAM通过对Basket中所有的item向量进行max pooling /average pooling ,得到每个Basket的向量表示,并解决了Basket里物品数量不一的问题。
使用BPR loss作为损失函数。
RRN:Recurrent Recommender Networks
这是一篇2017年的论文。
RRN 则可以看作是 DREAM 的演进版本。 DREAM 之前的 HRM 等方法,是将 item 的特征视为 stationary,将 user 的特征视为一定程度静态的。 DREAM 则学习 user 的动态特征表示,而 movie 的特征还是静态的。 RRN 则认为, user 和 movie 特征都应该是随时间改变的。
RRN 使用 LSTM 作为基础网络结构,其整体网络结构如下图:

上下分别为 user-state RNN 和 movie-state RNN,这两个网络都是自回归网络,使用 t-1 时刻 user/movie state 作为输入,输入 t 时刻 user/movie state。依旧借鉴矩阵分解 MF 的思想,将两者对位相乘进而得到 t 时刻 user i 对 movie j 的评分 r。
user/movie 的状态state定义为

其中\(W_{embed}\) 是将状态映射入 embedding 空间的变换矩阵。\(x_t\)是 user 在 t 时刻对M 个电影的的打分向量或着 movie 在 t 时刻被 M 个用户的分数向量。\(1_{newbie}=1\)表示use/movie是新出现的,后面两个则是t,t-1时刻的wallclock。
而最终评分也加入了 user 和 movie stationary 的特征考量:


与 DREAM 使用 implicit feedback 不同的是 RRN 使用的 explicit feedback,损失函数采用 RMSE,训练方式采用 subspace descent 方法,即两个 LSTM 网络依次训练(固定一个网络,训练另一个网络)。
SASRec: Self-Attentive Sequential Recommendation
2018年8月的论文,其实就是SelfAttention代替RNN,最终向量相乘得到分数进行推荐。
没什么创新点,就是首个将SelfAttention用于序列推荐。

最终输出:

F是FFN的输出,N是另一个物品embedding矩阵,相乘得到分数。其实可以把F当做用户的兴趣向量,像上面的HRM,DREAM,RRN一样。可能作者是为了避免思想重复太多吧。
SelfAttention就不多讲了,见自然语言处理:EncoderDecoder模型 从Encoder-Decoder到AttentionModel再到Transformer
Caser: Personalized Top-N Sequential Recommendation via Convolutional Sequence Embedding
这是一篇非常好的论文,发表于2018年2月。
Caser的作者们认为,基于MCs的方法都只能捕捉point-level的dynamic patterns。

而union-level 以及union-level with skip的动态模式也很重要。即,这些购买行为是作为一个整体影响后面的购买行为的,而不只是一一对应的转移概率。
比如买牛奶和黄油后买面粉的概率会高,是因为一起买了牛奶和黄油,而不是分别买了(用来做饼干应该是);买了RAM和硬盘,那大概率会买操作系统,但是分别买就不一定。
另外,用户可能有两个兴趣,包化妆品和婴幼儿用品。比如用户买了尿布、奶粉、包、口红,奶嘴和粉底。尿布和奶粉对奶嘴的影响,以及包口红对粉底的影响都不是连续的,即不一定在买了前置商品后,下一件立马就买对应的大概率商品。
而FPMC,fossil都没有解决这些问题。(DREAM,GRU4Rec,RRN,SASRec等一定程度解决了这个问题)
于是提出了Caser。其基本思路是,对序列数据的训练数据和label采用双滑动窗口采样,来对购买行为的skip特性进行建模。之后将序列数据看作一张二维图像,利用竖直和水平两个方向的卷积核分别捕捉用户的序列行为,然后和user向量合并入全连接层,进而预测出下面时刻所有待选物品被选中的概率。

目标函数是交叉熵。
不过Caser其实没有考虑序列的特征,它将时间简单视为图像的一个维度后就没有特殊的操作了,比如加postional embedding,所以其实是丢失了一定的信息的。但是个人认为还是一篇很好的论文的。
TODO
序列推荐的论文还有很多,以后有空再慢慢整理吧:
CNN方向的:
(2019 NextItNet) A Simple Convolutional Generative Network for Next Item Recommendation
还有用RNN做卷积核的CNN的,名字忘了
UserMemoryNetwork的:
(2018 CMN) Collaborative Memory Network for Recommendation Systems
(2018 KSR) Improving Sequential Recommendation with Knowledge-Enhanced Memory Networks

浙公网安备 33010602011771号