GraphSAGE图神经网络算法详解

GraphSAGE 是 17 年的文章了,可是一直在工业界受到重视,最主要的就是它论文名字中的两个关键词:inductive 和 large graph。今天咱们就梳理一下这篇文章的核心思路,和一些容易被忽视的细节。node

为何要用 GraphSAGE算法

你们先想一想图为何这么火,主要有这么几点缘由,图的数据来源丰富,图包含的信息多。因此如今都在考虑如何更好的使用图的信息。网络

那么咱们用图须要作到什么呢?最核心的就是利用图的结构信息,为每一个 node 学到一个合适的 embedding vector。只要有了合适的 embedding 的结果,接下来不管作什么工做,咱们就能够直接拿去套模型了。机器学习

在 GraphSAGE 以前,主要的方法有 DeepWalk,GCN 这些,可是不足在于须要对全图进行学习。并且是以 transductive learning 为主,也就是说须要在训练的时候,图就已经包含了要预测的节点。ide

考虑到实际应用中,图的结构会频繁变化,在最终的预测阶段,可能会往图中新添加一些节点。那么该怎么办呢?GraphSAGE 就是为此而提出的,它的核心思路其实就是它的名字 GraphSAGE = Graph Sample Aggregate。也就是说对图进行 sample 和 aggregate。函数

GraphSAGE 的思路学习

咱们提到了 sample 和 aggregate,具体指的是什么呢?这个步骤如何进行?为何它能够应用到大规模的图上?接下来就为你们用通俗易懂的语言描述清楚。测试

顾名思义,sample 就是选一些点出来,aggregate 就是再把它们的信息聚合起来。那么整个流程怎么走?看下面这张图:人工智能

咱们在第一幅图上先学习 sample 的过程。假如我有一张这样的图,须要对最中心的节点进行 mebedding 的更新,先从它的邻居中选择 S1 个(这里的例子中是选择 3 个)节点,假如 K=2,那么咱们对第 2 层再进行采样,也就是对刚才选择的 S1 个邻居再选择它们的邻居。spa

在第二幅图上,咱们就能够看到对于聚合的操做,也就是说先拿邻居的邻居来更新邻居的信息,再用更新后的邻居的信息来更新目标节点(也就是中间的红色点)的信息。听起来可能稍微有点啰嗦,可是思路上并不绕,你们仔细梳理一下就明白了。

第三幅图中,若是咱们要预测一个未知节点的信息,只须要用它的邻居们来进行预测就能够了。

咱们再梳理一下这个思路:若是我想知道小明是一个什么性格的人,我去找几个他关系好的小伙伴观察一下,而后我为了进一步确认,我再去选择他的小伙伴们的其余小伙伴,再观察一下。也就是说,经过小明的小伙伴们的小伙伴,来判断小明的小伙伴们是哪一类人,而后再根据他的小伙伴们,我就能够粗略的得知,小明是哪一类性格的人了。

GraphSAGE 思路补充

如今咱们知道了 GraphSAGE 的基本思路,可能小伙伴们还有一些困惑:单个节点的思路是这样子,那么总体的训练过程该怎么进行呢?至今也没有告诉咱们 GraphSAGE 为何能够应用在大规模的图上,为何是 inductive 的呢?

接下来咱们就补充一下 GraphSAGE 的训练过程,以及在这个过程它有哪些优点。

首先是考虑到咱们要从初始特征开始,一层一层的作 embedding 的更新,咱们该如何知道本身须要对哪些点进行聚合呢?应用前面提到的 sample 的思路,具体的方法来看一看算法:

首先看算法的第 2-7 行,其实就是一个 sample 的过程,而且将 sample 的结果保存到 B 中。接下来的 9-15 行,就是一个 aggregate 的过程,按照前面 sample 的结果,将对应的邻居信息 aggregate 到目标节点上来。

细心的小伙伴确定发现了 sample 的过程是从 K 到 1 的(看第 2 行),而 aggregate 的过程是从 1 到 K 的(第 9 行)。这个道理很明显,采样的时候,咱们先从整张图选择本身要给哪些节点 embedding,而后对这些节点的邻居进行采样,而且逐渐采样到远一点的邻居上。

可是在聚合时,确定先从最远处的邻居上开始进行聚合,最后第 K 层的时候,才能聚合到目标节点上来。这就是 GraphSAGE 的完整思路。

那么须要思考一下的是,这么简单的思路其中有哪些奥妙呢?

GraphSAGE 的精妙之处

首先是为何要提出 GraphSAGE 呢?其实最主要的是 inductive learning 这一点。这两天在几个讨论群同时看到有同窗对 transductive learning 和 inductive learning 有一些讨论,整体来讲,inductive learning 无疑是能够在测试时,对新加入的内容进行推理的。

所以,GraphSAGE 的一大优势就是,训练好了之后,能够对新加入图网络中的节点也进行推理,这在实际场景的应用中是很是重要的。

另外一方面,在图网络的运用中,每每是数据集都很是大,所以 mini batch 的能力就很是重要了。可是正由于 GraphSAGE 的思路,咱们只须要对本身采样的数据进行聚合,无需考虑其它节点。每一个 batch 能够是一批 sample 结果的组合。

再考虑一下聚合函数的部分,这里训练的结果中,聚合函数占很大的重要性。关于聚合函数的选择有两个条件:

  首先要可导,由于要反向传递来训练目标的聚合函数参数;

  其次是对称,这里的对称指的是对输入不敏感,由于咱们在聚合的时候,图中的节点关系并无顺序上的特征。

因此在做者原文中选择的都是诸如 Mean,max pooling 之类的聚合器,虽然做者也使用了 LSTM,可是在输入前会将节点进行 shuffle 操做,也就是说 LSTM 从序列顺序中并不能学到什么知识。

此外在论文中还有一个小细节,我初次看的时候没有细读论文,被一位朋友指出后才发现果真如此,先贴一下原文:

这里的 lines 4 and 5 in Algorithm 1,也就是咱们前面给出的算法中的第 11 和 12 行。

也就是说,做者在文中提到的 GraphSAGE-GCN 其实就是用上面这个聚合函数,替代掉其它方法中先聚合,再 concat 的操做,而且做者指出这种方法是局部谱卷积的线性近似,所以将其称为 GCN 聚合器。

来点善后工做

最后咱们就简单的补充一些喜闻乐见,且比较简单的东西吧。用 GraphSAGE 通常用来作什么?

首先做者提出,它既能够用来作无监督学习,也能够用来作有监督学习,有监督学习咱们就能够直接使用最终预测的损失函数为目标,反向传播来训练。那么无监督学习呢?

其实不管是哪一种用途,须要注意的是图自己,咱们仍是主要用它来完成 embedding 的操做。也就是获得一个节点的 embedding 后比较有效的 feature vector。那么作无监督时,如何知道它的 embedding 结果是对是错呢?

做者选择了一个很容易理解的思路,就是邻居的关系。默认当两个节点距离相近时,就会让它们的 embedding 结果比较类似,若是距离远,那 embedding 的结果天然应该区别较大。这样一来下面的损失函数就很容易理解了:

z_v 表示是目标节点 u 的邻居,而 v_n 则表示不是,P_n(v) 是负样本的分布,Q 是负样本的数量。

那么如今剩下惟一的问题就是邻居怎么定义?

做者选择了一个很简单的思路:直接使用 DeepWalk 进行随机游走,步长为 5,测试 50 次,走获得的都是邻居。

总结

实验结果咱们就不展现了,其实能够看到做者在不少地方都用了一些比较 baseline 的思路,你们能够在对应的地方进行更换和调整,以适应本身的业务需求。

后面咱们也会继续分享 GNN 和 embedding 方面比较经典和启发性的一些 paper,欢迎你们持续关注~~~

【编辑推荐】

  1. 人工智能初创公司创办过程当中的三个关键教训

  2. 74KB图片也高清,谷歌用神经网络打造图像压缩新算法

  3. 人工智能和机器学习买家指南

  4. 用Python实现多层感知器神经网络

  5. 基于人工神经网络分类器的领域自适应(DA)技术

【责任编辑:庞桂玉 TEL:(010)68476606】

相关文章
相关标签/搜索