简介

传统的深度学习网络主要针对图片,语音等欧氏空间内规则型数据;而对社交、电商和医疗等非规则结构数据则仍受到一定程度的限制。以电商场景为例,可以将用户、商品和广告等都看作节点(nodes),而将用户对于商品的购买,广告的点击等操作视为边(edges,节点间连接)。节点和边就构成了一张图(Graph),GNN将这张整图作为输入,进行邻居信息汇聚等操作,学习图中节点,边或子图的向量表达(embedding),从而实现分类、推荐和预测等任务。可以看出在设计思路上GNN对于非结构化数据是具有一定优势的,但很少有GNN模型能直接应用于真实互联网商业场景的推荐任务中。PinSage利用高效的random walk和GCN抽取节点的特征和图结构拓扑性质,成为了首个能够在大规模数据场景下实现推荐任务的基于GNN的模型。

创新点及贡献

PinSage模型对节点进行特征聚合是基于图神经网络的,然而原始的GCN需要将图进行傅里叶变换,并基于图拉普拉斯矩阵实现图卷积,这种方式在节点数据量很大的时候很难实际应用。作者提出了一个高度可扩展的GCN框架,在一个有30亿节点和180亿条边的巨大图上运行——这个图比GCNs的典型应用大10000倍。PinSage利用了几个关键的改进来显著提高GCN的可伸缩性:

  • 动态卷积:传统的GCN算法通过将特征矩阵乘以全图拉普拉斯函数的幂来实现图卷积。相比之下,PinSage算法通过对一个节点周围的邻域进行采样,并从这个采样的邻域动态地构造一个计算图,来执行高效的局部卷积。这些动态构造的计算图(图1)指定了如何围绕特定节点执行局部卷积,并减轻了在训练期间对整个图进行操作的需要;
  • 小批量训练数据的构建:开发了一个生产者-消费者架构来构建小批量,以确保在模型训练期间获得最大的GPU利用率;
  • 在推理过程中采用MapReduce的方法避免重复计算。

除了以上改进之外,作者还引入了新的训练技术和算法创新。这些创新提高了PinSage学习到的表示的质量,在下游推荐系统任务中导致了显著的性能提高:

  • 通过随机游动构造卷积:利用节点的完整邻域来执行卷积(图1)会得到巨大的计算图,然而像GraphSage那样随机采样邻居节点对目标任务来说并不是最优的。开发了一种利用短随机游动来抽样计算图的新技术,这样做的另一个好处是,每个节点现在都有一个重要性分数,在后续池/聚合步骤中会用到这个分数;
  • 重要性池化:图卷积的一个核心组成部分是对图中来自局部社区的特征信息的聚合。我们引入了一种基于随机行走相似度度量的方法来衡量节点特征在该聚合中的重要性,从而使离线评估指标的性能提高了46%;
  • 课程训练:设计了一种课程训练模式,不断增加样本的训练难度,从而使得到12%的提升。

PinSage模型结构

前向传播算法

前向传播算法的目的是根据节点自身的属性信息以及图结构信息学习节点的特征嵌入。
算法流程如下:

输入数据是节点\(u\)当前的特征向量\(z_{u}\)、节点\(u\)的邻居的特征向量\(\left\{ z_{u} \right\}\)、节点邻居的权重\(\alpha\)以及聚合函数\(\gamma()\)。输出是节点\(u\)的新的特征向量。

邻居重要性权重\(\alpha\)的计算方式

首先明确一点,论文中的邻居的概念和普通意义上的邻居是不一样的,通常理解的邻居是指和节点有直接连边的点,文中邻居的定义是:对节点\(u\)产生影响最大的\(T\)个节点(不一定是有直接连边的)。从节点\(u\)开始执行随机游走,节点重要性定义为某个节点被游走到的次数的归一化结果。

小批量训练算法

算法2详细说明了如何为小批节点集\(M\)生成嵌入。首先计算每个节点的邻居,然后堆叠K层卷积迭代生成目标节点的k层表示。最后卷积层的输出通过一个全连接的神经网络来生成最终的输出嵌入\(z_{u},\forall u\in M\)

图2 小批量训练算法伪代码

模型训练

损失函数

为了训练模型的参数,文中使用了一个基于最大边际的损失函数。其基本思想是,我们想要最大化正的例的内积,即查询项和相应的相关项的嵌入。同时,我们想要确保负例的内积(即查询项目和不相关项目之间的内积)比正样本的内积小。

其中,\(p_{n}(q)\)为项目\(q\)负例的分布,∆为边界超参数。

负样本采样策略

为了提高大批量训练的效率,我们抽样了一组500个负样本,由每个小批中的所有训练示例共享。与独立地为每个节点进行负采样相比,这大大节省了在每个训练步骤中需要计算的嵌入的数量。根据经验,我们没有观察到两种抽样方案的性能之间的差异。
在最简单的情况下,我们可以从整个项目集合中均匀地抽取负样本。但是,确保正样对(q,i)的内积大于500个负项中的每一个很容易,不能为系统学习提供足够好的“分辨率”。特别是,我们的推荐算法应该能够在超过20亿个项目的目录中找到1000个最相关的项目。换句话说,我们的模型应该能够在200万个项目中区分/识别1个项目。但对于500个随机的负面项目,该模型的分辨率只有500个中的1个。因此,如果我们从20亿个项目中随机抽取500个负面项目,这些项目中的任何一个与查询项目甚至有轻微相关的可能性都很小。因此,学习有很大的可能不会进行很好的参数更新,也不能区分轻微相关的项目和非常相关的项目。因此论文增加了“hard”负样本这一操作,“hard”负样本的要求是与query有一定关联性,但与正样本item区别较大,那么如何确定“hard”负样本呢,论文中根据PageRank排名来确定,对于query来说排名在2000-5000之间的items为“hard”负样本候选集,可进行随机采样,这种方式其实是在增加训练难度,强行提高模型区分items的能力。

实验设置

PinSage在训练的过程中采用了Multi-GPU形式,minibatch取值为512-4096不等,大的batchsize可能会导致收敛困难,论文采取了warmup策略,即根据线性规则在第一个epoch中逐步将学习率(learning rate)从一个小值增加到峰值,之后在指数级减小learning rate。在整个训练过程中使用“hard”负样本会使训练收敛所需的时间增加一倍。为了加快收敛,作者采用了课程培训方案。在训练的第一个epoch,不使用“hard”负样本,从而使算法在参数空间中快速找到损失相对较小的区域。然后,在随后的各个epoch添加“hard”负样本,集中模型学习如何区分高度相关的pins和只有轻微相关的pins。在训练到第n个epoch时,为每个样本添加n-1个“hard”负样本。

论文中涉及的实验有两个任务,第一个任务是推荐有关联的pins,利用embedding空间内K临近的方法推荐;第二个任务是home/news的场景下推荐pins,在embedding空间推荐距离用户最经常浏览的item最近的pins。

训练过程中数据集内包含12亿正样本,每个batch包含500个负样本,每个pin包含6个“hard”负样本,共计75亿样本。训练过程中并没有采用所有的数据,而是利用部分数据进行训练,再利用训练好的模型推理出所有节点的embedding。训练数据是随机选取的,其中包含了20%boards,70%有label的样本。在超参的精调中会再加入10%有label的样本,剩余的20%有label的样本作为测试集。训练和验证集大小接近18T,最终输出的embedding为4T。

pin的原始feature(特征)由三部分组成,视觉信息,文字说明和每个节点在图中度的log值。其中视觉信息由VGG-16提取,共4096维;文字说明由Word2Vec-based模型提取,共256维。而在实验过程中,信息汇聚函数的选取方式也有很多,包括max-pooling、mean-pooling、mean-pooling-xent、mean-polling-hard和PinSage提到的考虑邻居重要性的importance pooling,论文对上述汇聚方式也都做了比较。训练过程中采样深度,隐层维度为2048,最终embedding维度为1024。

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3