山大在2017年发表的短序列化推荐论文,因为之前的工作只考虑了用户的序列表现,但是对用户的主要目的并没有明显地强调(即用户的行为存在偶然性的噪声),所以提出Neural Attentive Recommendation Machine(NARM)
我只研究它模型相关的东西,介绍和相关工作就不细看了
Model
在要预测第t+1时刻的点击行为:
1、
首先是两个解码器,全局解码器(global encoder)和局部解码器(local encoder):
全局编码器用GRU扫描序列后用最后一次行为的隐状态(最相关),表示用户的序列行为:
局部编码器用另一个GRU扫描序列并以所有隐状态的加权和,表示用户长期兴趣:
其中 αtj 表示第t个商品(题目)和第j个商品的注意力分值(相关性权重)
最终的序列表示:
2、
再把ct和候选物品的embedding size大小一样,都被送入decoder中点积计算彼此的相似度
最后再通过一个softmax生成每个候选物品被点击的概率,并使用交叉熵损失优化:
以上就是整体的模型概述,接下来是代码实现
Code
1.全局
hidden = self.init_hidden(seq.size(1)) # 初始化隐藏层
ht = hidden[-1] # 找到最后一个的隐藏层
c_global = ht # 全局编码器,最后一次行为的隐状态(最相关),表示用户的序列行为
2.local
c_local = torch.sum(alpha.unsqueeze(2).expand_as(gru_out) * gru_out, 1) # 局部解码器以所有隐状态的加权和,表示用户长期兴趣:
3.embing
c_t = torch.cat([c_local, c_global], 1)
c_t = self.ct_dropout(c_t)
4.内积
item_embs = self.emb(torch.arange(self.n_items).to(self.device))
scores = torch.matmul(c_t, self.b(item_embs).permute(1, 0))
5.softmax