Efficiently Leveraging Multi-level User Intent for SBR via Atten-Mixer Network(WSDM23)

很有趣的一篇文章。这篇文章的结论与GNN的主流研究趋势相反:主流是在设计更强大的GNN以捕捉项目之间的复杂转换,而本文认为,GNN的能力已经过剩了,完全不需要设计多复杂的GNN模型,本文甚至去掉了GNN结构,用多层的注意力机制(Atten-Mixer)拟合GNN的高级连接。(当然场景是Session-based推荐,序列的平均长度很短)

0 摘要

基于会话的推荐(SBR)旨在基于短的和动态的会话来预测用户的下一步行动。最近,人们越来越关注利用各种精心设计的图神经网络 (GNN) 来捕获项目之间的成对关系,这似乎表明设计更复杂的模型是提高实证性能的灵丹妙药。然而,虽然模型复杂性的指数增长,但这些模型只能实现相对边际的改进。

因此,本文建议直接去掉GNN的传播部分,在readout模块增强其推理能力。Atten-Mixer提出了多级注意混合网络,它利用概念视图和实例视图读数来实现项目转换的多级推理。

1 引言

最近的 SBR 研究发现,基于 GNN 的模型的使用激增,以更好地捕捉项目的复杂转换。然而,与模型复杂度的指数增长相比,每个模型在基准测试中带来的性能提升微乎其微(详见表 2)。鉴于这种现象,自然会出现一个有意义的问题:那些基于 GNN 的模型对于 SBR 来说是不够复杂还是过于复杂?为了回答这个问题,我们剖析了现有的基于 GNN 的 SBR 模型,并凭经验发现一些 GNN 传播似乎是多余的,因为读出模块在这些模型中起着重要作用。

这种观察结果与今天的趋势非常相反,SBR 社区寻求更强大的 GNN 设计来捕捉项目之间的复杂转换。与其他推荐领域相比,由于会话数据固有的短和动态特性,会话图更加稀疏。例如,Diginetica 数据集中近 70% 的会话由不同的项目组成,这意味着基于会话数据构建图形可能只会产生一个序列。在这种情况下,GNN 中的一些设计相当繁重,与读出模块设法从数据中学习的总体偏好相比,其贡献很小。因此,我们假设读出模块的高级架构设计将受益更多。随着我们放宽对 GNN 传播部分的要求,读出模块应该在模型推理过程中承担更多责任。因此,需要一种具有强大推理能力的readout模块。

现有的基于readout模块的改进集中于实例视角(instance-view,即下图中的第一层,若没有GNN的传播层,缺乏项目间的高级关联。如果没有 GNN 传播部分带来的推理过程,instanceview 读出缺乏项目之间的高级连接信息,即新娘礼服和头纱都是婚礼用品。 基于实例视图读出模块,我们只能对项目转换进行底层推理。 然而,底层推理过程是碎片化的,因为它不能直接与不同的用户行为相关联。 如图 1 所示,如果我们通过考虑物品之间的高级联系来关联 Alice 的不同行为,我们可以看到 Alice 倾向于购买婚礼用品气球而不是家居装饰壁画。 然而,实例视图读出模块很难识别这种整体模式,因为它们只建模底层关系。 在没有准确理解用户行为的情况下,碎片化的底层推理过程有较大概率收敛到局部最优,例如向Alice推荐属于家居装饰品的物品。

为了解决这个问题,我们对读出模块进行了更全面的了解。受本体知识图谱 (KG) 推理过程 的启发,该过程考虑了与 KG 相关的高级概念,我们建议将高级视图与实例视图读出结合在一起,以实现多级推理项目过渡。

设计多级推理读出模块具有挑战性,因为简单地枚举所有可能的高级概念对于大型现实世界推荐系统是不可行的。为了解决这个问题,必须结合与 SBR 相关的归纳偏差,即固有优先级和局部不变性,这会显着减少我们的搜索空间。固有优先级在于强调最后几项对用户偏好的贡献,而局部不变性表明最后几项的局部顺序不重要。

2 相关工作

基于会话的推荐系统不是利用用户配置文件和历史操作,而是学习模拟用户的偏好并仅基于短期和动态会话推荐下一次交互。

相关工作有RNN-based、CNN-based、GNN-based。这里不做展开介绍。

3 基于 GNN 的 SBR 模型分析

3.1 定义

项目集合V,会话 S={v1,v2,...,vn} ,SBR的目的是预测出用户要点击的下一个项目 vn+1 。典型的SBR是预测下一个项目的概率 y^=p(vn+1|S) ,选出topK推荐。

3.2 实验探索

一般的GNN-based SBR系统是这样的,包含GNN模块和readout模块。

1. GNN 模块:参数可以分为图卷积的传播权重和将原始嵌入和图卷积输出融合的 GRU 权重。

2. Readout 模块:参数包括用于生成长期表示的注意力池化权重和用于生成会话表示以进行预测的转换权重。

对这两个模块分别进行SparseVD 稀疏化变分丢弃,来验证两个模块的重要性。结果如下:

在三个数据集上跑出了相似的结果。纵轴是密度比(density ratio),指的是参数大于某个阈值的元素个数与总元素的比例,一般认为比例越大重要性越高。由于 GNN 有很多参数,随着随机初始化,在一开始会有许多要更新的知识。因此我们可以看到图卷积传播权重的 density ratio 在一开始的几个 batch 数据上会有波动。随着训练趋于稳定,该 density ratio 会趋于 0。我们可以发现,随着训练的进行,注意力池化权重的 density ratio 可以保持在一个较高水平。在其他数据集和其他 GNN-based SBR 模型上,我们也可以观测到相同的趋势。

根据这些图,主要观察结果如下:

(1) 在 GNN 模块中,随着训练的进行,图传播权重的密度比接近于零,表明 SBR 中的 GNN 设计过于复杂。

(2) 在Readout模块中,attention pooling权重可以保持相对较高的密度比。

基于此,本文认为(1)不强调复杂的 GNN 设计,而是倾向于删除 GNN 传播部分,只保留初始嵌入层; (2) 我们应该更多地关注基于注意力的读出模块。要去掉GNN,需要读出模块承担更多的推理能力。

4 方法

会话 S={v1,v2,...,vn} 中的每个项目v先emb并归一化得到项目表示: h~j=hj||hj||2 ,经过Attn-Mixer后得到会话表示: s~=s||s||2 ,最后得到得分:

4.1 多级用户意图生成

为了生成具有丰富语义信息的注意力图,同时避免过多噪声信息的干扰,我们利用了 SBR 的固有优先级和局部不变性。固有的优先级在于强调最近点击对用户偏好的贡献,而局部不变性表明局部顺序可能并不重要。为了结合这两个属性,我们首先采用置换不变操作,深度集(deep sets),在具有不同长度的最后一个项目的组上形成组表示。然后我们将线性变换应用于这些组表示以生成多级用户意图query:

这里 Q1 是实例视图注意力query,而 Qi, = 2, 3, ..., 是更高级别的注意力query。对每一层的Q都进行多头注意力计算:

4.2 Attention Mixture

上面的 α∈Rn∗lH 维度很高,如何组合呢?为了在捕获最显著和全面的多层次用户意图之间取得平衡,我们应用 Lp 池化来获得会话的最终会话表示 s~ :

Lp 池化:当p=1时,就是平均池化;当p无穷大时,就是最大池化。作者用的最大池化。

4.3 复杂度

裁剪之后,复杂度可以由

降为

H是head num,L是level num,n是session 长度,一般L<<n。

5 实验

5.1 整体效果

数据集:

Diginetica1是2016年CIKM杯挑战赛中获得的交易数据集,在最后一周数据上进行测试。

Gowalla2是一个包含用户签到信息的数据集,用于推荐兴趣点。 保留了30,000个最受欢迎的位置,并将分割间隔设置为1天。 我们考虑最后20%的会话进行测试。

最后。 Fm3是一个音乐艺术家数据集,用于音乐兴趣推荐。保留了40,000名最受欢迎的艺术家,并将分割间隔设置为8小时。 我们还使用最后20%的会话作为测试集。

三个数据集的平均长度都很短。

5.2 超参数设置

L的长度,可以理解为GNN的深度。可以发现:

  1. 当L=1时效果最差,此时意味着没有GNN传播;
  2. 随着L增加,效果会显著提高;
  3. 性能达到峰值后会下降,这意味着考虑的信息太多,关键信息被覆盖了。

multi-head的个数H。

一个有意思的现象时:在平均长度最长的Last.fm数据集上,H=1效果最优。作者给出的解释是:“表明由于该数据集的方差较大,更多的 heads 会收集噪声”。

session 长度。

作者的实验还表明,在不同session上,Atten-mixer的效果均优于GNN based模型。

### 自注意力机制概述 自注意力机制允许模型在同一序列的不同位置之间建立联系,从而捕捉到更丰富的上下文信息[^3]。这种机制通过计算输入序列中各个元素之间的相似度来分配不同的重要性权重。 #### 计算过程详解 在具体的实现过程中,对于每一个时间步t的隐藏状态\(h_t\),会与其他所有时刻的状态进行比较,得到一组分数向量\[score(h_t, h_{\tau})]\),这些分数反映了当前时刻与过去其他时刻的相关程度。接着利用softmax函数将这组原始得分转换成概率分布形式: \[ \alpha = softmax(score(Q,K)) \] 其中Q表示查询矩阵,K代表键矩阵,V则是值矩阵。这三个矩阵都是通过对输入数据线性变换获得的结果: ```python import torch.nn as nn class ScaledDotProductAttention(nn.Module): def __init__(self, d_k): super(ScaledDotProductAttention, self).__init__() self.d_k = d_k def forward(self, Q, K, V): scores = torch.matmul(Q, K.transpose(-1, -2)) / (self.d_k ** 0.5) attn_weights = F.softmax(scores, dim=-1) context = torch.matmul(attn_weights, V) return context, attn_weights ``` 上述代码实现了缩放点乘法注意力建模方式,这是Transformer架构中最常用的版本之一[^1]。 当查询、键和值来源于相同的输入时,则构成了所谓的“自我关注”。这种方式使得每个位置都能够访问整个序列的信息,并且可以根据实际需求调整各部分的重要性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值