【推荐算法论文阅读】Graph Convolutional Neural Networks for Web-Scale Recommender Systems

一、背景

扩展 GCN 很困难,因为很多在大数据环境中,很多基于这些 GCN 设计的假设都不成立了。比如,所有的基于 GCN 的推荐系统需要在训练时使用图的拉普拉斯矩阵,但是当顶点数很大的时候,这就不现实了,因为算不出来。

所以本文提出了一种在 Pinterest 上的大规模深度推荐引擎,开发了一种高效的图卷积算法 PinSage,融合了随机游走和图卷积,来生成顶点(物品)的表示,同时整合了顶点信息和图结构。

二、模型结构

本文方法的计算关键在于局部图卷积的表示(notion)。我们使用多个卷积模块来聚合一个顶点局部的邻域特征信息,来生成这个顶点的 embedding(比如一个物品)。每个模块学习如何从一个小的图邻域中聚合信息,并且通过堆叠多个这样的模块,我们的方法可以获得局部网络的拓扑结构信息。更重要的是,这些局部卷积模块的参数对所有的顶点来说是共享的,这使得我们的方法的参数的计算复杂度与输入的图的大小无关。
请添加图片描述

1. Forward propagation algorithm

考虑对顶点 u 生成 embedding z u z_u zu 的任务,需要依赖顶点的输入特征和这个顶点周围的图结构。
PinSage 算法是一个局部卷积操作,我们可以通过这个局部卷积操作学到如何从 u 的邻居聚合信息。这个步骤为:
请添加图片描述

从本质上来说,我们通过一个全连接神经网络对 ∀ v ∈ N ( u ) ∀v∈N(u) vN(u)
,也就是 u 的邻居的表示 z v z_v zv 进行了变换,之后在结果向量集合上用一个聚合/池化函数(例如:一个 element-wise mean 或是加权求和,表示为 γ)(Line 1)。这个聚合步骤生成了一个 u 的邻居N(u) 的表示 n u n_u nu。之后我们将这个聚集邻居向量 n u n_u nu和 u 的当前表示向量进行拼接后,输入到一个全连接神经网络做变换(Line 2)。除此以外,第三行的 normalization 使训练更稳定,而且对近似最近邻搜索来说归一化的 embeddings 更高效。算法的输出是集成了 u 自身和他的局部邻域信息的表示。

2. Importance-based neighborhoods

我们方法中的一个重要创新是如何定义的顶点邻居 N ( u ) N ( u ) N(u),也就是我们在算法1中是如何选择卷积的邻居集合。尽管之前的 GCN 方法简单地检验了 k-hop 邻居,在 PinSage 中我们定义了基于重要性的邻域,顶点 u 的邻居定义为 T 个顶点,这 T 个顶点对 u 是最有影响力的。具体来说,我们模拟了从顶点 u 开始的随机游走,并且计算了通过随机游走对顶点的访问次数的 L1 归一化值。u 的邻居因此定义为针对顶点 u 来说 T 个最高的归一化的访问数量的顶点。

这个基于重要性的邻域定义的优点有两点。第一点是选择一个固定数量的邻居顶点来聚集可以在训练过程中控制内存开销。第二,在算法1中聚集邻居的向量表示时可以考虑邻居的重要性。特别地,我们在算法1中实现的 γ 是一个加权求均值的操作,权重就是 L1 归一化访问次数。我们将这个新的方法称为重要度池化(importance pooling)。

3. Stacking convolutions

每次使用算法1的 CONVOLVE 操作都会得到一个顶点的新的表示,我们可以在每个顶点上堆叠卷积来获得更多表示顶点 u 的局部邻域结构的信息。特别地,我们使用多层卷积,其中对第 k 层卷积的输入依赖于 k−1 层的输出,最初的表示(”layer 0”)等价于顶点的输入特征。需要注意的是,算法1中的模型参数 ( Q , q , W (Q , q , W Q,q,W 和 w)在顶点间是共享的,但层与层之间不共享。

请添加图片描述
算法2详细描述了如何堆叠卷积操作,针对一个 minibatch 的顶点 M 生成 embeddings。首先计算每个顶点的邻居,然后使用 K 个卷积迭代来生成目标顶点的 K 层表示。最后一层卷积层的输出之后会输入到一个全连接神经网络来生成最后的 embedding z u , ∀ u ∈ M z_u , ∀ u ∈ M zuuM

三、模型训练

1. loss

使用 max-margin ranking loss 来训练 PinSage。在这步,假设我们有了一组标记的物品对 L , ( q , i ) ∈ L L , ( q , i ) ∈ L L(q,i)L认为是相关的,也就是当查询 q 时,物品 i 是一个好的推荐候选项。训练阶段的目标是优化 PinSage 的参数,使得物品对 ( q , i ) ∈ L ( q , i ) ∈ L (q,i)L 的 embedding 在标记集合中尽可能的接近。

为了训练模型的参数,我们使用了一个基于最大边界的损失函数。基本的思想是我们希望最大化正例之间的内积,也就是说,查询物品的 embedding 和对应的相关物品的 embedding 之间的内积。与此同时我们还想确保负例之间的内积,也就是查询物品的 embedding 和那些不相关物品 embedding 之间的内积要小于通过提前定义好的边界划分出的正例的内积。对于单个顶点对 embeddings ( z q , z i ) : ( q , i ) ∈ L ( z_q , z_i ) : ( q , i ) ∈ L (zq,zi):(q,i)L 的损失函数是:

请添加图片描述
其中, P n ( q ) P_n ( q ) Pn(q) 表示物品 q 的负样本分布,Δ 表示 margin 超参数。

2. 负样本采样

负样本采样在我们的损失函数中作为 edge likelihood 的归一化系数的近似值。为了提升 batch size 较大时的训练效率,我们采样了 500 个负样本作为一组,每个 minibatch 的训练样本共同使用这一组。相比于对每个顶点在训练时都进行负样本采样,这极大地减少了每次训练时需要计算的 embeddings 的数量。从实验上来看,我们发现这两种方法在表现上没什么特别大的差异。

在最简单的情况中,我们从整个样本集中使用均匀分布的抽样方式。然而,确保正例( ( q , I ) ( q , I ) (q,I))的内积大于 q 和 500 个负样本中每个样本的内积是非常简单的,而且这样做不能提供给系统足够学习的分辨率。我们的推荐算法应该能从 200 亿个商品中找到对于物品 q 来说最相关的 1000 个物品。换句话说,我们的模型应该能从超过 2 千万的物品中区分/辨别出 1 件物品。但是通过随机采样的 500 件物品,模型的分辨率只是 1/500。因此,如果我们从 200 亿物品中随机抽取 500 个物品,这些物品中的任意一个于当前这件查询的物品相关的几率都很小。因此,模型通过训练不能获得好的参数,同时也不能对相关的物品进行区分的概率很大。为了解决上述问题,对于每个正训练样本(物品对 ( q , I ) ( q , I ) (q,I)),我们加入了”hard”负例,也就是那些与查询物品 q 有某种关联的物品,但是又不与物品 i 有关联。我们称这些样本为”hard negative items”。通过在图中根据他们对查询物品 q 的个性化 PageRank 分数来生成。排名在 2000-5000 的物品会被随机采样为 hard negative items。hard negative examples 相比于随机采样的负样本更相似于查询物品,因此对模型来说挑战是排名,迫使模型学会在一个好的粒度上分辨物品。

参考资料

Graph Convolutional Neural Networks for Web-Scale Recommender Systems

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值