互联网中到处都是图结构的数据,比如我们熟悉的社交网络,最近流行的知识图谱等等,这些数据中包含着大量的关系信息,这对推荐系统来说是非常有帮助的。
为了能更好地利用这些信息进行推荐,各大巨头可谓尝试了各种办法,比如 DeepWalk、Node2Vec 这些非常实用的 Graph Embedding 方法。但是技术的发展永无止境,最近两年,GNN(Graph Nerual Netwrok,图神经网络)毫无疑问是最火热、最流行的基于图结构数据的建模方法。严格一点来说,图神经网络指的就是可以直接处理图结构数据的神经网络模型。
在诸多 GNN 的解决方案中,著名的社交电商巨头 Pinterest 对于 GraphSAGE 的实现和落地又是最为成功的,在业界的影响力也最大。所以,我们就学一学 GraphSAGE 的技术细节,看一看 Pinterest 是如何利用图神经网络进行商品推荐的。
简单回顾一下 DeepWalk 和 Node2vec 算法的基本流程,如下面的图 1 所示。它们在面对像图 1b 这样的图数据的时候,其实没有直接处理图结构的数据,而是走了一个取巧的方式,先把图结构数据通过随机游走采样,转换成了序列数据,然后再 用诸如 Word2vec 这类序列数据 Embedding 的方法生成最终的 Graph Embedding。
我把这类 Graph Embedding 的方法归类为基于随机游走的间接性 Graph Embedding 方法。它其实代表了我们在解决一类技术问题时的思路,就是**面对一个复杂问题时,我们不直接解决它,而是“搭一座桥”,通过这座桥把这个复杂问题转换成一个简单问题,因为对于简单问题,我们有非常丰富的处理手段。这样一来,这个复杂问题也就能简单地解决了。**显然,基于随机游走的 Graph Embedding 方法就是这样一种“搭桥”的解决方案。显然,基于随机游走的 Graph Embedding 方法就是这样一种“搭桥”的解决方案。但搭桥的过程中难免会损失一些有用的信息,比如用随机游走对图数据进行抽样的时候,虽然我们得到的序列数据中还包含了图结构的信息,但却破坏了这些信息原始的结构。正因为这样,很多研究者、工程师不满足于这样搭桥的方式,而是希望造一台“推土机”,把这个问题平推过去,直接解决它。GNN 就是这样一种平推解决图结构数据问题的方法,它直接输入图结构的数据,产生节点的 Embedding 或者推荐结果。当然,不同研究者打造这台推土机的方式各不相同,我们今天要重点介绍的 GraphSAGE,就是其中最著名的一台,也最具参考价值。
GraphSAGE 的全称叫做 Graph Sample and Aggregate,翻译过来叫“图采样和聚集方法”。其实这个名称就很好地解释了它运行的过程,就是先“采样”、再“聚集”。这时候问题又来了,这里的“采样”还是随机游走的采样吗?要是还通过采样才能得到样本,我们造的还能是“推土机”吗,不就又变成搭桥的方式了吗?等讲完 GraphSAGE 的细节,你就明白了。
GraphSAGE 的过程如上图所示,主要可以分为 3 步:
1.在整体的图数据上,从某一个中心节点开始采样,得到一个 k 阶的子图,示意图中给出的示例是一个二阶子图;
2.有了这个二阶子图,我们可以先利用 GNN 把二阶的邻接点聚合成一阶的邻接点(图 1-2 中绿色的部分),再把一阶的邻接点聚合成这个中心节点(图 1-2 中蓝色的部分);
3.有了聚合好的这个中心节点的 Embedding,我们就可以去完成一个预测任务,比如这个中心节点的标签是被点击的电影,那我们就可以让这个 GNN 完成一个点击率预估任务。
接下来,再结合下图 3 推荐电影的例子,来看一看 GraphSAGE 是怎么工作的。
图3 GraphSAGE示例
首先,我们要利用 MovieLens 的数据得到电影间的关系图,这个关系图可以是用用户行为生成,它也可以是像生成知识图谱一样来生成,比如,两部电影拥有同一个演员就可以建立一条边,拥有相同的风格也可以建立一条边,规则我们可以自己定。
在这个由电影作为节点的关系图上,我们随机选择一个中心节点。比如,我们选择了玩具总动员(Toy Story)作为中心节点,这时再向外进行二阶的邻接点采样,就能生成一个树形的样本。
经过多次采样之后,我们会拥有一批这样的子图样本。这时,我们就可以把这些样本输入 GNN 中进行训练了。GNN 的结构在下一小节详细来讲,这里我们只要清楚,这个 GNN 既可以预测中心节点的标签,比如点击或未点击,也可以单纯训练中心节点的 Embedding 就够了。
总的来说,GraphSAGE 的主要步骤就是三个:抽样 - 聚合 - 预测
这里,我们以二阶的 GraphSAGE 为例,因为超过二阶的结构只是进一步延伸这个模型,没有更多特别的地方,所以我们理解二阶的模型结构就足够了。
上图中处理的样本是一个以点 A 为中心节点的二阶子图,从左到右我们可以看到,点 A 的一阶邻接点包括点 B、点 C 和点 D,从点 B、C、D 再扩散一阶,可以看到点 B 的邻接点是点 A 和点 C,点 C 的邻接点是 A、B、E、F,而点 D 的邻接点是点 A。
清楚了样本的结构,我们再从右到左来看一看 GraphSAGE 的训练过程。这个 GNN 的输入是二阶邻接点的 Embedding,二阶邻接点的 Embedding 通过一个叫 CONVOLVE 的操作生成了一阶邻接点的 Embedding,然后一阶邻接点的 Embedding 再通过这个 CONVOLVE 的操作生成了目标中心节点的 Embedding,至此完成了整个训练。
这个过程实现的关键就在于这个叫 CONVOLVE 的操作,那它到底是什么呢?CONVOLVE就是卷积。但这里的卷积并不是严格意义上的数学卷积运算,而是一个由 Aggregate 操作和 Concat 操作组成的复杂操作。这里,我们要重点关注图中间的部分,它放大了 CONVOLVE 操作的细节。
这个 CONVOLVE 操作是由两个步骤组成的:
第一步叫 Aggregate 操作,就是图 4中γ符号代表的操作,它把点 A 的三个邻接点 Embedding 进行了聚合,生成了一个 Embedding hN(A);
第二步,我们再把 hN(A) 与点 A 上一轮训练中的 Embedding hA 连接起来,然后通过一个全联接层生成点 A 新的 Embedding。
第二步实现起来很简单,但第一步中的 Aggregate 操作到底是什么呢?搞清楚这个,我们就搞清楚了 GraphSAGE 的所有细节。
事实上,Aggregate 操作我们也不陌生,它其实就是把多个 Embedding 聚合成一个 Embedding 的操作,我们在推荐模型篇中也讲过很多次了。比如,我们使用的 Average Pooling,在 DIN 中使用过的 Attention 机制,在序列模型中的基于 GRU 的方法,以及可以把这些 Embedding 聚合起来的 MLP 等等。Aggregate 操作非常多,具体用哪个要通过实践决定最终结构。
在讲 GraphSAGE 的主要步骤的时候,我们还留下了一个“小尾巴”没有讲,就是说 GraphSAGE 既可以预测中心节点的标签,比如点击或未点击,又可以单纯地生成中心节点的 Embedding。要知道预测样本标签这个事情是一个典型的有监督学习任务,而生成节点的 Embedding 又是一个无监督学习任务。
GraphSAGE 是怎么做到既可以进行有监督学习,又能进行无监督学习的?要想让 GraphSAGE 做到这一点,关键就看怎么设计它的输出层。我们先来说说有监督的情况,为了预测中心节点附带的标签,比如这个标签是点击或未点击,我们就需要让 GraphSAGE 的输出层是一个 Logistic Regression 这样的二分类模型,这个输出层的输入,就是我们之前通过 GNN 学到的中心节点 Embedding,输出当然就是预测标签的概率了。这样,GraphSAGE 就可以完成有监督学习的任务了。而对于无监督学习,我们的输出层就完全可以仿照Word2vec 输出层的设计,用一个 softmax 当作输出层,预测的是每个点的 ID。这样一来,每个点 ID 对应的 softmax 输出层向量就是这个点的 Embedding,这就和 word2vec 的原理完全一致了。
由于 GraphSAGE 是 Pinterest 和斯坦福大学联合提出的,所以 Pinterest 对于 GNN 的应用也是直接在 GraphSAGE 的基础上进行的,只是给这个 GNN 取了个换汤不换药的新名字,PinSAGE。Pinterest 这个网站的主要功能是为用户提供各种商品的浏览、推荐、收藏的服务,那么所谓的 Pin 这个动作,其实就是你收藏了一个商品到自己的收藏夹。因此,所有的 Pin 操作就连接起了用户、商品和收藏夹,共同构成了一个它们之间的关系图。PinSAGE 就是在这个图上训练并得到每个商品的 Embedding 的。而 PinSAGE Embedding 的具体应用场景,就是商品的相似推荐。只不过之前业界更多地使用 Item2vec、DeepWalk 这些方法,来生成用于相似推荐的物品 Embedding,在 GNN 流行起来之后,大家就开始尝试使用 GNN 生成的物品 Embedding 进行相似推荐。那么,PinSAGE 在 Pinterest 场景下的效果到底怎么样呢?Pinterest 给出了一些例子如下图所示
图中左边给出的是一个种子发芽的图片,我们就推测它应该是一个卖绿植或者绿植种子的商家。接下来,我们再来判断左边通过四种不同算法找到的相似图片是不是合理。其中,PinSAGE 是 Pinterest 实际用于推荐系统中的算法,其他三个 Visual、Annot、Pixie 都是效果测试中的对比算法。
我们看到通过第一个算法 Visual 找到的图片,虽然看上去和原来的图片比较相似,但前两个图片居然都是食品照片,这显然不相关。第二个算法 Annot 中的树木,以及第三个算法 Pixie 中的辣椒和西兰花,显然都跟绿植种子有很遥远的差距。相比之下,PinSAGE 找到的图片就很合理了,它找到的全都是种子发芽或者培育绿植的图片,这就非常合乎用户的逻辑了。
要知道,在 PinSAGE 应用的构成中,它没有直接分析图片内容,而只是把图片当作一个节点,利用节点和周围节点的关系生成的图片 Embedding。因此,这个例子可以说明,PinSAGE 某种程度上理解了图片的语义信息,而这些语义信息正是埋藏在 Pinterest 的商品关系图中。可见,PinSAGE 起到了多么神奇的数据挖掘的作用。