hi各位大佬好,我是菜鸟小明哥(其实我也是大佬,哈哈,都是大佬)。
SRGNN已经初步完成实际应用,效果还好,有用的参考来这里。据说原paper大佬已经更新换代了GNN,也就是TAGNN,望文生义就是“他的GNN”,我啥时候发个“WOGNN”,也就是“我的GNN”,hehe。本文依旧粉丝可见,年底回馈粉丝福利。(不喜欢我翻译的就别看,看过了又瞎BB,你是闲的蛋疼吗?),代码在此,paper在此。
真正意义上的序列推荐,SRGNN算上一个,从序列到序列,无需考虑用户的id,当然要记住是哪个用户的点击序列,不然怎么给他推(infer阶段)。
For Video Recommendation in Deep learning QQ Group 277356808
For Visual in deep learning QQ Group 629530787
1-抛出问题,提出解决方案
基于会话的推荐应用很广,但他们的那些方法将会话压缩为一个固定的向量表达,而没有考虑预测的目标item。这种固定的向量将会限制推荐模型的能力,也就是目标item的多样性和用户的兴趣。因此提出目标注意力图模型用于会话推荐。在TAGNN中,目标意识的注意力自适应激活不同用户的兴趣,关于多样的目标item。学习到的兴趣向量表达随不同的目标item变化,极大第提升了模型的表现能力。此外,TAGNN利用gnn的能力在会话中捕获丰富的item转换(transition),试验证实方法有效。
2-问题定义和推导会话图
在会话推荐中,匿名的会话可以表示为一个时间顺序的列表,定义作为所有用户点击的item集合。对于给定会话s,会话推荐的目的就是预测下个行为.模型产生一个所有item的概率有序列表,最后top-k用做推荐。
在模型中将每个会话直接表示为会话图,其中的三个参数分别定义为节点集合,边集合,邻接矩阵。在图中每个节点代表一个item,,每个边代表用户访问item的连续性,比如表示用户先访问前者,后访问后者,【i可视为时间上的概念,注意,作者用v表示item】。定义As为两个邻接矩阵,的拼接,表示会话中item之间的两个方向的关系,两个邻接矩阵分别表示出边和入边连接的权重。
概图如下:
【再次注释:会话就是用户在一段时间内的点击序列,如图中就是两个用户的额点击序列,会话中item之间的连接关系构成会话图,经过gnn网络及注意力(何谓注意力?此处明显可以望文生义得到,边连接越多的item重点关注,大众看的东西可能和你看的东西是相同的,这种情况会不会推出来的全是热点部分(马太/长尾啥的)?关于是否是热点及小的debias方法,可以查看我之前的博文:1如何评价这种偏;2debias即gnn中的做法)处理后再经过线性转换到预测层softmax,其中Target item虚线表示正反向传播,即预测结果与实际结果对比,是一个学习过程】
3-学习item Embedding
将每个节点转换到统一的embedding空间,最终得到每个item的d维度向量表示。这样就可以用item的embedding表示每个会话s,gnn产生节点表示能够将图拓扑做得很好,这样模型能够拟合复杂item连接。paper采用ggnn(门图网络)学习节点表示。网络更新规则:
其中t是训练步,是矩阵As第i行,H和b分别是权重和偏置,是会话中节点向量的list,z和r分别是重置和更新门,是sigmoid函数,表示每个元素的点乘。
对于每个会话图,ggnn模型在邻节点之间传递信息,更新门和重置门决定什么信息保留,什么去掉。【说到这里,一个常见的面试题来了,LSTM是啥玩意,GRU是啥子,和经典的RNN有啥子区别,和CNN啥区别,哪里好了,哪里不好?既是送分题,又是送命题】
4-构建目标意识embedding【直译的,target目标,aware意识】
之前的工作捕获用户的兴趣仅仅使用会话间item表达,在我们模型中,一旦得到每个item的节点向量,经进行构建目标embedding,自适应的考虑历史行为中关注的目标item的相关性。定义目标item为所有的候选item去预测。通常,用户的行为,推荐的item只能匹配用户一部分的兴趣【也就是EE的问题了,参考我之前的知乎回答】为了拟合这个过程,设计一个新的目标注意力机制计算软注意力分数(在会话中所有的item上关于每个目标item)。
首先引入局部目标注意力模块计算会话s中所有item的注意力分数。一个非线性转换通过一个权重W参数话,W用于每个节点-目标对。采用softmax对self-attention分数norm
最终对每个会话s,用户的兴趣到目标item 可以表示为
获得的目标embedding表示用户的兴趣随不同的目标item变化。
5- 生成会话embedding
在当前会话s中探索用户的短长期喜好,使用s中的节点表示。两个与用户目标embedding一起的表达将会用于拼接产生更好的会话embedding。
局部embedding:用户最终的行为可以视为短期喜好——作为一个局部embedding
全局embedding:表示用户的长期喜好——全局的embedding,通过聚合所有涉及到的节点向量得到。采用另一个软注意力机制描述最终点击的item和s中每个涉及到的item之间的依赖关系:
会话embedding:通过线性转换将目标embedding,局部embedding,全局embedding得到会话的embedding,对于每个目标item都会有不同的会话embedding
6-做推荐
得到所有item的embedding和会话的embedding后,通过item embedding和会话embedding内积计算得到每个目标item的推荐分数。接下来,使用softmax得到最终的输出概率:
【WOC,y定义为s中的下一个行为,应该是多少个点击序列就有多少个吧,不然咋给每个用户推荐啊,别告诉我,这个会话内的用户推的都一样。。。。。。。。。。】
交叉熵损失函数:
7-试验设置
【今天看了优酷的新版本,WOC,竟然有了推荐功能,看起来也不错,我就点了几个,似乎很厉害啊,我就看了一个泰剧短片,然后我就搜了下这个名字,也有正片,这种推荐不错,有没有个性化我不知道,是在《精选》页面的】
为了公平对比,去掉了频次小于5的item,去掉了item少于2的session。为生成训练集和测试集,最后一天/一周的会话作为测试。对于一个会话,可以生成一系列输入和标签,例如:一个会话,可以分为列表后面的是label
对比方法有很多,包括item-knn,BPR,MF,NARM等等,当然肯定还有SRGNN
评价指标为P和MRR topk20
超参数设置,embedding维度为100,LR为0.001,衰减因子为0.1(每三次训练),batch_size为100(是不是有点小啊),L2惩罚项为1e-5,优化器为Adam
8-消融研究(Ablation Studies)
【这个破玩意单词不要以为多么复杂,它就是个初中物理中学的控制变量法,我至今还记得物理老师说,小车从斜坡上下滑。。。。。。。,一切高大上都不复杂,除非提出这个研究的人自己都解释不清楚,能将自己研究的东西言简意赅的讲出来,这才是真正的懂了,做到这点,面试不会太差】
设计4个模型变体观察模型效果,分别是只有局部embedding——TAGNN-L,采用avg的全局embedding——TAGNN-Avg,注意力全局embedding——TAGNN-att,局部embedding+注意力全局embedding——TAGNN-L+att,下图是效果:
很显然,混合embedding策略是最佳的,也就是论文提出的方法。TAGNN-L仅仅用了最后一个item作为会话的表达,说明最后的item对用户最终的行为有很大影响。Avg是最差的,这就说明用户的行为是多样性的,不能平均。
敬请期待我的代码解读,拜拜。
回头望,从未懂开口讲爱你,
放下你,已是再会无期。
但常伴心扉,柔情全属你。
来源:oschina
链接:https://my.oschina.net/u/4361759/blog/4697078