Session-Based Recommendation with Graph Neural Networks[AAAI'19]

AAAI19一篇将gated GNN应用于序列推荐任务的论文

解决的问题

在序列推荐任务中,现有的方法很难在每条序列中取得准确的用户embedding,因为得到的序列数据往往是匿名的,且序列中记录的点击数据所透露出来的用户行为信息有限。同时,序列中物品间的关系虽然常被证实有效,但现有的方法往往只考虑一阶的前后连续关系,即对于$a\rightarrow b \rightarrow c$,只考虑$a\rightarrow b$或者$b\rightarrow c$

做法及创新

BF3uuT.png

Session Graph Modeling

将每条序列$s$表示成一个有向图,并对图中的边进行正则化,具体做法为边的出现次数除以边起始顶点的出度。以序列$s=[v_1,v_2,v_3,v_2,v_4]$为例构建一个有向图,得到邻接矩阵:

BF17nO.png

上面的邻接矩阵以考虑顶点的出边并以出度正则化,类似地可以考虑顶点的入边并以入度正则化,将得到的两种邻接矩阵进行拼接,得到论文中提到的连接矩阵$A_s\in \mathbb{R}^{n\times 2n}$,其中的一行$A_{s,i:}\in \mathbb{R}^{1\times 2n}$对应于所构建的有向图中的一个顶点$v_{s,i}$:

BFGCkQ.png

Node Representation Learning

论文使用gated GNN来学习图中顶点的表示,为了类比地说明各式的具体含义,首先对Gated Recurrent Units(GRU)进行介绍,它是循环神经网络中的一个概念。

GRU

一个典型的GRU如下所示,输入为上一时刻的隐层表示$H_{t-1}$及当前时刻的表示$X_t$,包含一个重置门Reset Gate和一个更新门Update Gate:

BFaaAf.png

直观的来说,重置门决定有多少历史信息被保留,而更新门决定利用多少当前时刻$X_t$的信息。给定当前时刻输入$X_t\in \mathbb{R}^{n\times d}$,上一时刻隐层表示$H_{t-1}\in \mathbb{R}^{n\times h}$,重置门与更新门的输出由下式计算得到:

式中的$W$与$b$分别为权重与偏置参数。

Reset Gate

传统RNN网络的隐式状态更新公式为:

如果我们需要减少历史信息带来的影响,可以将$H_{t-1}$与$R_t$逐元素相乘。如果$R_t$中的元素接近于1,得到的结果就是传统的RNN,如果$R_t$中的结果接近于0,得到的结果就是以$X_t$作为输入的MLP,计算出来的$\tilde{H_t}$称为候选状态:

Update Gate

更新门决定新的隐式状态$H_t$多大程度上与上一时刻$H_{t-1}$相同,以及重置门得到的候选状态$\tilde{H_t}$中有多少信息可以被利用,如果$Z_t$中的元素接近于1,将主要保留历史信息,当前时刻$X_t$的信息基本被忽略,这相当于跳过了时刻$t$;当$Z_t$中的元素接近于0时,$H_t$将主要由$\tilde{H_t}决定$:

介绍完了GRU的基本概念,接下来是论文中的方法,可以类比地进行学习:

BkiNUU.png

最主要的不同之处在公式$(1)$,它用于在连接矩阵$A_s$的约束下进行不同顶点间的信息传播,具体来说,它提取了邻域的隐向量并将它们作为GNN的输入。

Session Representation Generation

现有的做法都假设每条序列中的用户都有一个独特的隐式表示,而论文中提出的方法不对这个隐式向量做任何假设,相反,它用序列中顶点的表示来作为序列的表示,而顶点的表示正是上一步将所有序列构建的图送入gated GNN学习得到的。给定一个序列$\text{s}=[v_{s,1},v_{s,2},\dots,v_{s,n}]$,这一步的目的是得到它的embedding向量$s\in \mathbb{R}^d$。为了结合用户的长期偏好与当前兴趣,生成的embedding向量也有局部和全局两部分组成。

局部embedding向量的构造非常简单,就是最后一个点击过的物品的表示,因为最后一个点击过的物品就表明了用户当前的兴趣:

全局embedding向量的构造需要将所有顶点的表示都聚合进来,论文的做法是做一个线性加权,权重使用$\text{soft-attention}$机制来计算得到:

最后使用一个$\text{Linear}$层来将局部与全局embedding向量进行结合得到最终的序列embedding向量:

Making Recommendation

对于一个待推荐物品$v_i\in V$,计算它在序列$s$中作为下一个被点击物品的概率:

数据集

Yoochoose、Diginetica