图神经网络——GraphSAGE

图神经网络——GraphSAGE_第1张图片

  • 论文地址:http://papers.nips.cc/paper/6703-inductive-representation-learning-on-large-graphs.pdf
  • 发表会议:NeurIPS2017

文章目录

      • 预备知识
          • transductive和inductive learning
      • 1. GraphSAGE和GCN
      • 2. GCN为什么不能进行Inductive Learning?
      • 3. GraphSAGE到底是如何做的?
          • 3.1 多种聚合函数
          • 3.2 minibatch
          • 3.3 目标函数
      • 4.实验结果
          • 4.1 数据集
          • 4.2 实验结果
      • 5.思考
      • 6.参考

预备知识

  • transductive和inductive learning
    简单来说,在训练过程中用到了测试集中的样本,就是transductive learning;反之就是inductive learning。可知现有的大部分机器学习算法都是transductive learning。

1. GraphSAGE和GCN

GCN和GraphSAGE几乎同时出现,GraphSAGE是GCN在空间域上的实现,似乎两者并没有太大区别。实际上,GraphSAGE解决了GCN固有的一个缺陷——只能进行Transductive Learning,即只能学习图中已有节点的表示,换句话说,GCN是整张图的节点一起训练的,对于没有在训练过程中出现过的节点,GCN无法表示。所以GraphSAGE进行了两个方面的改进:
(1)使图的节点表示学习从Transductive Learning转变为Inductive Learning,使得模型能学习新的节点表示;
(2)设计了图节点的批学习算法(minibatch),使得在大图上节点的表示学习成为可能。
这么一看,GraphSAGE也算是图表示学习的里程碑之作。

2. GCN为什么不能进行Inductive Learning?

按普遍的说法,说GCN是transductive learning,实际上是因为在训练阶段它的信息传播是在包括训练节点和测试节点构成的整张图上的,在邻居聚合时,没有进行采样,所以每次聚合都需要整张图的邻接矩阵。而GraphSAGE在训练阶段的信息传播只在由训练节点构成的图中进行,并且对邻居进行了采样,而且不再是学习每个节点的表示,而是学习一系列聚合函数,这样每次聚合只需知道邻居节点的信息,而不需要把整张图的邻接矩阵都加载到内存;在测试阶段,对于新加入的节点,只需知道该节点的邻接信息,就可以通过聚合函数聚合邻居信息学习到节点的表示,所以说GraphSAGE是inductive learning。
上述是包括原论文在内的公认说法,貌似挺有道理。但我感觉在inductive能力这一点上GraphSAGE和GCN没太大的区别。为什么GCN不能inductive learning,当知道新加入节点的邻居信息后,GCN也可以通过邻居的聚合来学习新节点的表示!(这里我只是从空域的角度来看)
GraphSAGE无非就是提供了聚合函数的更多选择和对邻居的采样机制。所以本质上,有无inductive能力的关键因素不在这里,GCN也可以是有inductive能力的。那么什么才是图具有inductive能力的因素呢?我想了很久,在知乎上找到了我满意的答案:
为什么GAT能够实现Inductive learning,而GCN不行?
下面是高赞的回答,我加了一些具体解释:

要确保inductive,本质上在于两点:1)首先是你要确保你这个算法的node-level input不能是one-hot而必须是实在的node attribute(比如词向量等节点特征),一旦one-hot了就必是只能transductive,原因是如果输入是one-hot,那么对于unseen节点也是one-hot输入,那么输入到学好的聚合函数中是捕捉不到节点自身的任何信息的,只有输入是已经包含了节点的特征信息(如预训练好的词向量),对于unseen节点,才可以根据它的邻居和自身信息进行inductive learning。2)其次是training方式,不能是依赖于整图的矩阵运算,而必须是graphsage里面appendix a的minibatch training模式下的分割方案,而这才是graphsage有底气说自己inductive牛逼的主要原因。从原理上讲,GCN也可以认为是inductive的,因为每个节点迭代特征时只会用到邻居借点的特征,但是实际操作时GCN采用全图邻接矩阵来训练权重矩阵 W W W,所以新加入一个节点时,必须更新邻接矩阵,对全图重新训练得到新的W,所以从这点来说,GCN不是inductive的。
确保这两点,几乎现在市面上所有message passing架构的gnn都是inductive的。

3. GraphSAGE到底是如何做的?

3.1 多种聚合函数

GraphSAGE共提出了三种聚合函数:

  1. 平均(Mean aggregator)
    即把中心节点和邻居节点的每一维度进行平均:
    在这里插入图片描述
    也可以先把邻居节点的每一维度进行平均,然后再与中心节点的特征进行拼接,作者说这是一种简单形式的“skip-connection”,并且会给结果带来很大提升。
  2. LSTM(LSTM aggregator)
    由于LSTM对于序列的输入顺序是敏感的(不对称的),所以不同的节点输入顺序对结果的影响也不同。但这里作者只是简单地将邻居节点序列打乱,然后输入到LSTM。
  3. 池化(Pooling aggregator)
    作者提出的pooling操作同时满足对称性和可训练性,如下式所示:
    在这里插入图片描述
    首先对节点的表示进行一个线性变换,然后对每一维度进行max-pooling操作,以捕捉邻居节点的不同维度的最重要的信息。也可以使用其他pooling操作,但是作者没有发现太多提升。
3.2 minibatch

首先作者给出了不引入minibatch的训练算法:
图神经网络——GraphSAGE_第2张图片
算法很简单,就是普通GCN节点聚合传播的算法。第5行作者采用了前面提到的平均聚合方式,并采用了拼接处理。第7行对节点的表示进行了归一化(单位向量)。另外可以看出,为了进行inductive learning,作者不再是学习每个节点的表示,而是学习一系列的聚合函数( A g g r e g a t e k Aggregate_k Aggregatek),并且节点的输入不再是one-hot,而是节点的特征表示向量 x v x_v xv。这样对于未知节点,可以把它的节点特征和它的邻居节点通过学习好的聚合函数进行聚合,就可以得到未知节点的表示。
不引入minibatch每次更新参数都要在整张图上进行计算,耗时耗空间。所以作者在上述算法基础上又引入了minibatch版本:
图神经网络——GraphSAGE_第3张图片
这里是在一个batch中进行参数更新的操作, B B B是需要更新的一批节点集合。在每次batch更新之前,首先需要找出此次batch更新需要用到的节点集合。1-7行描述了这一过程,因为要聚合 K K K次,所以需迭代得到 K + 1 K+1 K+1个集合{ B 0 , B 1 , B 2 , . . . , B K B^0,B^1,B^2,...,B^K B0,B1,B2,...,BK},其中 B K B^K BK就是我们要更新的这一批节点集合, B k − 1 B^{k-1} Bk1 B k B^k Bk和对 B k B^k Bk中节点的邻居节点采样得到的并集(3-5行)。也就是说,利用 B k − 1 B^{k-1} Bk1中的节点对 B k B^k Bk中的节点进行聚合,因为 B k − 1 B^{k-1} Bk1中的节点已经包含 B k B^k Bk中的节点聚合所需的全部邻居节点。8-14行描述了这一过程,从 B 0 B^0 B0开始,聚合K次,得到最终这一批节点 B K B^K BK的表示。(注意上述过程大写K和小写k的区别,大写K是总共的聚合次数,小写k是当前迭代次数的下标)。

上述1-7行求节点的邻居节点并不是利用全部的邻居节点,而是对邻居节点进行了采样,采样的节点数固定,如果节点的邻居数大于采样数,则采用均匀不放回采样;否则采用均匀放回采样。

如果不采用minibatch,则一次训练的时间复杂度为 O ( V ) O(V) O(V),因为不需要采样,且是在整张图中所有节点上进行训练;而采用minibatch,假如需聚合 K K K次,每次聚合对邻居的采样数为 S i ( i = 1 , 2 , . . . k ) S_i(i=1,2,...k) Si(i=1,2,...k),则总的时间复杂度为 O ( ∏ i = 0 K S i ) O(\prod \limits_{i=0}^K S_i) O(i=0KSi),作者说K=2时已经可以达到较好的效果,且 S 1 ⋅ S 2 < = 500 S_1·S_2<=500 S1S2<=500,所以minibatch版本比原始版本从一定程度上节省了训练时间和空间。

3.3 目标函数

作者说graphSAGE可以在有监督和无监督两种设置下进行训练。

  1. 无监督
    无监督训练方式即节点是没有标签的,所以作者采用了类似LINE的目标函数:
    在这里插入图片描述
    其中 v v v是一个固定长度的random walk采样得到的 u u u节点的邻居节点, v n v_n vn是负样本。和LINE不同的是这里的初始节点表示是代表一定语义的节点属性向量,学习的参数也不是lookup的一行,而是一系列聚合函数(参数),这样就可以从节点属性向量直接得到节点embedding,也就是说graphSAGE中的节点属性向量在训练过程中是不变的,节点最终的embedding直接由节点属性向量输入到聚合参数得到。而以往的工作都是节点向量跟随模型一起训练,最终收敛时的节点向量即为节点的embedding。

  2. 有监督
    有监督的训练方式即根据特定任务对节点加上标签,然后再进行有监督训练。

4.实验结果

4.1 数据集
  1. Citation 论文引用网络(节点分类)
  2. Reddit web论坛 (节点分类)
  3. PPI 蛋白质网络 (graph分类)
4.2 实验结果

图神经网络——GraphSAGE_第4张图片

  1. GraphSAGE相比baseline 效果大幅度提升
  2. GraphSAGE有监督版本比无监督效果好
  3. LSTM和pool的效果较好

5.思考

graphSAGE是目前工业界常用的模型,minibatch设计和inductive能力就是为工业界应用而产生的。而且模型简单,实现容易,考虑了节点语义特征和图的结构特征。

6.参考

  1. 算法逻辑|GraphSAGE
  2. GraphSAGE: GCN落地必读论文

你可能感兴趣的:(图神经网络,数据挖掘,图神经网络,图表示学习)