摘要
在本周阅读的文献中,作者首次提出了SR-GNN。SR-GNN是一种基于会话序列建模的推荐系统,首次将GNN应用于会话推荐。由于过去方法的不足难以获得准确的会话向量并且忽略了项目之间的复杂转换导致效果存在不足。GNN可以捕捉到传统序列方法难以实现的复杂项目转移,然后使用注意力机制将每个会话表示为全局偏好和该会话当前兴趣的组合从而解决了这一问题。通过大量实验表明,SR-GNN明显优于最先进的一些推荐方法。本周的学习将从模型原理,实验分析以及代码实践三个方面进行学习。
Abstract
In the literature read this week, the author first proposed SR-GNN. SR-GNN is a recommendation system based on session sequence modeling, which is the first to apply GNN to session recommendation. Due to the shortcomings of previous methods, it is difficult to obtain accurate session vectors and the neglect of complex transformations between items, resulting in insufficient recommendation performance. GNN can capture complex project transitions that are difficult to achieve with traditional sequence methods, and then use attention mechanisms to represent each session as a combination of global preferences and the current interests of that session, thus solving this problem. Numerous experiments have shown that SR-GNN is significantly superior to some state-of-the-art recommendation methods. This week’s learning will cover three aspects: model principles, experimental analysis, and code practice.
1. 文献阅读
本周阅读了一篇名为
论文地址:static.aminer.cn
在过去,会话推荐领域有几种比较有代表性的方法,其中最有代表性的方法是将RNN引入到推荐系统中,这些方法存在局限如下:
1)当一个会话中的用户行为数量十分有限时,RNN就很难捕获到用户的行为表示。在使用RNN建模时,如果前面时序的动作项较少,最后一个输出产生推荐项时的准确性就比较低。
2)在会话过程中,item之间的转移模式在会话推荐中是十分重要的,但是RNN和马尔科夫过程只对相邻物品的单向转移进行了建模,而忽略了会话中的其他item信息。
针对以上局限性,文章设计了一个名为SR-GNN的推荐框架,用于会话序列推荐。
1.1 SR-GNN模型
SR-GNN的模型框架:
模型的工作原理:
1)上图最左侧是输入的数据,每一行表示一个用户进行 物品点击的记录。v表示物品,对于每一行数据可以表示为一个会话,目的是根据这样的用户点击序列,来预测用户下一个要点击的物品。
2)基于每个session去构建一个子图,需要注意的是,每个用户的历史情况都会构建成一个图。
3)使用GNN对图进行信息挖掘,获取session图中每个点击物品的embedding_1,向量化表示为 [v1,v2,…,vn],其中每个Vi都是一个向量,对应图中红框的结果。
4)对于获得的每个物品的向量化表示,实际上只有最后一个时刻物品是比较重要的,将其取出为s1,而其他的信息会通过注意力分配的机制,添加了attention策略,根据前面几个物品跟最后一次点击的相似度,来进行注意力权值的附加,然后将这些最后一次之间的信息附加权重后加在一起,成为向量sg。
5)最后一步是先对s1和sg进行横向拼接,并进行线性变换,得到结果sh,最后将sh与每个物品的embedding进行内积计算,并通过softmax包装获取得到对应不同物品的点击概率,根据概率的大小绝对最后的推荐物品。
模型的主要组成:
构图
构图最主要的工作是如何把用户的历史交互记录,转换成一个有向图。比如用户的点击序列是 v1 -> v2 -> v3 -> v2 -> v4,则其对应的图可以转化成如下的形式。那么为什么将每个用户的行为都包装成一个图呢,因为如果将所有用户对商品的交互关系都放在一张图中,会导致对用户独特兴趣捕捉上的混乱,所以需要单独构建,每一行样本都可以构建成一张图。
每一个session序列中的item都会根据它点击时间被建模成有向图,其中每个节点表示一个item,每条边表示用户的点击行为。这样,出现在不同session中的item都可以被建模成有向图。当然,在一个有向图中,同一个item是可能重复出现的。文章使用邻接矩阵进行图的存储,为每个图都构建一个出度矩阵、入度矩阵,并为了便于输入到神经网络,对度值进行了归一化处理,如下图所示,其中构建出度矩阵和入度矩阵的原因是为了让模型可以学到丰富的双向关系,而不是简单的单向转移关系。
item向量表示
通过构造图的方法可以知道会话图的几种特点:有向边,边加权,多个会话序列子图。文章所采用的GNN方法主要是基于门控图神经网络实现:
SR-GNN就是使用GNN针对邻接矩阵学习物品的嵌入向量的过程,通过将所有的会话图送入到GNN网络,就能够得到所有节点的嵌入向量。对于GNN通过GRU得到嵌入向量的过程,即是对GRU不断从前到后不断到收敛的过程,相当于传播过程,之后的生成会话嵌入向量和推荐决策就对应于GNN中的输出过程。
session向量表示
在得到每个item向量之后,利用这些item向量形成session向量,用于基于会话的推荐。对于整体的图,分为局部向量和全局向量进行考虑,从局部和全局角度进行表达来获得更有效的图向量表达。这里使用了注意力机制,首先得到不同结点的注意力权重ai,之后对不同节点添加不同的注意力获取得到全局的向量嵌入结果,其中W1和W2都是注意力机制中可训练的权重:
最终通过对局部和全局的嵌入向量的级联进行线性变化得到了混合嵌入sh:
预测模块
在得到了每个会话的嵌入后,可以根据此计算出对于物品集中所有物品下一次点击的预测分数,具体来说就是通过该物品的特征嵌入和会话特征嵌入得到:
基于此可以得到每个物品的点击预测概率,也就是最终的输出:
在模型训练过程中,选择交叉熵损失函数,表示为:
1.2 实验分析
(1)数据集
Yoochoose数据集:Yoochoose是取自RecSys challenge 2015,它包含了一串用户点击事件;
Diginitica数据集:Diginitica取自CIKM Cup 2016,只使用了它的transactional数据。最后对数据进行了清洗,过滤掉了长度为1的session和出现次数小于5的item。
(2)评价标准
P@20:被广泛用于衡量预测的准确性。它表示前20个项目中正确推荐的项目的比例。
MRR@20:是正确推荐的项目的倒数排名的平均值。当排名超过20时,倒数排名设置为0。MRR度量考虑推荐排名的顺序,其中MRR值大表示排名列表顶部的正确推荐。
论文中以8个最先进的会话推荐模型作为基线模型,以比较提出的SR-GNN模型的性能。它们分别是POP、S-POP、Item - kNN、BPR-MF、FPMC、GRU4REC、NARM、STAMP。
(3)实验结果
1)与基线方法的比较
与各种基线方法相比,SR-GNN在P@20和MRR@20可以达到目前最好的效果。实验结果表明,在这两种不同处理中,SR-GNN可以更好的学习到不同出现时间的session特征。
2)连接方案变体的比较
实验结果表明,这三种连接方案都实现了与STAMP和NARM方法相同的性能,这证实了将会话建模为图的有用性。与SR-GNN相比,对于每个会话,SR-GNN-NGC除了考虑当前会话中的项外,还考虑了其他会话的影响,从而减少了当前会话图中与节点连接度高的边的影响;SR-GNN- fc明确地将所有高阶关系视为直接连接,但性能表现上SR-GNN- fc比SR-GNN差。
3)不同会话嵌入的比较
实验结果表明,混合嵌入方法SR-GNN在三个数据集上都取得了最好的结果,这验证了将当前会话兴趣与长期偏好结合起来的重要性。数据显示SR-GNN-ATT在三个数据集上的平均池化性能优于SR-GNN-AVG,它表明会话可能包含一些不能独立处理的噪声行为,注意力机制有助于从会话数据中提取重要行为以构建长期偏好。SR-GNN-L仍然优于SR-GNN-AVG,并且实现了与SR-GNN-ATT几乎相同的性能,这表明当前兴趣和长期偏好对于基于会话的推荐至关重要。
4)会话序列长度分析
进一步分析了不同模型处理不同长度会话的能力,实验证明了该方法的优越性和图神经网络在基于会话的推荐中的适应性。
通过上述实验结果可以得出以下结论:
1)对于难以获得用户偏好和历史记录的情况,文章提出了一种新的基于会话的推荐模型架构,将图模型用于表示会话序列。
2)该方法不仅考虑了会话序列项目之间的复杂结构和转换,而且还开发了一种将会话的长期偏好和当前兴趣相结合的策略,以更好地预测用户的下一步行动。
3)通过综合实验证明,该方法始终优于其他最先进的方法。
1.3 代码实践
(1)构建Session Graph
在GNN中经常使用networkx对一些边集生成有向图,networkx 是一个用于创建、操作和研究复杂网络结构的Python库。代码如下所示:
import networkx as nx
import matplotlib.pyplot as plt
edges = [(1, 2), (2, 3), (3, 2), (2, 4)]
# 1. 初始化有向图
G = nx.DiGraph()
# 2. 通过边集加载数据
G.add_edges_from(edges)
# 3. 打印所有节点
print(G.nodes)
# 4. 打印所有边
print(G.edges)
# 5. 画图
nx.draw(G)
# 6.显示
plt.show()
效果如下:
(2)最小路径算法的实现
本周还学习了最小路径算法的代码实现,算法主要通过递归方法实现了在有向图中寻找路径的功能,包括找到一条路径、找到所有路径以及找到最短路径。通过递归调用逐步构建路径,并根据需要返回结果。代码如下所示:
import numpy as np
# 找到一条从start到end的路径
def findPath(graph, start, end, path=[]):
path = path + [start]
if start == end:
return path
for node in graph[start]:
if node not in path:
newpath = findPath(graph, node, end, path)
if newpath:
return newpath
return None
# 找到所有从start到end的路径
def findAllPath(graph, start, end, path=[]):
path = path + [start]
if start == end:
return [path]
paths = [] # 存储所有路径
for node in graph[start]:
if node not in path:
newpaths = findAllPath(graph, node, end, path)
for newpath in newpaths:
paths.append(newpath)
return paths
# 查找最短路径
def findShortestPath(graph, start, end, path=[]):
path = path + [start]
if start == end:
return path
shortestPath = []
for node in graph[start]:
if node not in path:
newpath = findShortestPath(graph, node, end, path)
if newpath:
if not shortestPath or len(newpath) < len(shortestPath):
shortestPath = newpath
return shortestPath
# 以字典的形式构建有向图
graph = {'A': ['B', 'C', 'D'],
'B': ['E'],
'C': ['D', 'F'],
'D': ['B', 'E', 'G'],
'E': [],
'F': ['D', 'G'],
'G': ['E']}
onepath = findPath(graph, 'A', 'G')
print('一条路径:', onepath)
allpath = findAllPath(graph, 'A', 'G')
print('\n所有路径:', allpath)
shortpath = findShortestPath(graph, 'A', 'G')
print('\n最短路径:', shortpath)
运行得到的输出结果如下:
一条路径: ['A', 'C', 'D', 'G']
所有路径: [['A', 'C', 'D', 'G'], ['A', 'C', 'F', 'D', 'G'], ['A', 'C', 'F', 'G'], ['A', 'D', 'G']]
最短路径: ['A', 'D', 'G']
总结
在本周通过对SR-GNN的学习,对寻找创新点的方法有点领悟,就好比在会话推荐领域,GNN的应用解决了很多实际的问题,其最终目标肯定是提高预测的准确性但并非局限于精度的提高而是方法的改进。如果将其思想应用到环境的相关领域,可能也有类似的情况。通过此次学习我明白了多读论文的重要性,只有大量的论文阅读基础才能明白前沿技术,以此才能更容易发现创新点。