一、GC-SAN [2019]

《Graph Contextualized Self-Attention Network for Session-based Recommendation》

  1. 推荐系统在帮助用户缓解信息过载问题、并在许多应用领域(如电商、音乐、社交媒体)中选择有趣的内容方面发挥着重要作用。大多数现有的推荐系统都是基于用户历史交互。然而,在许多应用场景中,user id 可能是未知的。为了解决这个问题,人们提出了 session-based 推荐,从而根据用户在当前 session 中的 previous behaviors 序列来预测用户可能采取的 next action (如点击一个 item )。

    由于 session-based 推荐的高度的实际价值,人们提出了多种 session-based 的推荐方法。

    • 马尔科夫链(Markov Chain: MC)是一个经典的例子,它假设 next action 是基于前一个 action 。在如此强的假设下,历史交互的独立结合(independent combination) 可能会限制推荐的准确性。

    • 最近的研究强调了在 session-based 推荐系统中使用 recurrent neural network: RNN,并且取得了有前景的成果。例如:

      • 《Session-based recommendations with recurrent neural networks》 提出使用 GRU(RNN 的一种变体)来建模短期偏好。它的改进版本 《Improved recurrent neural networks for session-based recommendations》 进一步提高了推荐性能。

      • 最近,NARM 旨在通过采用全局 RNN 和局部 RNN 同时捕获用户的序列模式(sequential pattern)和主要意图(main purpose)。

    然而,现有方法通常对 consecutive items 之间的单向转移(transition)进行建模,而忽略了整个 session 序列之间的复杂转移。

    最近,一种新的序列模型 Transformer 在各种翻译任务中实现了 SOTA 的性能和效率。Transformer 没有使用递归或卷积,而是利用由堆叠的self-attention 网络所组成的 encoder-decoder 架构来描绘 input 和 output 之间的全局依赖关系。 self-attention 作为一种特殊的注意力机制,已被广泛用于建模序列数据,并在许多应用中取得了显著成果,如机器翻译、情感分析、序列推荐。Transformer 模型的成功可以归因于它的 self-attention 网络,该网络通过加权平均操作充分考虑了所有信号。尽管取得了成功,但是这种操作分散了注意力的分布,导致缺乏对相邻 item 的局部依赖性(local dependency),并限制了模型学习 item 的 contextualized representation 的能力。而相邻 item 的局部上下文信息(local contextual information)已被证明可以增强建模 neural representations 之间依赖关系的能力,尤其是对于注意力模型。

    self-attention 的注意力分布是作用在全局的,因此相对而言会忽略相邻 item 的重要性。即,对self-attention而言,通常难以学到一个相邻 item 的重要性为 1.0、其它 item 的重要性全零的注意力分布。

    在论文 《Graph Contextualized Self-Attention Network for Session-based Recommendation》 中,作者提出通过 graph neural network: GNN 来增强 self-attention 网络。

    • 一方面,self-attention 的优势在于通过显式关注所有位置来捕获长期依赖关系(long-range dependency)。

    • 另一方面,GNN 能够通过编码边属性或节点属性来提供丰富的局部上下文信息。

    具体而言,论文引入了一个叫做 GC-SAN 的 graph contextual self-attention network 用于 session-based 的推荐。该网络得益于 GNN 和 self-attention 的互补的优势。

    • 首先,GC-SAN 从所有历史的 session 序列构建有向图(每个 session 构建一个 session graph )。基于 session graph ,GC-SAN 能够捕获相邻 item 的转移 ,并相应地为图中涉及到的所有节点生成 latent vector 。

    • 然后,GC-SAN 应用 self-attention 机制来建模远程依赖关系,其中 session embedding vector 由图中所有节点的 latent vector 生成。

    • 最后,GC-SAN 使用用户在该 session 的全局兴趣和该用户的局部兴趣的加权和作为 embedding vector,从而预测该用户点击 next item 的概率。

    GC-SAN 和 SR-GNN 非常类似,主要差异在于:GC-SAN 采用attention机制来建模远程依赖关系,而 GC-SAN 采用 self-attention 机制。除此之外,其它部分几乎完全相同。

    这项工作的主要贡献总结如下:

    • 为了改进 session 序列的 representation,论文提出了一种新的、基于 graph neural network: GNN 的 graph contextual self-attention ntwork: GC-SAN 。GC-SAN 利用 self-attention 网络和 GNN 的互补优势来提高推荐性能。

    • GNN 用于建模 separated 的 session 序列的局部图结构依赖关系,而多层 self-attention 网络旨在获得 contextualized non-local representation 。

    • 论文在两个 benchmark 数据集上进行了广泛的实验。通过综合的分析,实验结果表明:与 SOTA 方法相比,GC-SAN 的有效性和优越性。

  2. 相关工作:session-based 推荐是基于隐式反馈的推荐系统的典型应用,其中 user id 是未知的,没有显式的偏好(如评分)而只仅提供 positive observation (如购买或点击)。这些 positive observation 通常是通过在一段时间内被动跟踪用户记录而获得的序列形式的数据。在这种情况下,经典的协同过滤方法(如矩阵分解)会失效,因为无法从匿名的历史交互中构建 user profile (即用户的所有历史交互)。

    这个问题的一个自然解决方案是 item-to-item 推荐方法。在 session-based 的 setting 中,可以从可用的 session 数据中,使用简单的 item co-occurrence pattern 预计算 pre-computed 一个 item-to-item 相似度矩阵。

    • 《Item-based collaborative filtering recommendation algorithms》 分析了不同的 item-based 推荐技术,并将其结果与基础的 k-nearest neighbor 方法进行了比较。

    • 此外,为了建模两个相邻 action 之间的序列关系,《Factorizing personalized markov chains for next-basket recommendation》 提出了将矩阵分解和马尔科夫链(Markov Chain: MC)的力量结合起来进行 next-basket 推荐。

    尽管这些方法被证明是有效的且被广泛使用,但是它们仅考虑了 session 的 most recent click ,而忽略了整个点击序列的全局信息。

    最近,针对 session-based 推荐系统,研究人员转向神经网络和 attention-based 模型。例如:《Session-based recommendations with recurrent neural networks》 最早探索 Gated Recurrent Unit: GRU ( RNN 的一种特殊形式)用于预测 session 中的 next action ,《Improved recurrent neural networks for session-based recommendations》后续提出了改进版本从而进一步提高推荐性能。

    如今,人们已经提出Graph Neural Network: GNN 以 RNN 的形式来学习图结构化的数据的 representation ,并广泛应用于不同的任务,如图像分类、脚本事件(script event)预测、推荐系统(《Session-based recommendation with graph neural networks》)。

    另一方面,人们已经在各种应用(如,自然语言处理 natural language processing: NLP 和计算机视觉 computer vision: CV )中引入了几种 attention-based 机制。标准的普通的注意力机制已经被纳入推荐系统(NARM、STAMP)。最近,《Attention is all you need》 提出了完全基于 self-attention 来建模单词之间的依赖关系,无需任何递归或卷积,并且在机器翻译任务上取得了 SOTA 的性能。基于简单的和并行化的 self-attention 机制,SASRec 提出了一种基于 self-attention 的序列模型,其性能优于 MC/CNN/RNN-based 的序列推荐方法。《Csan: Contextual self-attention network for user sequential recommendation》 提出了一个在 feature level 的、 统一的 contextual self-attention network ,从而捕获异质用户行为的多义性(polysemy),从而进行序列推荐。

    大多数现有的序列推荐模型都用 self-attention 机制来捕获序列中的远距离 item-item transition ,并且取得了 SOTA 性能。然而,在相邻 item 之间建立复杂的上下文信息仍然具有挑战性。在本文中,我们通过 GNN 来增强 self-attention network ,同时保持模型的简单性和灵活性。据我们所知,这是对 session-based 推荐的 self-attention network 和 GNN 的首次尝试,其中:self-attention network 可以建模 session 的全局 item-item 信息,GNN 可以通过对构建的图的属性特征进行编码从而学习局部上下文信息。

1.1 模型

  1. 这里我们介绍了基于 GNN 的 contextualized self-attention 推荐模型 GC-SAN 。我们首先公式化 session-based 推荐问题,然后详细描述我们模型的架构(如下图所示)。

    GC-SAN 结合了 GNN 和 SASRec,只是将 SASRec 的 embedding layer 替换为 GNN 生成的 embedding 。

    相比之下,SR-GNN 和 GC-SAN 都使用了 GNN,二者区别在于 SR-GNN 使用了 last click item embedding 作为 query 的 attention ,而 GC-SAN 使用了 self-attention 。

  2. session-based 推荐旨在仅基于用户当前的交互序列来预测用户接下来想点击哪个 item 。这里我们给出 session-based 推荐问题的公式如下。

    令 V={v1,v2,⋯,vm} 为所有 session 中涉及的所有 unique item 的集合。对于每个匿名 session,用户点击 action 的序列记做 S={vs1,vs2,⋯,vsn} ,其中 vst∈V 表示用户在 time step t 的点击 item 。正式地,给定action 序列在时刻 t 的prefix St={vs1,vs2,⋯,vst−1,vst}(即,被截断到时刻 t ),我们的模型旨在预测时刻 t+1 的可能的点击。准确而言,我们的模型会生成一个包含所有候选 item 的排序列表(ranking list)。y→^={y^1,y^2,⋯,y^m} 表示所有候选 item 的输出概率,其中 y^i 对应 item vi 的推荐分。 由于推荐器通常会为用户做出多个推荐,因此我们从 y→^ 中选择 top-N 个 item 进行推荐。

1.1.1 动态图结构

  1. 图构建:GNN 的第一部分是从所有 session 中构建一个有意义的图。给定一个 session S={vs1,vs2,⋯,vsn} ,我们将每个 item vsi 视为一个节点,将 (vsi−1,vsi) 视为一条边,表示用户在 session S 中点击 item vsi−1 之后点击了 vsi 。因此,每个 session 序列都可以建模为有向图。

    可以通过促进不同节点之间的通信来更新图结构。具体而言,令 MI,MO∈Rn×n 分别表示 session graph 中的入边incoming edge加权链接、出边outgoing edge 加权链接。例如,考虑一个 session S={v1,v3,v2,v4,v3} ,对应的 graph 和矩阵(即 MI,MO )如下图所示。由于 session 序列中可能会重复出现多个 item,因此我们为每条边分配归一化权重,其计算方法为:边的出现次数除以该边的起始节点的 out-degree 。

    注意,我们的模型可以支持各种构建 session graph 的策略,并生成相应的链接矩阵(connection matrix)。然后我们可以将两个加权的链接矩阵与图神经网络一起应用来捕获 session 序列的局部信息。

  2. 节点向量更新:接下来我们介绍如何通过 GNN 获得节点的潜在特征向量(latent feature vector)。我们首先将每个 item v∈V 映射到统一的低维潜在空间,节点向量 v→∈Rd 表示 item v 的 d 维实值潜在向量。对于 graph session 中时刻 t 的每个节点 vst ,给定链接矩阵 MI,MO ,不同节点之间的信息传播可以形式化为:

    a→t=concat((WaI[v→s1,⋯,v→sn])m→tI+b→I,(WaO[v→s1,⋯,v→sn])m→tO+b→O)∈R2d

    其中:

    • WaI,WaO∈Rd×d 为参数矩阵,b→I,b→O∈Rd 为偏置向量。

    • m→tI,m→tO∈Rn×1 为 MI 和 MO 的第 t 行,对应于节点 vst 。

    • a→t 抽取了节点 vst 的邻域的上下文信息。

    (WaI[v→s1,⋯,v→sn])m→tI 的物理意义为:首先将节点 embedding 经过 WaI 投影,然后基于边的权重(由 m→tI 定义)进行聚合。

    然后我们将 a→t 和 previous state v→vst−1 一起作为 GNN 的输入。因此,GNN layer 的 final output h→t 计算如下:

    z→t=σ(Wza→t+Pzv→st−1),r→t=σ(Wra→t+Prv→st−1)h→~t=tanh⁡(Wha→t+Ph(r→t⊙v→st−1))h→t=(1−z→t)⊙v→st−1+z→t⊙h→~t∈Rd

    其中:

    • Wz,Wr,Wh∈Rd×2d ,Pz,Pr,Ph∈Rd×d 都是可学习的权重矩阵。

    • σ(⋅) 为 sigmoid 函数,⊙ 表示逐元素乘法。

    • z→t 为更新门,它决定保留哪些信息;r→t 为复位门,它决定丢弃哪些信息。

    事实上这里是单层 GNN 的更新公式。在 SR-GNN 中给出了多层 GNN 的更新公式。在 SR-GNN 中,GNN 不断迭代直到达到不动点。

1.1.2 自注意力层

  1. self-attention 是注意力机制的一个特例,并已成功应用于许多研究主题,包括 NLP 和 QA 。self-attention 机制可以抽取 input 和 output 之间的全局依赖关系,并捕获整个 input 序列和 output 序列本身的 item-item 转移,而不考虑它们的距离。

  2. Self-Attention Layer:将 session 序列输入 GNN 之后,我们可以得到 session graph 中所有节点的潜在向量,即:H=[h→1,h→2,⋯,h→n]∈Rd×n 。然后,我们将它们输入 self-attention layer 从而更好地捕获全局 session 偏好:

    F=(WVH)softmax((WQH)⊤(WKH)d)∈Rd×n

    其中:WQ,WK,WV∈Rd×d 为投影矩阵。

    因为 attention 矩阵是 Rn×n ,而 WVH∈Rd×n ,因此这里 softmax 位于右侧。

  3. Point-Wise Feed-Forward Network:之后,我们应用两个带 ReLU 激活函数的线性变换来赋予模型非线性,并考虑不同潜在维度之间的交互。然而,在 self-attention 操作中可能会发生 transmission loss 。因此,我们在前馈网络之后添加了一个残差连接,这使得模型更容易利用 low-layer 的信息。

    E=W2(ReLU(W1F+b→1))+b→2+F∈Rd×n

    其中:W1,W2∈Rd×d 为投影矩阵,b→1,b→2∈Rd 为偏置向量。

    此外,为了缓解深度神经网络中的过拟合问题,我们在训练期间应用了 Dropout 正则化技术。为简单起见,我们将上述整个 self-attention 机制定义为:

    E=SAN(H)
  4. 多层 self-attention:最近的工作表明,不同的层捕获不同类型的特征。在这项工作中,我们研究了哪些 level 的层从特征建模中受益最多,从而学习更复杂的 item transition 。

    第一层定义为:E(1)=E 。第 k 个 self-attention layer (k>1)定义为:

    E(k)=SAN(E(k−1))

    其中:E(k)∈Rd×n 为 multi-layer self-attention network 的 final output 。

1.1.3 预测层

  1. 在若干个自适应地提取 session 序列信息的 self-attention block 之后,我们实现了 long-term 的 self-attentive representation E(k) 。为了更好地预测用户的 next click,我们将 session 的长期偏好和当前兴趣结合起来,然后使用这种组合的 embedding 作为 session representation 。

    对于 session S={vs1,vs2,⋯,vsn} ,遵从 SASRec,我们将 E(k) 的最后一个embedding 作为 global embedding 。local embedding 可以简单地定义为 last clicked-item 的 embedding 向量,即 h→n∈Rd 。然后我们将它们加权在一起作为 final session embedding:

    s→f=ωe→n(k)+(1−ω)h→n∈Rd

    其中: e→n(k)∈Rd 为 E(k) 的最后一个 embedding ,ω 为加权系数。

    SR-GNN 使用的是投影矩阵来投影:s→h=W3[h→n,e→n(k)] 。理论上讲,用投影矩阵的方式更灵活,模型容量更大。当 W3 退化为 [(1−ω),ω] 时,就等价于线性加权。

  2. 最后,在给定 session embedding s→f 的情况下,我们预测每个候选 item vi∈V 作为 next click 的概率为:

    y^i=softmax(s→f⊤v→i)∈R

    其中:y^i 表示 item vi 成为 session S 中 next click 的概率。

    注意: v→i 是 GNN 的 output,即它和 h→n 都是相同类型的 embedding 。

    然后我们通过最小化以下目标函数来训练我们的模型:

    J=−∑j=1ny→jlog⁡(y→^j)+(1−y→j)log⁡(1−y→^j)+λ∥θ∥2

    其中:y→ 为 ground truth item 的 one-hot encoding 向量,θ 为所有的可学习的参数。

1.2 实验

  1. 我们进行实验来回答以下问题:

    • RQ1:所提出的推荐模型 GC-SAN 是否实现了 SOTA 的性能?

    • RQ2:关键的超参数(如权重因子、embedding size)如何影响模型性能?

  2. 数据集:

    • Diginetica:来自于 CIKM Cup 2016 ,这里仅使用交易数据。

    • Retailrocket:来自一家个性化电商公司,其中包含六个月的用户浏览记录。

    对于这两个数据集,为了过滤噪音,我们过滤掉出现频次少于 5 次的 item,然后删除 item 数量少于 2 的所有 session 。此外,对于 session-based 的推荐,我们最后一周的 session 数据设为测试集,剩余数据作为训练集。

    类似于 《Improved recurrent neural networks for session-based recommendations》 和 《A simple convolutional generative network for next item recommendation》,对于 session 序列 S={vs1,vs2,⋯,vsn} ,我们生成 input 和相应的 label 为:({vs1},vs2),({vs1,vs2},vs3),⋯,({vs1,vs2,⋯,vsn−1},vsn) 用于训练和测试。

    预处理之后,数据集的统计数据如下表所示:

  3. 评估指标:为了评估所有模型的推荐性能,我们采用三个常见指标,即 Hit Rate(HR@N)、Mean Reciprocal Rank (MRR@N)、Normalized Discounted Cumulative Gain(NDCG@N)。HR@N 是对 unranked 的检索结果进行评估,MRR@N 和 NDCG@N 是对 ranked list 进行评估。这里我们考虑 top N 推荐,N={5,10} 。

  4. baseline 方法:

    • Pop:一个简单的 baseline,它根据训练数据中的流行度来推荐排名靠前的 item 。

    • BPR-MF:SOTA 的 non-sequential 的推荐方法,它使用一个 pairwise ranking loss 来优化矩阵分解。

    • IKNN:一种传统的 item-to-item 模型,它根据余弦相似度来推荐与候选 item 相似的 item 。

      item 向量的生成参考 SR-GNN 的 baseline 介绍部分。

    • FPMC:一个用于 next-basket 推荐的经典的混合模型,结合了矩阵分解和一阶马尔科夫链。注意,在我们的推荐问题中,每个 basket 就是一个 session 。

      作者描述有误,应该是每个 basket 就是一个 item 。

    • GRU4Rec :一种 RNN-based 的深度学习模型,用于 session-based 推荐。它利用 session-parallel 的 mini-batch 训练过程来建模用户行为序列。

    • STAMP:一种新颖的 short-term memory priority 模型,用于从 previous 点击中捕获用户的长期偏好、以及从 session 中的 last click 来捕获当前兴趣。

    • SR-GNN:最近提出的 session-based 的 GNN 推荐模型。它使用 GNN 生成 item 的潜在向量,然后通过传统的 attention network 来表达每个 session 。

  5. 性能比较(RQ1):为了展示我们的模型 GC-SAN 的推荐性能,我们将其与其它 SOTA 方法进行比较。实验结果如下所示:

    • 非个性化的、基于流行度的方法(即,Pop)在两个数据集上的效果最差。通过独立地处理每个用户(即,个性化)并使用 pairwise ranking loss,BPR-MF 比 Pop 表现更好。这表明个性化在推荐任务中的重要性。

      IKNN 和 FPMC 在 Diginetica 数据集上的性能优于 BPR-MF,而在 Retailrocket 数据集上的性能差于 BPR-MF。实际上,IKNN 利用了 session 中 item 之间的相似性,而 FPMC 基于一阶马尔科夫链。

    • 所有神经网络方法,如 GRU4Rec 和 STAMP ,几乎在所有情况下都优于传统的 baseline (如:FPMC 和 IKNN),这验证了深度学习技术在该领域的实力。

      GRU4Rec 利用 GRU 来捕获用户的通用偏好(general preference),而 STAMP 通过 last clicked item 来改善短期记忆。不出所料,STAMP 的表现优于 GRU4Rec,这表明短期行为对于预测 next item 问题的有效性。

      另一方面,通过将每个 session 建模为图并应用 GNN 和注意力机制,SR-GNN 在两个数据集上都优于所有其它 baseline。这进一步证明了神经网络在推荐系统中的强大能力。

    • 与 SR-GNN 相比,我们的方法 GC-SAN 采用 self-attention 机制自适应地为 previous item 分配权重,而无论它们在当前 session 中的距离如何,并捕获 session 中 item 之间的长期依赖关系。我们以线性方式将long-range self-attention representation 和 short-term interest of the last-click 相结合,从而生成 final session representation 。正如我们所看到的,我们的方法在 HR, MRR, NDCG 指标在所有数据集上超越了所有 baseline 。这些结果证明了 GCSAN 对 session-based 推荐的有效性。

  6. 模型分析(RQ2):这里我们深入分析研究 GC-SAN,旨在进一步了解模型。限于篇幅,这里我们仅展示 HR@10 和 NDCG@10 的分析结果。我们在其它指标上也获得了类似的实验结果:

    • GNN 的影响:虽然我们可以从上表中隐式地推断出 GNN 的有效性,但是我们想验证 GNN 在 GC-SAN 中的贡献。我们从 GC-SAN 中移除 GNN 模块,将其替代为随机初始化的 item embedding,并馈入 self-attention layer 。

      下表展示了使用 GNN 和不使用 GNN 之间的效果。可以发现:即使没有 GNN,GC-SAN 在 Retailrocket 数据集上仍然可以超越 STAMP,而在 Diginetica 数据集上被 GRU4Rec 击败。

      事实上,Retailrocket 数据集的最大 session 长度几乎是 Diginetica 数据集的四倍。一个可能的原因是:短序列长度可以构建更稠密的 session graph,提供更丰富的上下文信息,而 self-attention 机制在长序列长度下表现更好。这进一步证明了 self-attention 机制和 GNN 在提高推荐性能方面发挥着重要作用。

      GNN 在短序列的 session-based 推荐中的作用更大(相比长序列的 session-based 推荐)。

    • 权重因子 ω 的影响:权重因子 ω 影响 self-attention representation 和 last-clicked action 之间的贡献,如下图 (a) 。可以看到:

      • 仅将全局 self-attention 作为 final session embedding (即,ω=1.0),通常要比仅考虑当前兴趣(即,ω=0.0) 获得更好的性能。

      • ω 的取值设置为 0.4 ~ 0.8 之间的效果更好。

      这表明:虽然带 GNN 的 self-attention 机制可以自适应地分配权重从而关注长期依赖关系、或更近期的行为,但是短期兴趣对于提高推荐性能也是必不可少的。

      这个权重可以通过数据来自适应地学到。

    • self-attention block 数量 k 的影响:如前所述,我们研究了哪些 level 的 self-attention layer 从 GC-SAN 中受益最多。下图 (b) 展示了应用不同数量的 self-attention block 的效果,其中 k 从 1 ~ 6 。在这两个数据集上,我们可以观察到增加 k 可以提高 GCSAN 的性能。

      然而,当 k 选择正确时,模型会获得最佳性能。而对于更大的 k 值,模型性能会变得更差。这可能是因为使用更多的 block( k≥4 )会使 GC-SAN 更容易丢失 low-layer 的信息。

    • embedding size d 的影响:下图中,我们研究了 emebdding size d 在两个数据集上的效果,d 从 10 ~ 120 。

      在所有 baseline 中,STAMP 和 SR-GNN 表现良好且稳定。因此,为了便于比较,我们使用 STAMP 和 SR-GNN 作为两个 baseline 。从图中可以观察到:

      • 我们的模型 GC-SAN 在所有 d 上始终优于 STAMP 。

      • 当 d 小于某个值时,SR-GNN 的性能优于 GC-SAN。一旦超过这个值,GC-SAN 的性能仍然会增长并且最终在 d≥100 时稳定,而 SR-GNN 的性能会略有下降。这可能是因为相对较小的 d 限制了 GC-SAN 捕获 item 潜在因子之间的复杂 transition ,而 SR-GNN 可能会因为较大的 d 而过拟合从而受到影响。