Group-Aware Long- and Short-Term Graph Representation Learning for Sequential Group Recommendation

SIGIR 2020
华东师范大学
微信腾讯搜索应用部
论文PPT
在这里插入图片描述

ABSTRACT

顺序推荐和分组推荐是推荐系统领域的两个重要分支。虽然这两个分支已经以独立的方式投入了大量的精力,但我们将它们结合起来,提出了一种新颖的序贯群推荐问题,该问题能够对群的动态表示进行建模,并且对于获得更好的群推荐性能是至关重要的。该问题的主要挑战是如何基于过去时间范围内组成员的顺序用户-项目交互来有效地学习动态组表示。为了解决这个问题,我们设计了一种群体感知的长期和短期图表示学习方法,即GLSGRL,用于连续的群体推荐。具体地说,对于目标群体,我们构建了一个组感知的长期图来捕捉整个历史中的用户项交互和项-项共现,以及一个组感知的短期图来仅包含关于当前时间框架的相同信息。GLS-GRL在图的基础上进行图表示学习,得到长期用户表示和短期用户表示,并进一步自适应融合得到完整的用户表示。最后,通过一种受限的用户交互注意力机制对组成员之间的相关性进行编码,得到组表示。综合实验表明,GLS-GRL的性能优于序贯推荐和分组推荐方法中的几种强推荐方案,验证了GLS-GRL核心组件的有效性。

有相同爱好的人分为一个小组,用户群,之前的研究是研究他们的静态偏好,忽略了群体成员行为的顺序性。

在这里插入图片描述

在本文中,我们提出了一个新的问题,称为序贯分组推荐(SGR),它位于序贯推荐和分组推荐的交叉点上。如图1所示,此问题旨在利用目标组成员在过去时间范围内的顺序项目交互来预测哪些项目将在下一个时间范围内从目标组成员获得更多交互。由于社交平台上可能会不时出现由现有用户组成的新群,因此向现有群和新群推荐物品的能力是问题所要求的。与以往的群组推荐问题设置相比,序贯群组推荐非常有用,它能够在序贯推荐的启发下对群组的动态表示进行建模,并有望提高群组推荐性能。需要注意的是,虽然文献[14,27]涉及到序贯推荐和分组的概念,但它们与我们的研究有根本的不同:(1)前者是为会话推荐量身定做的,其方法完全是经验性的,没有模型学习过程;(2)后者实际上是利用分组偏好来促进针对单个用户的序贯推荐,旨在克服稀疏性问题。

要解决这一问题,一个根本的挑战是如何根据过去时间范围内组成员的顺序用户-项目交互来有效地学习动态组表示。在现实中,群表示是通过群成员的动态表示来反映的,既适用于现有的群,也适用于新的群。因此,用户表示是必不可少的,它在特定的用户项交互和组表示之间架起了一座桥梁。然后,总体的基本挑战被分解为具体的挑战:

  • 如何利用组成员资格和顺序的用户-项目交互来学习用户表示法?
  • 如何利用获得的用户表征来表示群体偏好?

它能够使组成员关系影响用户表征学习,并基于所获得的用户表征实现组表征,因此受到欢迎。具体地说,在每个时间帧中,我们首先构建组感知的长期和短期图,这两个图都共享属于同一目标组的所有用户。长期图包含整个历史中的用户-项交互和项-项共现,而短期图仅包含关于当前时间范围的信息。基于这两个图,GLS-GRL在这两个图上采用图表示学习,分别学习用户的长期表示和短期表示。这两种类型的表示通过简单的选通机制融合以获得集成的用户表示。这样,第一个挑战就迎刃而解了。对于第二个挑战,GLS-GRL进一步发展了一种受子注意网络启发的受限用户交互注意力[20]。它通过表示用户w.r.t.来编码组成员之间的相关性。要求至少具有一个共同交互项目的其他选定群组成员的表示。通过整合用户表示,最终实现组表示。
综上所述,主要贡献如下:

  • 我们提出了一个新的问题,称为序贯群推荐,该问题需要对已有的群推荐研究忽略的群表示的序贯动态进行建模。
  • GLS-GRL模型的创新之处在于通过相应的群体感知长、短期图学习长期和短期用户表征,并将群体表征学习和用户表征学习相结合。
  • 我们在两个真实世界的数据集上进行了全面的实验,证明了GLS-GRL与强备选方案相比具有更好的性能,验证了模型的一些关键设计。

在这里插入图片描述

我们的GLS-GRL模型的总体架构如图2所示,它以组的长期图和短期图作为输入,输出组级表示进行相似度计算,并与候选推荐项一起进行推荐。长期(或短期)图是基于组成员与整个历史(或当前时间范围内)项目的交互构建的。图3显示了一个玩具示例来说明这两个图表的结构。GLS-GRL由四个关键部分组成:(1)长期和短期用户表征学习;(2)长期和短期用户表征融合;(3)受限用户交互注意力;(4)组表征聚合。提出了一种基于混合排序的损失函数来优化GLS-GRL。
在这里插入图片描述
先表示图后聚合,短期意图初始为0向量。
到目前为止,我们已经有了长期和短期的用户表示。我们在用户表示的基础上增加了一层非线性全连通(NFC)层,赋予用户更丰富的表达能力。
个人感觉这篇文章的重点在于注意力机制。

在这里插入图片描述
获得更多特征的小操作。之后得到每个用户的长期和短期的表征。

"Structure-Aware Transformer for Graph Representation Learning"是一篇使用Transformer模型进行图表示学习的论文。这篇论文提出了一种名为SAT(Structure-Aware Transformer)的模型,它利用了图中节点之间的结构信息,以及节点自身的特征信息。SAT模型在多个图数据集上都取得了非常好的结果。 以下是SAT模型的dgl实现代码,代码中使用了Cora数据集进行示例: ``` import dgl import numpy as np import torch import torch.nn as nn import torch.nn.functional as F class GraphAttentionLayer(nn.Module): def __init__(self, in_dim, out_dim, num_heads): super(GraphAttentionLayer, self).__init__() self.num_heads = num_heads self.out_dim = out_dim self.W = nn.Linear(in_dim, out_dim*num_heads, bias=False) nn.init.xavier_uniform_(self.W.weight) self.a = nn.Parameter(torch.zeros(size=(2*out_dim, 1))) nn.init.xavier_uniform_(self.a.data) def forward(self, g, h): h = self.W(h).view(-1, self.num_heads, self.out_dim) # Compute attention scores with g.local_scope(): g.ndata['h'] = h g.apply_edges(fn.u_dot_v('h', 'h', 'e')) e = F.leaky_relu(g.edata.pop('e'), negative_slope=0.2) g.edata['a'] = torch.cat([e, e], dim=1) g.edata['a'] = torch.matmul(g.edata['a'], self.a).squeeze() g.edata['a'] = F.leaky_relu(g.edata['a'], negative_slope=0.2) g.apply_edges(fn.e_softmax('a', 'w')) # Compute output features g.ndata['h'] = h g.update_all(fn.u_mul_e('h', 'w', 'm'), fn.sum('m', 'h')) h = g.ndata['h'] return h.view(-1, self.num_heads*self.out_dim) class SATLayer(nn.Module): def __init__(self, in_dim, out_dim, num_heads): super(SATLayer, self).__init__() self.attention = GraphAttentionLayer(in_dim, out_dim, num_heads) self.dropout = nn.Dropout(0.5) self.norm = nn.LayerNorm(out_dim*num_heads) def forward(self, g, h): h = self.attention(g, h) h = self.norm(h) h = F.relu(h) h = self.dropout(h) return h class SAT(nn.Module): def __init__(self, in_dim, hidden_dim, out_dim, num_heads): super(SAT, self).__init__() self.layer1 = SATLayer(in_dim, hidden_dim, num_heads) self.layer2 = SATLayer(hidden_dim*num_heads, out_dim, 1) def forward(self, g, h): h = self.layer1(g, h) h = self.layer2(g, h) return h.mean(0) # Load Cora dataset from dgl.data import citation_graph as citegrh data = citegrh.load_cora() g = data.graph features = torch.FloatTensor(data.features) labels = torch.LongTensor(data.labels) train_mask = torch.BoolTensor(data.train_mask) val_mask = torch.BoolTensor(data.val_mask) test_mask = torch.BoolTensor(data.test_mask) # Add self loop g = dgl.remove_self_loop(g) g = dgl.add_self_loop(g) # Define model and optimizer model = SAT(features.shape[1], 64, data.num_classes, 8) optimizer = torch.optim.Adam(model.parameters(), lr=0.005, weight_decay=5e-4) # Train model for epoch in range(200): model.train() logits = model(g, features) loss = F.cross_entropy(logits[train_mask], labels[train_mask]) optimizer.zero_grad() loss.backward() optimizer.step() acc = (logits[val_mask].argmax(1) == labels[val_mask]).float().mean() if epoch % 10 == 0: print('Epoch {:03d} | Loss {:.4f} | Accuracy {:.4f}'.format(epoch, loss.item(), acc.item())) # Test model model.eval() logits = model(g, features) acc = (logits[test_mask].argmax(1) == labels[test_mask]).float().mean() print('Test accuracy {:.4f}'.format(acc.item())) ``` 在这个示例中,我们首先加载了Cora数据集,并将其转换为一个DGL图。然后,我们定义了一个包含两个SAT层的模型,以及Adam优化器。在训练过程中,我们使用交叉熵损失函数和验证集上的准确率来监控模型的性能。在测试阶段,我们计算测试集上的准确率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值