论文地址,含oral视频
Pinterest官方的博客
pinsage又是Jure Leskovec组的一篇有影响力的工作,该工作被认为是第一个用于工业界GNN推荐系统。该论文学术上的创新较少,模型基本都来源于GraphSage 和Pixie这两篇。目前pinSage只有DGL官方的一个实现版本。
核心的模型是基于随机游走采样的graphSage。其目的主要是去生成embedding,而不是去解决具体的推荐任务。
pinterest是一个图片网站,这里将 业务简单进行抽象,pin是图像,board是收藏夹,是pin的集合,由pin和board构成了一个二分图。目的是在这样的二分图中进行node embedding的学习(主要针对于pin)。
pin上是有特征的,包括用VGG对图像卷集后的embedding,word2ec处理后的文本描述信息的embedding,以及其他一些特征拼接而成的。
如果只用图像的或文本的embedding,则最终的embedding没有交互信息,GNN能较好的将特征和结构信息进行融合。
目标是为item生成一个embedding,能将好的度量item之间的关系。推荐时,给定一个查询q,通过embedding来找到最相似的pin。
与之前基于随机游走召回的pixie相比,pinsage不是时是更新。而是进行预计算,将结果进行存储。通过LSH 和weak AND等来实现快速查找。文中指出,embedding主要用于查询邻近节点生成召回或作为排序的输如。
pinsage中使用的图卷集如下所示。Q、q、W、w为参数,Q、W为MLP中的参数,q和w是偏置。
line1是进行邻居聚合。pinsage中卷积与graphsage的区别时在邻居聚合时加入了权重。 α \alpha α是聚合时的权重,可以认为是加入了注意力,但这个注意力不是学到的,而是随机游走得到的,见下重要性采样。
line2是将邻居聚合后的特征和自己的特征进行连接,再过mlp和激活。cat保留的全部的信息,所以看起来可能会好一些。
line3是对结果进行归一化,特征都转为[0,1]之间。能使得train更加稳定,以及方便后续进行搜索。
卷积中是对邻居聚合,但这里的邻居是通过采样得到的。以目标节点为起点,计算每个节点的访问次数,选择topK作为目标节点的邻居。详见Pixie-17WWW。
为了计算目标节点的embedding,需要找到其邻居,这里需要“倒采样”,和graphsage中的min batch一样。
train data是一些pair,目标item和一个正样本(和item较为相似的),一个负样本。使用margin -base loss,即使得和正样本更接近,和负样本较远。正样本来源于例是记录,负样本是随机生成的。
对于每个目标节点(pin),进行一次正采样和负采样,获得一个正样本和一个负样本,在对这三个节点minibatch 采样,通过pixie随机游走,获得三个节点对应的邻居。(正负样本采样后,组成的图可能不连通,或者说一定不连通)
在训练时,整个图时加载到内存上,每个mini batch中,节点和边构成的子图被送到gpu进行train。
curriculum train(课程学习)。课程学习主要是指逐步加入hard负样本的学习过程。
对于一个batch中,进行统一的负采样。并且在训练中逐步加入hard 的负样本。这里hard的负样本是指和目标item相似,但和正样本不相似的。
负样本是随机采样的,这主要是根据召回阶段的特性所决定的。为了加速train,一个batch中一起采样负样本。
hard 负样本是通过随机游走时采样的。随机游走后根据访问次数对节点进行排序,前TopN是 正样本,而中间的即为hard 负样本。
训练好model后,需要生成全部的item,如何再生存embedding时,避免重复计算,这里借助mapreduce的思想。
在一层卷集中,一个节点可能作为多个目标节点的邻居出现,导致在每个目标节点的邻居聚合中,该节点都会被重复计算一次mlp。这里借助map reduce的思想,将邻居聚合进行分解为三步。map将节点过mlp,join将节点mlp后的向量送到对应的聚合节点,reduce进行聚合。
pinsage多次用到了随机游走。按pipline进行梳理