上一篇文章,我们讲了图神经网络:图卷积神经网络(GCN)理解与tensorflow2.0代码实现,也提到GCN的缺点:GCN属于直推式学习(Transductive Learning),它在固定的图上学习每个节点的embedding表示,不能泛化到未加入到图中的节点,一旦图的结构发生改变,就需要重新训练整个网络。
本文提到的 GraphSAGE 属于归纳学习(Inductive Learning),核心是学习聚合邻居节点信息的函数(聚合函数),然后利用聚合函数来得到一个节点的表示。即使图中加入了新的节点,建立了新的边,那么也可以借助邻居节点信息与聚合函数得到新节点的向量表示。
前向传播
下图展示了 GraphSAGE 学习目标节点(中心的红色节点) embedding 的过程:
- 先对邻居节点采样:上图仅对2跳内的邻居采样,2跳邻居节点采样5个节点,1跳邻居采样个节点。
- 生成目标节点embedding:先聚合2跳邻居节点特征,生成1跳邻居节点embedding,再聚合1跳邻居节点 embedding,生成目标节点 embedding。
- 将 embedding 结果作为全连接层输入,预测目标节点标签。
上图展示了GraphSage的两个核心思想:采样(Sample)和聚合(Aggregate)。
整个过程的伪代码(Algorithm 1)如下:
核心部分是第4、5行:
- 第4行:聚合节点 v 的邻居节点(采样后的)在第 k − 1 k-1 k−1 层的 embedding,得到第 k k k 层的邻居聚合特征 h N ( v ) k h_{N(v)}^k hN(v)k。
- 第5行:将 h N ( v ) k h_{N(v)}^k hN(v)k 与第 k − 1 k-1 k−1 层节点 v v v 的 embedding 向量拼接,输入到全连接层后得到节点 v v v 在第 k k k 层的 embedding 向量: h v k h_v^k hvk。
伪代码中的 K 表示聚合深度,可以理解为要聚合 K 跳邻居节点的信息。
聚合函数
在伪代码的第 4 行,使用了聚合函数,由于在图中顶点的邻居是天然无序的,所以我们希望构造出的聚合函数是对称的(即改变输入的顺序,函数的输出结果不变),同时具有较高的表达能力。
作者给出了多种聚合函数:
1,平均聚合
也就是Algorithm 1中的聚合方法,对第 k-1 层的邻居embedding中每个维度取平均,然后与目标节点第 k-1 层的embedding拼接后进行非线性转换:
h N ( v ) k = mean ( { h u k − 1 , u ∈ N ( v ) } ) h v k = σ ( W k ⋅ CONCAT ( h v k − 1 , h N ( u ) k ) ) \begin{array}{c} h_{N(v)}^{k}=\operatorname{mean}\left(\left\{h_{u}^{k-1}, u \in N(v)\right\}\right) \\ h_{v}^{k}=\sigma\left(W^{k} \cdot \operatorname{CONCAT}\left(h_{v}^{k-1}, h_{N(u)}^{k}\right)\right) \end{array} hN(v)k=mean({
huk−1,u∈N(v)})hvk=σ(Wk⋅CONCAT(hvk−1,hN(u)k))
2,类GCN聚合
直接对目标节点和所有邻居emebdding中每个维度取平均,然后再非线性转换:
h v k = σ ( W k ⋅ mean ( { h v k − 1 } ∪ { h u k − 1 , ∀ u ∈ N ( v ) } ) ) h_{v}^{k}=\sigma\left(W^{k} \cdot \operatorname{mean}\left(\left\{h_{v}^{k-1}\right\} \cup\left\{h_{u}^{k-1}, \forall u \in N(v)\right\}\right)\right) hvk=