本次介绍的paper是“Graph Convolutional Neural Networks for Web-Scale Recommender Systems”,也就是PinSage。图卷积网络( GCN)是近几年很火的研究方向,如何将GCN应用到实际场景中也是业界的研究热点。PinSage是第一个在推荐系统成功应用GCN的工作,在学术和业界都具有极高的研究价值。
Motivation
随着深度学习理论和技术的发展,图像、语音等欧氏数据已经可以被很好的处理。而现实中存在很多非欧数据,它们的结构不规则,难以用卷积神经网络对齐进行结构信息的聚合。但问题总会解决,GCN被提出以解决非欧数据的结构信息利用问题。GCN因其优雅的理论推导及强大的性能表现,深受学界及业界追捧。然而,距离产生美,当你接近GCN的时候就会发现:**,尼玛凤姐。没错,GCN并不完美,高复杂度的缺点直接限制了在大规模数据集中的应用。有缺点就要改进,在GCN计算效率上做文章的,近年来也取得了不少成果,GraphSage就是最具代表的一个。当面对具有billion级节点、10*billion级边的大规模graph时,Pinterest做到了业界梦寐以求的高效推荐算法PinSage并投入使用。
Model
PinSage建模的思路还是很简单的,针对某一个节点,我划分为三步:
Step 1: 选取直到
k
k
k-hop邻域的节点集合
S
k
S^k
Sk,
k
=
0
,
1
,
2
,
.
.
.
,
K
k=0,1,2,...,K
k=0,1,2,...,K;(1-7)
Step 2: 根据节点集合
S
k
S^k
Sk进行局部的信息聚合;(8-14)
Step 3: 对聚合后的节点表示进行非线性变换,得到最终的节点表示。(15-17)具体流程如下:
在Algorithm 2中, Line 12中的CONVOLVE操作实现局部信息聚合,具体如下所示:
Optimization
那么,用什么监督上述网络的训练呢?PinSage采用如下标签定义:
正样本: 用户在点击
q
q
q之后马上点击
i
i
i,则(q,i)是正样本对;
负样本: 余下的没有点击的样本都定义为负样本。
基于上述标签定义,PinSage在如下max-margin-based loss function下进行训练:
其中,
p
n
(
q
)
p_n(q)
pn(q)指的是负样本分布。这里有一个负样本采样的问题,最naive的方法是在负样本集合里随机采样,但是在数十亿的样本中,有极大概率采样到毫不相关的负样本,这会使得模型的训练过于简单,学到的embedding在遇到稍有相关性的样本时也没有强的判别力。为此,PinSage设计了这样的采样策略:先计算对于
q
q
q的个性化PageRank值,然后在rank 2000 - 5000范围内的样本进行采样,称采样到的样本为hard负样本。
整个PinSage是在上述操作下进行训练的,并采用multi-GPU的模式。在学习率上采用warmup的方案,即先线性增大lr,再指数减小。另外,还采用了分布式训练和MapReduce等技术,本渣硕对这些一无所知。。。直接饮用知乎大神的吧!
分布式训练,采用了re-indexing技术,创建包含了当前minnibatch计算涉及的的所有节点的embedding和邻接矩阵的子图 G^{’} (V{’},E{’}) ,并在训练开始之前输入到GPU中,以减少GPU与CPU之间的通信。训练过程中,除模型计算在GPU内完成,其余操作,如采样,特征提取,re-indexing等操作均在CPU上完成。训练的过程中各GPU之间权重共享,反向传播完成之后,所有GPU上的梯度汇聚到一起,再执行同步SGD进行梯度更新。[1]
推理过程中,论文采用了“MapReduce”方案减少重复计算,这里对MapReduce加引号是因为根据论文介绍,“MapReduce”中进行的两部分主要工作分别为:
将所有pins的embedding映射到低纬空间,对应图2Line中 ReLU(Qh_v+q) 的过程,这样在信息汇聚时只要去内存中取相应的值就好了,减少了重复计算;
将pin的embedding结果与对应的boards id结合到一起,board embedding的计算时通过对其邻居节点的特征进行池化得到;
而这两部分工作与通常意义下的MapReduce并不相同。[1]
Discussion
PinSage确实是很牛皮的工作,应该是没有什么可吐槽的吧!(如果能开源就更好啦!)关于GCN,我想说几句:像ICLR 2016的那篇GCN确实吊炸天,但是不能因为经典就束缚住我们的思维,越是接近GCN越要清除它的局限性,也许还有更好的图卷积(结构+属性)范式等待我们去探索,各位共勉!