CS224W课程(图神经网络)笔记:06/07/08-GNN

237 阅读17分钟

GNN

在本节我们可以了解到:

  • 基础的GNN网络模型
  • GCN、GraphSAGE、GAT三大模型原理以及区别
  • transductive和inductive训练方式区别以及做法
  • 一个完整的GNN模型流程以及要素

1 回顾Node Embeddings

1.1 Node Embeddings的关键点

​ Node Embeddings的目标是找到一个向量嵌入空间,Embbedings的过程有两个关键点:

  • Encoder(编码器):将一个节点映射成低维向量
ENC(v)=zvENC(v)=z_v
  • Similarity function(相似函数):描述两个嵌入向量的相似性
similarity(u,v)zvTzusimilarity(u,v)\approx z_v^Tz_u

其中similarity(u,v)similarity(u,v)是原始网络上两个节点的相似性。

1.2 浅层的Node Embeddings

  • 不需要进行训练的Node Embeddings

    • Node centrality(节点中心度)
    • Clustering coefficient(聚集系数)
    • Graphlets
  • 需要进行训练的Node Embeddings

    • Deepwalk:Random walk+word2vec
    • node2vec:BFS or DFS+word2vec
  • 浅层Node embeddings模型存在的缺点

    • 需要确定O(V)O(|V|)个参数,对于大规模图不适用

      • 节点之间没有共享参数
    • 是一种直推式学习(transductive)

      • 无法为没有见过的节点进行训练、
    • 无法利用节点本身带有的特征

1.3 transductive和inductive

半监督学习可以分为“transductive”和“inductive":

  • "transductive":可以翻译为直推式学习,学习的时候把所有数据都进行训练,即训练时也用到了测试集的信息。
  • “inductive“:可以翻译为归纳式学习,学习的时候只用到了训练集,可以将模型应用到其他数据集上(即测试集),传统的机器学习一般是归纳式学习。

1.4 Node Embeddings和GNN的联系

​ GNN其实就是一种Embeddings方法,在GNN模型中的嵌入编码器为:

ENC(v)=基于图结构的多层非线性转换函数(可以理解为MLP)ENC(v)=基于图结构的多层非线性转换函数(可以理解为MLP)

而GNN中的相似性函数则为模型训练中的损失函数,根据任务进行定义。

image-20221103124905275.png

2 GNN算法原理

2.1 简单的想法

​ 输入图的邻接矩阵到神经网络进行训练,最终的输出为每个节点的Embeddings

  • 存在的问题
    • 网络有O(V)O(|V|)个参数
    • 无法应用到大小不同的图上
    • 对节点的顺序敏感
    • 不是inductive的

image-20221103125718979.png

2.2 由CNN卷积核启发

​ CNN中的卷积核是根据图像上的平移不变性进行定义的,我们能不能在图上也定义类似的东西,不考虑节点的顺序。

​ 根据此思想,我们定义计算图,如在第一层GNN网络,通过信息传递和聚合,我们可以看到一阶邻居的信息,第二层则可以看到二阶邻居的信息。

  • 仅从邻居中获得信息权重。
  • 在训练的时候加入自身节点,即自环。
  • 每个节点都有自己的计算图。

image-20221103181916175.png

2.3 GNN模型

GNN主要有两个步骤:

  • message(信息传递):把邻居的特征通过某些方法生成信息
  • Aggregate(聚合):将得到信息进行聚合

image-20221103130920231.png

基础的GNN模型为:

hv(l+1)=σ(WluN(v)hu(l)N(v)+Bl hv(l)),l{0,,L1}\mathrm{h}_{v}^{(l+1)}=\sigma\left(\mathrm{W}_{l} \sum_{u \in \mathrm{N}(v)} \frac{\mathrm{h}_{u}^{(l)}}{|\mathrm{N}(v)|}+\mathrm{B}_{l} \mathrm{~h}_{v}^{(l)}\right), \forall l \in\{0, \ldots, L-1\}

其中ll表示神经网络的层数,WlW_lBlB_l表示ll层神经网络的参数,对所有节点是共享的。

image-20221103125527898.png

将GNN写成矩阵形式:

uN(v)hu(l1)N(v)H(l+1)=D1AH(l)\sum_{u \in N(v)} \frac{h_{u}^{(l-1)}}{|N(v)|} \Rightarrow H^{(l+1)}=D^{-1} A H^{(l)}

其中DD是度矩阵,是一个对角矩阵,对角线上Dv,v=N(v)D_{v,v}=|N(v)|是节点vv的度。

因此可以将模型写成矩阵形式:

H(l+1)=σ(A~H(l)WlT+H(l)BlT)H^{(l+1)}=\sigma\left(\tilde{A} H^{(l)} W_{l}^{\mathrm{T}}+H^{(l)} B_{l}^{\mathrm{T}}\right)

其中A~=D1A\tilde{A}=D^{-1}A

image-20221103131444197.png

3 设计GNN模型

3.1 GNN框架

GNN模型框架主要为:

  • 输入图,获取每个节点的计算图
  • Message(信息传递)
  • Aggregation(聚合)

image-20221103132418416.png

3.2 设计GNN网络层

由上面可以知道,GNN Layer=Message+Aggregation,我们可以从两方面出发Message和Aggregation进行设计。

3.2.1 Message

一般来说,GNN中的Message是将节点特征传入一个全连接层进行计算得到的向量。

mu(l)=W(l)hu(l1)m_u^{(l)}=W^{(l)}h_u^{(l-1)}

image-20221103132817373.png

3.2.2 Aggregation

Aggregation是将得到的Message进行聚合

hv(l)=AGG(l)({mu(l),uN(v)})\mathbf{h}_{v}^{(l)}=\mathrm{AGG}^{(l)}\left(\left\{\mathbf{m}_{u}^{(l)}, u \in N(v)\right\}\right)

可以是Sum,Mean,Max等,对Aggregation进行修改的则是GraphSAGE模型。

image-20221103133003117.png

3.2.3 GNN网络层

image-20221103133358595.png

3.3 The General Pipeline of GNN

  • 定义聚合函数
    • 不同的聚合函数只能支持静态图的transductive learning
    • 只有共享了参数才能允许inductive learning
  • 定义损失函数
  • 对batchs of nodes进行训练
  • 输出Embeddings

image-20221103180746321.png

3.4 GCN

3.4.1 空域层面理解GCN

空域指的是空间上的卷积,如CNN就是空域模型的一种,空域层面理解GCN模型网络层原理为:

hv(l)=σ(uN(v){v}W(l)hu(l1)N(u))\mathbf{h}_{v}^{(l)}=\sigma\left(\sum_{u \in N(v)\cup \{v\}} \mathbf{W}^{(l)} \frac{\mathbf{h}_{u}^{(l-1)}}{|N(u)|}\right)

空域GCN网络中的聚合函数是Sum()Sum\left( \cdot \right),Message过程则是将邻居包括自身节点投入到全连接层后进行归一化,这种做法和第三节的GNN模型类似,但存在缺陷,即节点度偏小的邻居和节点度偏大的邻居得到的重要性是一样的。

举个例子:在这个网络中,我认识一个身价过亿A和一个身无分文B,A和B通过除N(u)=2|N(u)|=2得到的重要性是一样的,聚合过来,我可能就变成身价五千万的人了。为了解决这种问题,原论文用的是renormalizationN(u)|N(u)|改为N(u)N(v)\sqrt{|N(u)||N(v)|},即加上A的度。模型变为:

hv(l)=σ(uN(v){v}W(l)hu(l1)N(u)N(v))\mathbf{h}_{v}^{(l)}=\sigma\left(\sum_{u \in N(v)\cup \{v\}} \mathbf{W}^{(l)} \frac{\mathbf{h}_{u}^{(l-1)}}{\sqrt{|N(u)||N(v)|}}\right)

可以理解为:节点v的不同邻节点u对节点v的贡献度应该是不同的

image-20221103181256087.png

3.4.2 谱域层面理解第三代GCN

在谱域层面理解上第三代GCN模型为:

H(l+1)=σ(D~12A~D~12H(l)W(l))H^{(l+1)}=\sigma\left(\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} H^{(l)} W^{(l)}\right)

其中A~=A+I\tilde{A}=A+I,即邻接矩阵加自环,D~\tilde{D}A~\tilde{A}的度矩阵,展开其中式子:

(D~0.5A~D~0.5H)i=(D~0.5A~)iD~0.5H=(kD~ik0.5A~i)D~0.5H=D~ii0.5jA~ijkD~jk0.5Hj=D~ii0.5jA~ijD~jj0.5Hj=j1D~iiD~jjA~ijHj\begin{aligned} \left(\tilde{D}^{-0.5} \tilde{A} \tilde{D}^{-0.5} H\right)_{i} &=\left(\tilde{D}^{-0.5} \tilde{A}\right)_{i} \tilde{D}^{-0.5} H \\ &=\left(\sum_{k} \tilde{D}_{i k}^{-0.5} \tilde{A}_{i}\right) \tilde{D}^{-0.5} H \\ &=\tilde{D}_{i i}^{-0.5} \sum_{j} \tilde{A}_{i j} \sum_{k} \tilde{D}_{j k}^{-0.5} H_{j} \\ &=\tilde{D}_{i i}^{-0.5} \sum_{j} \tilde{A}_{i j} \tilde{D}_{j j}^{-0.5} H_{j} \\ &=\sum_{j} \frac{1}{\sqrt{\tilde{D}_{i i} \tilde{D}_{j j}}} \tilde{A}_{i j} H_{j} \end{aligned}

可以看到第三代GCN模型在谱域中展开后的式子和空域中的GCN模型是一致的。

实际上,第三代GCN模型利用了拉普拉斯矩阵进行谱分解(图上的傅里叶变换),在谱域上进行卷积操作再转换回原空间,式子中D~12A~D~12\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}}是一个拉普拉斯矩阵的变体为Symmetric normalized Laplacian,令其为LL

GCN的核心基于拉普拉斯矩阵的谱分解:

  • 矩阵的谱分解,特征分解,对角化都是同一个概念、
  • 拉普拉斯矩阵是半正定对称矩阵,有以下几个性质
    • 对称矩阵一定n个线性无关的特征向量
    • 半正定矩阵的特征值一定非负
    • 对阵矩阵的特征向量相互正交,即所有特征向量构成的矩阵为正交矩阵。

由上可以知道拉普拉斯矩阵一定可以谱分解,且分解后有特殊的形式。对于拉普拉斯矩阵其谱分解为:

L=U(λ1λn)UTL=U\left(\begin{array}{lll} \lambda_{1} & & \\ & \ddots & \\ & & \lambda_{n} \end{array}\right) U^{T}

其中UU是一个正交矩阵矩阵,即它自带一组正交基。

因此式子中D~12A~D~12H(l)=Udiag(λ1,,λn)UTH(l)\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} H^{(l)} =Udiag(\lambda_1,\cdots,\lambda_n)U^TH^{(l)}可以理解为:

  • 第一步:将第ll层所有的特征H(l)H^{(l)}通过左乘一个UTU^T转换为谱域上的向量
  • 第二步:得到谱域上的向量UTH(l)U^TH^{(l)}后,进行左乘diag(λ1,,λn)diag(\lambda_1,\cdots,\lambda_n)在谱域上卷积操作
  • 第三步:将卷积得到的结果diag(λ1,,λn)UTH(l)diag(\lambda_1,\cdots,\lambda_n)U^TH^{(l)},左乘UU回到原空间

要了解更多数学原理参考图卷积神经网络(GCN)的数学原理详解——谱图理论和傅立叶变换初探_哔哩哔哩_bilibili

3.5 GraphSAGE

3.5.1 GraphSAGE和GCN的区别

GraphSAGE和GCN主要的区别在于:

  • GraphSAGE对计算图进行采样,多了一步sampling step(即不把整张图作为输入)
  • GraphSAGE先将邻居节点进行聚合(相当于message)
  • 随后将聚合的节点以及自身节点投入到全连接层以及激活函数(相当于Aggregation)
  • 最后对每个节点进行归一化

Note:GraphSAGE对邻节点采样的数量是固定的,如果某个节点的邻居节点不够则重复采样直到满足设定采样数量,超过则随机下采样。

image-20221103183936766.png

3.5.2 GraphSAGE模型

GraphSAGE模型为:

hv(l)=σ(W(l)CONCAT(hv(l1),AGG({hu(l1),uN(v)})))\mathbf{h}_{v}^{(l)}=\sigma\left(\mathbf{W}^{(l)} \cdot \operatorname{CONCAT}\left(\mathbf{h}_{v}^{(l-1)}, \operatorname{AGG}\left(\left\{\mathbf{h}_{u}^{(l-1)}, \forall u \in N(v)\right\}\right)\right)\right)

GraphSAGE原论文提供了四种AGG函数:

  • Mean
AGG=uN(v)hu(l1)N(v)AGG =\sum_{u \in N(v)} \frac{\mathbf{h}_{u}^{(l-1)}}{|N(v)|}
  • Pool
AGG=Max({MLP(hu(l1)),uN(v)})\mathrm{AGG}=\operatorname{Max}\left(\left\{\operatorname{MLP}\left(\mathbf{h}_{u}^{(l-1)}\right), \forall u \in N(v)\right\}\right)
  • LSTM
AGG=LSTM([hu(l1),uπ(N(v))])\mathrm{AGG}=\operatorname{LSTM}\left(\left[\mathbf{h}_{u}^{(l-1)}, \forall u \in \pi(N(v))\right]\right)
  • GCN
hvkσ(WMEAN({hvk1}{huk1,uN(v)})\mathbf{h}_{v}^{k} \leftarrow \sigma\left(\mathbf{W} \cdot \operatorname{MEAN}\left(\left\{\mathbf{h}_{v}^{k-1}\right\} \cup\left\{\mathbf{h}_{u}^{k-1}, \forall u \in \mathcal{N}(v)\right\}\right)\right.

Note:GraphSAGE和GCN的区别

  • GraphSAGE取AGG为GCN时,是GCN的局部谱域的粗略线性近似,而不是真正的GCN。
  • GCN是将自身以及邻居节点进行了对称归一化,而GraphSAGE-GCN只将采样到的邻居节点以及自身节点进行平均处理。
  • GraphSAGE算法中采用了minibatch,不将全图输入,而是随机选取一些点输入,随后对这些点进行采样
  • GraphSAGE算法最后一步采样了L2标准化。

image-20221103190936759.png

Note:GraphSAGE和GCN网络中的inductive体现在以下几方面

  • 只用到了节点的度信息
  • 只用到了节点的特征信息
  • minibatch方法使模型避免用到了整张图的矩阵
  • 节点特征不能是one-hot编码,而只能是真实特征
    • 因为one-hot编码是根据整张图进行计算的,若加入了新节点,整张图会发生改变,编码长度会增加。

总而言之要确保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,所以从这点来说,GCN不是inductive的。 确保这两点,几乎现在市面上所有message passing架构的gnn都是inductive的。

    参考(3 封私信 / 80 条消息) 为什么GAT能够实现Inductive learning,而GCN不行? - 知乎 (zhihu.com)

综上,只要做一些改变,如采用minbatch等方法,GCN可以是inductive的

附上GraphSAGE原作者在GCN下的issue里的一段话:

​ The title of the GraphSAGE paper ("Inductive representation learning") is unfortunately a bit misleading in that regard. The main benefit of the sampling step of GraphSAGE is scalability (but at the cost of higher variance gradients).

​ sampling step最主要的好处是使得GraphSAGE是可扩展的,但带来的缺点是梯度方差较高。

3.6 GAT

GAT即在图上加了attention mechanism(注意力机制),和所有的attention mechanism一样,GAT计算也分为两步走

3.6.1 计算注意力系数(attention coefficient)

对于顶点ii,逐个计算它的邻居和它自己之间的相似系数

eij=a(Whi,Whj)e_{i j} = a\left(\mathbf{W} \vec{h}_{i}, \mathbf{W} \vec{h}_{j}\right)

其中a(,)a(\cdot,\cdot)是一个映射,eije_{ij}是一个实数。

对注意力系数进行归一化:

αij=softmaxj(eij)=exp(eij)kNiexp(eik)\alpha_{i j}=\operatorname{softmax}_{j}\left(e_{i j}\right)=\frac{\exp \left(e_{i j}\right)}{\sum_{k \in \mathcal{N}_{i}} \exp \left(e_{i k}\right)}

原论文中还使用了一个LeakyReLU\operatorname{LeakyReLU}

αij=exp(LeakyReLU(aT[WhiWhj]))kNiexp(LeakyReLU(aT[WhiWhk]))\alpha_{i j}=\frac{\exp \left(\operatorname{LeakyReLU}\left(\overrightarrow{\mathbf{a}}^{T}\left[\mathbf{W} \vec{h}_{i} \| \mathbf{W} \vec{h}_{j}\right]\right)\right)}{\sum_{k \in \mathcal{N}_{i}} \exp \left(\operatorname{LeakyReLU}\left(\overrightarrow{\mathbf{a}}^{T}\left[\mathbf{W} \vec{h}_{i} \| \mathbf{W} \vec{h}_{k}\right]\right)\right)}

3.6.2 加权求和(aggregation)

对得到的注意力系数进行加权求和:

hi=σ(jNiαijWhj)\vec{h}_{i}^{\prime}=\sigma\left(\sum_{j \in \mathcal{N}_{i}} \alpha_{i j} \mathbf{W} \vec{h}_{j}\right)

为了让模型更佳,利用mutiheadmuti-head(多头注意力机制)进行增强:

hi=k=1Kσ(jNiαijkWkhj)\vec{h}_{i}^{\prime}=\|_{k=1}^{K} \sigma\left(\sum_{j \in \mathcal{N}_{i}} \alpha_{i j}^{k} \mathbf{W}^{k} \vec{h}_{j}\right)

即:

hi=σ(1Kk=1KjNiαijkWkhj)\vec{h}_{i}^{\prime}=\sigma\left(\frac{1}{K} \sum_{k=1}^{K} \sum_{j \in \mathcal{N}_{i}} \alpha_{i j}^{k} \mathbf{W}^{k} \vec{h}_{j}\right)

多头注意力机制示意图:

image-20221103210105073.png

4 GNN模型整体框架

4.1 实际应用中的GNN网络层

​ 在实际应用中,GNN网络层和许多深度学习模型可以相联系,可以加入BatchNorm,Dropout,Activation,Attention等。

image-20221109155537557.png

4.1.1 BatchNorm

  • 目标:为了使得训练数值稳定
  • 想法:对数据进行规范化

image-20221109155808667.png

4.1.2 Dropout

  • 目标:防止模型过拟合
  • 想法:在训练过程中,随机丢掉一些信息

image-20221109155937608.png

4.2 多层GNN网络

  • 如何构建一个GNN?
    • 标准做法:堆叠GNN网络层
    • 输入:原始的特征
    • 输出:Node Embeddings

image-20221109160132843.png

4.2.1 过平滑问题(over-smoothing)

  • 堆叠过多的GNN网络存在问题过平滑问题
  • 过平滑问题:所有节点因为信息的过度共享,导致所有节点收敛到相同的Embeddings

image-20221109160259508.png

  • 过平滑问题发生的原因:GNN的感受野,通过太多层,一个节点可以看到全图的信息。

image-20221109160536418.png

4.2.2 如何避免过平滑问题

  • 做法一:小心添加GNN层(减少GNN层)
    • Step1:分析问题GNN所需要的感受野范围
    • Step2:设置稍微比所需感受野稍深的GNN网络
  • 问题:如何使得浅层的GNN网络更有效果?

image-20221109160651905.png

若我们需要解决的实际问题中无法避免需要深层的GNN网络。

  • 做法二:GNN网络层使用Skip-connection方法
    • 过平滑问题的原因:Node Embeddings在前面的GNN层已经可以区分开了,而在后面的GNN层,使得Node共享了几乎全图的信息,导致收敛到同一个值。
    • 方法:通过Skip-connection增加前面的GNN层对最后Node Embeddings的影响。

image-20221109161534689.png

4.2.3 浅层GNN网络的增强

  • 方法1:对每层GNN网络进行增强
    • 在以往的案例,每个transformation或者aggregation函数都只是包含了一层线性层
    • 我们可以把aggregation或者transformation做成一个DNN

image-20221109161037978.png

  • 方法2:增加不包含信息传递的网络层
    • 可以在GNN网络前后加入MLP网络层

image-20221109161318313.png

4.2.4 深层GNN网络的增强(skip-connection)

  • 想法:通过skip-connection增加模型的复杂度
  • N种Skip-connection有2N2^N种可能连接方式

image-20221109162245952.png

  • 具体做法:在每一个GNN层得到的节点特征输出,加上以前的节点特征,为最终的输出。

image-20221109162735384.png

  • 其他的做法:直接把每层GNN得到的结果加到最终的输出。

image-20221109162850439.png

4.3 GNN整体框架

image-20221110083540370.png

4.3.1 输入处理

  • 输入图不等于计算图

image-20221109163019212.png

  • 在以往的模型,我们假设,输入的图为原始图
  • 这种假设实际中不常用的原因:
    • 特征层面
      • 输入的图缺少某些特征,需要做特征增广
    • 结构层面
      • 图结构过于稀疏,信息传递效率不高
      • 图结构过于密集,信息传递花费高
      • 图结构过大,训练时间高

image-20221109163233851.png

解决方法:

  • 图节点特征
    • 节点缺失,做特征增广
  • 图结构
    • 过于稀疏,增加虚拟边和节点
    • 过于密集,做信息传递时候对邻居进行采样
    • 图太大,对图进行采样得到子图再训练

image-20221109163539299.png

4.3.1.1 特征增广(Feature Augmentation)
  • 情况一:输入图没有任何节点特征
    • 这种情况很常见,只有一个邻接矩阵信息
    • 常见的做法:
      • (a)对每个节点都给相同的值
      • (b)对每个节点进行one-hot编码(缺点是无法用于inductive任务)
  • 情况二:图中特定的结构无法被GNN识别
    • 例子:自环图
    • 做法:利用自环图的信息,进行节点特征增广
      • Clustering coefficient
      • PageRank
      • Centrality

image-20221109170427775.png

image-20221109170702719.png

4.3.1.2 增加虚拟边/节点(Add Virtual Nodes/Edges)
  • 目标:处理过于稀疏的图
  • 方法1:增加虚拟边
    • 常用方法:通过虚拟边增加二阶连接的邻居
    • 想法:通过A+A2A+A^2替代邻接矩阵AA
  • 方法2:增加虚拟节点
    • 这个虚拟节点会连接一整张图
      • 假设图是稀疏的,两个节点最短路径也要经过十个节点
      • 增加虚拟节点后,两个节点可以通过虚拟节点连接
    • 优点:提高了信息传递的效率。

image-20221109163955230.png

image-20221109164510754.png

4.3.1.3 邻居节点采样
  • 以往的做法:
    • 所有节点应用于信息传递中
  • 新想法:对邻居节点进行随机采样,应用于信息传递,解决图过于密集问题

image-20221109170928130.png

  • 例子:如下图,对A的邻居节点D丢弃,只选择邻居C和B。
    • 优点:能大幅度减少信息传递的时间复杂度
    • 在实际应用中较为常用

image-20221109171205457.png

4.3.2 数据集分割

本小节探究如何分割训练/验证/测试集。

image-20221110083901139.png

4.3.2.1 传统数据和Graph数据的不同之处
  • 图像分类:每个数据点都是一个图,每个数据点都是独立的。
  • 节点分类:每个数据点都是一个节点,但每个节点不是独立的。

image-20221110084117275.png

image-20221110084126762.png

4.3.2.2 Transductive和Inductive设置
  • Transductive setting:输入的图包含了整个数据集的划分(包括训练集/验证集/测试集)
  • 我们只划分labels
    • 在训练阶段,我们利用整张图的信息计算Embeddings,训练时候只用划分的训练labels,对应图中的1和2labels。
    • 在验证阶段,我们利用整张图的信息计算Embeddings,验证时候只用划分的验证labels,对应图中的3和4labels。

image-20221110085301781.png

  • Inductive setting:我们把图中某些egdes丢失,形成多个子图,和GraphSAGE中的minibacth操作一样。
    • 如图所示,丢失后,我们有三个独立的图。

image-20221110085718445.png

4.3.2.3 Transductive和Inductive的区别
  • Transductive setting:训练/验证/测试集都在同一张图
    • 数据集只包含一张图
    • 整张图看作数据集的划分,而我们只做标签的划分
    • 只能用于节点/边预测任务
  • Inductive setting:训练/验证/测试集在不同的图
    • 数据集包含很多张图(只有一张图可以通过minibatch划分子图)
    • 划分后,每个阶段只能看到当前的图,可用于预测未看过的图
    • 可以应用于节点/边/图预测任务

image-20221110090006677.png

4.3.2.4 节点/边/图预测任务例子

1、节点分类

  • Transductive设置
    • 在整张图上做标签划分,计算Embeddins利用整张图的信息。
  • Inductive设置
    • 假设我们有三个图
    • 每个划分包含一个独立的图

image-20221110090559010.png

2、图分类

  • 只有Inductive setting可用于图分类
    • 因为测试集中包含未见过的图

image-20221110091141915.png

3、链接预测

  • 链接预测的目标:预测缺失的边
  • 设置链接预测是有技巧的
    • 链接预测是一个无监督/半监督的任务。我们需要自己创建标签。
    • 具体而言,我们需要隐藏某些边然后让GNN预测这些边

image-20221110091311963.png

  • 对于链接预测,我们将边分为两种类型
  • Step1:对输入图设置两种类型的边
    • 信息传递边(Message edges):用于计算Embeddings时用于信息传递的边
    • 监督边(Supervision edges):用于计算损失目标的边
    • 通过Step1后:
      • 只有Message edges仍保留在图上
      • Supervision edges只有GNN计算损失时候使用
  • Step2:划分训练/验证/测试集
    • 方法一:Inductive setting
      • 假设我们有三个图,每个训练/验证/测试集均有一个图,这三个图是独立的。
      • 在训练/验证/测试集中,每个图都有两种不同类型的边:Message edges和Supervision edges
        • Supervision edges不会输入到GNN中
    • 方法二:Tranductive setting
      • 这是链接预测任务的默认设置
      • 假设我们只有一张图,在整张图上,我们需要设置四种边Training message edges/Training supervision edges/Validation edges/Test edges
      • 在训练阶段,使用Training message edges去预测Training supervision edges
      • 在验证阶段,使用Training message edges和Training supervision edges去预测Validation edges
      • 在测试阶段,使用Training message edges、Training supervision edges和Validation edges去预测Test edges
      • Note:在训练阶段只有Training message edges输入到GNN,在验证阶段只有Training message edges和Training supervision edges输入到GNN,在测试阶段只有Training message edges、Training supervision edges和Validation edges输入到GNN。
      • Note:链接预测设置是复杂且有技巧的,可以在不同的论文上看到不同的设置。

image-20221110091657828.png

image-20221110092017642.png

image-20221110092350033.png

image-20221110093020009.png

image-20221110093028449.png

image-20221110093037713.png

image-20221110093048962.png

4.3.3 下游任务(Prediction Heads)

4.3.3.1 节点层面预测任务
  • 节点层面预测:可以直接使用训练得到的Node Embeddings

image-20221110095654044.png

4.3.3.2 链接预测任务
  • 边层面预测任务:利用节点对做预测任务
  • 假设我们的任务为k分类任务
  • 计算y^uv=Headedge(hu(L),hv(L))\widehat{\boldsymbol{y}}_{u v}=\operatorname{Head}_{\mathrm{edg} e}\left(\mathbf{h}_{u}^{(L)}, \mathbf{h}_{v}^{(L)}\right),其中Headedge\operatorname{Head}_{\mathrm{edg} e}可以如下设置
    • Concatenation+Linear:y^uv=Linear( Concat (hu(L),hv(L)))\widehat{\boldsymbol{y}}_{\boldsymbol{u} v}=\operatorname{Linear}\left(\text { Concat }\left(\mathbf{h}_{u}^{(L)}, \mathbf{h}_{v}^{(L)}\right)\right)
    • Dot product
      • y^uv=(hu(L))Thv(L)\widehat{\boldsymbol{y}}_{u v}=\left(\mathbf{h}_{u}^{(L)}\right)^{T} \mathbf{h}_{v}^{(L)}应用于1-way prediction(即预测是否存在边)
      • 应用到k-way prediction,需要做些改变,类似多头注意力机制设置参数:W(1),,W(k)\mathbf{W}^{(1)}, \ldots, \mathbf{W}^{(k)}
y^uv(1)=(hu(L))TW(1)hv(L)y^uv(k)=(hu(L))TW(k)hv(L)y^uv=Concat(y^uv(1),,y^uv(k))Rk\begin{array}{c} \widehat{y}_{u v}^{(1)}=\left(\mathbf{h}_{u}^{(L)}\right)^{T} \mathbf{W}^{(1)} \mathbf{h}_{v}^{(L)} \\ \ldots \\ \widehat{y}_{u v}^{(k)}=\left(\mathbf{h}_{u}^{(L)}\right)^{T} \mathbf{W}^{(k)} \mathbf{h}_{v}^{(L)} \\ \widehat{\boldsymbol{y}}_{u v}=\operatorname{Concat}\left(\widehat{y}_{u v}^{(1)}, \ldots, \widehat{\boldsymbol{y}}_{u v}^{(k)}\right) \in \mathbb{R}^{k} \end{array}

image-20221110102524201.png

image-20221110103353631.png

image-20221110103406364.png

4.3.3.3 图预测任务
  • 图层面预测任务:做图预测任务时,用到所有的node embeddings
  • 假设我们的任务是k-way prediction,目标是设置Headgraph\operatorname{Head}_{\operatorname{graph}},计算y^G=Headgraph({hv(L)Rd,vG})\widehat{\boldsymbol{y}}_{G}=\operatorname{Head}_{\operatorname{graph}}\left(\left\{\mathbf{h}_{v}^{(L)} \in \mathbb{R}^{d}, \forall v \in G\right\}\right)Headgraph\operatorname{Head}_{\operatorname{graph}}可以如下设置:
    • Global mean pooling:y^G=Mean({hv(L)Rd,vG})\widehat{\boldsymbol{y}}_{G}=\operatorname{Mean}\left(\left\{\mathbf{h}_{v}^{(L)} \in \mathbb{R}^{d}, \forall v \in G\right\}\right)
    • Global max pooling:y^G=Max({hv(L)Rd,vG})\widehat{\boldsymbol{y}}_{G}=\operatorname{Max}\left(\left\{\mathbf{h}_{v}^{(L)} \in \mathbb{R}^{d}, \forall v \in G\right\}\right)
    • Global sum pooling:y^G=Sum({hv(L)Rd,vG})\widehat{\boldsymbol{y}}_{G}=\operatorname{Sum}\left(\left\{\mathbf{h}_{v}^{(L)} \in \mathbb{R}^{d}, \forall v \in G\right\}\right)
  • 如上设置存在一些问题,Global pooling会丢失某些信息,如计算G1G_1G2G_2,无法区分以下情况:
    • G1:y^G=Sum({1,2,0,1,2})=0G_{1}: \hat{y}_{G}=\operatorname{Sum}(\{-1,-2,0,1,2\})=0
    • G2:y^G=Sum({10,20,0,10,20})=0G_{2}: \hat{y}_{G}=\operatorname{Sum}(\{-10,-20,0,10,20\})=0
  • 为了解决上述问题,提出一个分层Pooling方法(Hierarchical Global Pooling)
    • 我们将一个图中的node进行分层pooling
    • G1 node embeddings: {1,2,0,1,2}G_{1} \text { node embeddings: }\{-1,-2,0,1,2\}
      •  Round 1: y^a=ReLU(Sum({1,2}))=0,y^b=ReLU(Sum({0,1,2}))=3\text { Round 1: } \hat{y}_{a}=\operatorname{ReLU}(\operatorname{Sum}(\{-1,-2\}))=0, \hat{y}_{b}= \operatorname{ReLU}(\operatorname{Sum}(\{0,1,2\}))=3
      •  Round 2: y^G=ReLU(Sum({ya,yb}))=3\text { Round 2: } \hat{y}_{G}=\operatorname{ReLU}\left(\operatorname{Sum}\left(\left\{y_{a}, y_{b}\right\}\right)\right)=3
    • G2 node embeddings: {10,20,0,10,20}G_{2} \text { node embeddings: }\{-10,-20,0,10,20\}
      •  Round 1: y^a=ReLU(Sum({10,20}))=0,y^b=ReLU(Sum({0,10,20}))=30\text { Round 1: } \hat{y}_{a}=\operatorname{ReLU}(\operatorname{Sum}(\{-10,-20\}))=0, \hat{y}_{b}= \operatorname{ReLU}(\operatorname{Sum}(\{0,10,20\}))=30
      •  Round 2: y^G=ReLU(Sum({ya,yb}))=30\text { Round 2: } \hat{y}_{G}=\operatorname{ReLU}\left(\operatorname{Sum}\left(\left\{y_{a}, y_{b}\right\}\right)\right)=30
  • Hierarchical Global Pooling的其中具体做法之一:DiffPool
    • 对每一层训练两个GNN:
      • GNN A:计算Node Embeddings
      • GNN B:i计算Node属于哪个cluster
    • 每一层的两个GNN都可以并行训练
    • 对于每一层做如下操作:
      • 利用GNN B计算得到的cluster来聚合从GNN A中生成的Node Embeddings
      • 对每个cluster生成一个新的节点表示并生成cluster之间的edges,作为新的图投入到下层训练

image-20221110105702744.png

image-20221110105915812.png

image-20221110110229156.png

image-20221110110934244.png

image-20221110111619384.png

image-20221110111843906.png