《Session-based recommendations with recurrent neural networks》首次提出将RNN方法应用于Session-based Recommendation。文章中提到当前主流的基于因子分解的模型或者基于邻域的模型很难对整个Session建模,得益于序列化建模算法的发展,使得基于Session的推荐模型成为可能,针对具体的任务,文章中设计了模型的训练以及ranking loss。
在文章中采用的GRU(Gated Recurrent Unit)序列化建模算法,这是一种改进的RNN算法,能够较好的解决RNN中的长距离以来问题。在Session-based Recommendation中,将用户登录后产生点击作为RNN的初始状态,基于这个初始状态查询后续是否会点击,其流程大致如下所示:
其中,x0 作为初始状态,h 表示RNN的隐藏状态,^y 表示输出,由初始状态,可以得到后续的输出。
GRU全称为Gated Recurrent Unit,是RNN模型的增强版,能够有效解决RNN模型中的长距离以来问题。在GRU中,输入为前一时刻隐藏层ht−1 和当前输入xt ,输出为当前时刻隐藏层信息ht 。GRU中包含两个门,即reset门rt 和update门zt ,其中rt 用来计算候选隐藏层~h ,控制的是保留多少前一时刻隐藏层ht−1 的信息。zt 用来控制加入多少候选隐藏层~h 的信息,从而得到输出ht 。GRU的结构如下图所示:
通过堆叠多层的GRU,可以实现对用户点击序列的建模,Session-based Recommendation的模型结构如下图所示:
在模型的损失函数方面,文章中采用了pairwise ranking losses,其中pointwise在训练过程中并不稳定。
三种ranking的方式:
文中使用了两种基于Pairwise ranking的损失函数:Bayesian Personalized Ranking(BPR)和TOP1,其中BPR是一种矩阵分解的方法,其公式为:
其中,Ns 是样本量,^rs,k 是item k 的分数,i 表示session中的正样本,j 表示负样本。TOP1是一种正则估计的方法,其公式为:
在训练的过程中,文中提出了两种策略来提高训练的效率,分别为mini-batch和负样本采样。其中mini-batch的过程如下图所示:
简单来讲就是将多个Session可以进行合并,但是在训练的过程中,在同一个Sequence中遇到下一个Session时,要对GRU重新初始化。
如上,从Session中得到的是正样本,但是训练的过程中不能只存在正样本,此时需要负样本,对于上图中Output中的每一位,通过在样本库中随机采样,生成负样本。
由于我没自己做过实验,在此总结下原作者的几条结论,有待后续在工作中具体验证: