GNN
在本节我们可以了解到:
基础的GNN网络模型
GCN、GraphSAGE、GAT三大模型原理以及区别
transductive和inductive训练方式区别以及做法
一个完整的GNN模型流程以及要素
1 回顾Node Embeddings
1.1 Node Embeddings的关键点
Node Embeddings的目标是找到一个向量嵌入空间,Embbedings的过程有两个关键点:
Encoder(编码器):将一个节点映射成低维向量
E N C ( v ) = z v ENC(v)=z_v ENC ( v ) = z v
Similarity function(相似函数):描述两个嵌入向量的相似性
s i m i l a r i t y ( u , v ) ≈ z v T z u similarity(u,v)\approx z_v^Tz_u s imi l a r i t y ( u , v ) ≈ z v T z u
其中s i m i l a r i t y ( u , v ) similarity(u,v) s imi l a r i t y ( 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模型存在的缺点
1.3 transductive和inductive
半监督学习可以分为“transductive”和“inductive":
"transductive":可以翻译为直推式学习,学习的时候把所有数据都进行训练,即训练时也用到了测试集的信息。
“inductive“:可以翻译为归纳式学习,学习的时候只用到了训练集,可以将模型应用到其他数据集上(即测试集),传统的机器学习一般是归纳式学习。
1.4 Node Embeddings和GNN的联系
GNN其实就是一种Embeddings方法,在GNN模型中的嵌入编码器为:
E N C ( v ) = 基于图结构的多层非线性转换函数 ( 可以理解为 M L P ) ENC(v)=基于图结构的多层非线性转换函数(可以理解为MLP) ENC ( v ) = 基于图结构的多层非线性转换函数 ( 可以理解为 M L P )
而GNN中的相似性函数则为模型训练中的损失函数,根据任务进行定义。
2 GNN算法原理
2.1 简单的想法
输入图的邻接矩阵到神经网络进行训练,最终的输出为每个节点的Embeddings
存在的问题
网络有O ( ∣ V ∣ ) O(|V|) O ( ∣ V ∣ ) 个参数
无法应用到大小不同的图上
对节点的顺序敏感
不是inductive的
2.2 由CNN卷积核启发
CNN中的卷积核是根据图像上的平移不变性进行定义的,我们能不能在图上也定义类似的东西,不考虑节点的顺序。
根据此思想,我们定义计算图 ,如在第一层GNN网络,通过信息传递和聚合,我们可以看到一阶邻居的信息,第二层则可以看到二阶邻居的信息。
仅从邻居中获得信息权重。
在训练的时候加入自身节点,即自环。
每个节点都有自己的计算图。
2.3 GNN模型
GNN主要有两个步骤:
message(信息传递):把邻居的特征通过某些方法生成信息
Aggregate(聚合):将得到信息进行聚合
基础的GNN模型为:
h v ( l + 1 ) = σ ( W l ∑ u ∈ N ( v ) h u ( l ) ∣ N ( v ) ∣ + B l h v ( l ) ) , ∀ l ∈ { 0 , … , L − 1 } \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\} h v ( l + 1 ) = σ ⎝ ⎛ W l u ∈ N ( v ) ∑ ∣ N ( v ) ∣ h u ( l ) + B l h v ( l ) ⎠ ⎞ , ∀ l ∈ { 0 , … , L − 1 }
其中l l l 表示神经网络的层数,W l W_l W l 和B l B_l B l 表示l l l 层神经网络的参数,对所有节点是共享的。
将GNN写成矩阵形式:
∑ u ∈ N ( v ) h u ( l − 1 ) ∣ N ( v ) ∣ ⇒ H ( l + 1 ) = D − 1 A H ( l ) \sum_{u \in N(v)} \frac{h_{u}^{(l-1)}}{|N(v)|} \Rightarrow H^{(l+1)}=D^{-1} A H^{(l)} u ∈ N ( v ) ∑ ∣ N ( v ) ∣ h u ( l − 1 ) ⇒ H ( l + 1 ) = D − 1 A H ( l )
其中D D D 是度矩阵,是一个对角矩阵,对角线上D v , v = ∣ N ( v ) ∣ D_{v,v}=|N(v)| D v , v = ∣ N ( v ) ∣ 是节点v v v 的度。
因此可以将模型写成矩阵形式:
H ( l + 1 ) = σ ( A ~ H ( l ) W l T + H ( l ) B l T ) H^{(l+1)}=\sigma\left(\tilde{A} H^{(l)} W_{l}^{\mathrm{T}}+H^{(l)} B_{l}^{\mathrm{T}}\right) H ( l + 1 ) = σ ( A ~ H ( l ) W l T + H ( l ) B l T )
其中A ~ = D − 1 A \tilde{A}=D^{-1}A A ~ = D − 1 A
3 设计GNN模型
3.1 GNN框架
GNN模型框架主要为:
输入图,获取每个节点的计算图
Message(信息传递)
Aggregation(聚合)
3.2 设计GNN网络层
由上面可以知道,GNN Layer=Message+Aggregation,我们可以从两方面出发Message和Aggregation进行设计。
3.2.1 Message
一般来说,GNN中的Message是将节点特征传入一个全连接层进行计算得到的向量。
m u ( l ) = W ( l ) h u ( l − 1 ) m_u^{(l)}=W^{(l)}h_u^{(l-1)} m u ( l ) = W ( l ) h u ( l − 1 )
3.2.2 Aggregation
Aggregation是将得到的Message进行聚合
h v ( l ) = A G G ( l ) ( { m u ( l ) , u ∈ N ( v ) } ) \mathbf{h}_{v}^{(l)}=\mathrm{AGG}^{(l)}\left(\left\{\mathbf{m}_{u}^{(l)}, u \in N(v)\right\}\right) h v ( l ) = AGG ( l ) ( { m u ( l ) , u ∈ N ( v ) } )
可以是Sum,Mean,Max等,对Aggregation进行修改的则是GraphSAGE模型。
3.2.3 GNN网络层
3.3 The General Pipeline of GNN
定义聚合函数
不同的聚合函数只能支持静态图的transductive learning
只有共享了参数才能允许inductive learning
定义损失函数
对batchs of nodes进行训练
输出Embeddings
3.4 GCN
3.4.1 空域层面理解GCN
空域指的是空间上的卷积,如CNN就是空域模型的一种,空域层面理解GCN模型网络层原理为:
h v ( l ) = σ ( ∑ u ∈ N ( v ) ∪ { v } W ( l ) h u ( l − 1 ) ∣ 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) h v ( l ) = σ ⎝ ⎛ u ∈ N ( v ) ∪ { v } ∑ W ( l ) ∣ N ( u ) ∣ h u ( l − 1 ) ⎠ ⎞
空域GCN网络中的聚合函数是S u m ( ⋅ ) Sum\left( \cdot \right) S u m ( ⋅ ) ,Message过程则是将邻居包括自身节点 投入到全连接层后进行归一化,这种做法和第三节的GNN模型类似,但存在缺陷,即节点度偏小的邻居和节点度偏大的邻居得到的重要性是一样的。
举个例子:在这个网络中,我认识一个身价过亿A和一个身无分文B,A和B通过除∣ N ( u ) ∣ = 2 |N(u)|=2 ∣ N ( u ) ∣ = 2 得到的重要性是一样的,聚合过来,我可能就变成身价五千万的人了。为了解决这种问题,原论文用的是renormalization ,∣ N ( u ) ∣ |N(u)| ∣ N ( u ) ∣ 改为∣ N ( u ) ∣ ∣ N ( v ) ∣ \sqrt{|N(u)||N(v)|} ∣ N ( u ) ∣∣ N ( v ) ∣ ,即加上A的度。模型变为:
h v ( l ) = σ ( ∑ u ∈ N ( v ) ∪ { v } W ( l ) h u ( l − 1 ) ∣ 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) h v ( l ) = σ ⎝ ⎛ u ∈ N ( v ) ∪ { v } ∑ W ( l ) ∣ N ( u ) ∣∣ N ( v ) ∣ h u ( l − 1 ) ⎠ ⎞
可以理解为:节点v的不同邻节点u对节点v的贡献度应该是不同的
3.4.2 谱域层面理解第三代GCN
在谱域层面理解上第三代GCN模型为:
H ( l + 1 ) = σ ( D ~ − 1 2 A ~ D ~ − 1 2 H ( 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) H ( l + 1 ) = σ ( D ~ − 2 1 A ~ D ~ − 2 1 H ( l ) W ( l ) )
其中A ~ = A + I \tilde{A}=A+I A ~ = A + I ,即邻接矩阵加自环,D ~ \tilde{D} D ~ 是A ~ \tilde{A} A ~ 的度矩阵,展开其中式子:
( D ~ − 0.5 A ~ D ~ − 0.5 H ) i = ( D ~ − 0.5 A ~ ) i D ~ − 0.5 H = ( ∑ k D ~ i k − 0.5 A ~ i ) D ~ − 0.5 H = D ~ i i − 0.5 ∑ j A ~ i j ∑ k D ~ j k − 0.5 H j = D ~ i i − 0.5 ∑ j A ~ i j D ~ j j − 0.5 H j = ∑ j 1 D ~ i i D ~ j j A ~ i j H j \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} ( D ~ − 0.5 A ~ D ~ − 0.5 H ) i = ( D ~ − 0.5 A ~ ) i D ~ − 0.5 H = ( k ∑ D ~ ik − 0.5 A ~ i ) D ~ − 0.5 H = D ~ ii − 0.5 j ∑ A ~ ij k ∑ D ~ jk − 0.5 H j = D ~ ii − 0.5 j ∑ A ~ ij D ~ jj − 0.5 H j = j ∑ D ~ ii D ~ jj 1 A ~ ij H j
可以看到第三代GCN模型在谱域中展开后的式子和空域中的GCN模型是一致的。
实际上,第三代GCN模型利用了拉普拉斯矩阵进行谱分解(图上的傅里叶变换),在谱域上进行卷积操作 ,再转换回原空间 ,式子中D ~ − 1 2 A ~ D ~ − 1 2 \tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} D ~ − 2 1 A ~ D ~ − 2 1 是一个拉普拉斯矩阵的变体为Symmetric normalized Laplacian ,令其为L L L
GCN的核心基于拉普拉斯矩阵的谱分解:
矩阵的谱分解,特征分解,对角化都是同一个概念、
拉普拉斯矩阵是半正定对称矩阵,有以下几个性质
对称矩阵一定n个线性无关的特征向量
半正定矩阵的特征值一定非负
对阵矩阵的特征向量相互正交,即所有特征向量构成的矩阵为正交矩阵。
由上可以知道拉普拉斯矩阵一定可以谱分解,且分解后有特殊的形式。对于拉普拉斯矩阵其谱分解为:
L = U ( λ 1 ⋱ λ n ) U T L=U\left(\begin{array}{lll}
\lambda_{1} & & \\
& \ddots & \\
& & \lambda_{n}
\end{array}\right) U^{T} L = U ⎝ ⎛ λ 1 ⋱ λ n ⎠ ⎞ U T
其中U U U 是一个正交矩阵矩阵,即它自带一组正交基。
因此式子中D ~ − 1 2 A ~ D ~ − 1 2 H ( l ) = U d i a g ( λ 1 , ⋯ , λ n ) U T H ( l ) \tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} H^{(l)} =Udiag(\lambda_1,\cdots,\lambda_n)U^TH^{(l)} D ~ − 2 1 A ~ D ~ − 2 1 H ( l ) = U d ia g ( λ 1 , ⋯ , λ n ) U T H ( l ) 可以理解为:
第一步:将第l l l 层所有的特征H ( l ) H^{(l)} H ( l ) 通过左乘一个U T U^T U T 转换为谱域上的向量
第二步:得到谱域上的向量U T H ( l ) U^TH^{(l)} U T H ( l ) 后,进行左乘d i a g ( λ 1 , ⋯ , λ n ) diag(\lambda_1,\cdots,\lambda_n) d ia g ( λ 1 , ⋯ , λ n ) 在谱域上卷积操作
第三步:将卷积得到的结果d i a g ( λ 1 , ⋯ , λ n ) U T H ( l ) diag(\lambda_1,\cdots,\lambda_n)U^TH^{(l)} d ia g ( λ 1 , ⋯ , λ n ) U T H ( l ) ,左乘U U U 回到原空间
要了解更多数学原理参考图卷积神经网络(GCN)的数学原理详解——谱图理论和傅立叶变换初探_哔哩哔哩_bilibili
3.5 GraphSAGE
3.5.1 GraphSAGE和GCN的区别
GraphSAGE和GCN主要的区别在于:
GraphSAGE对计算图进行采样,多了一步sampling step (即不把整张图作为输入)
GraphSAGE先将邻居节点 进行聚合(相当于message)
随后将聚合的节点以及自身节点 投入到全连接层以及激活函数(相当于Aggregation)
最后对每个节点进行归一化
Note :GraphSAGE对邻节点采样的数量是固定的,如果某个节点的邻居节点不够则重复采样直到满足设定采样数量,超过则随机下采样。
3.5.2 GraphSAGE模型
GraphSAGE模型为:
h v ( l ) = σ ( W ( l ) ⋅ CONCAT ( h v ( l − 1 ) , AGG ( { h u ( l − 1 ) , ∀ u ∈ N ( 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) h v ( l ) = σ ( W ( l ) ⋅ CONCAT ( h v ( l − 1 ) , AGG ( { h u ( l − 1 ) , ∀ u ∈ N ( v ) } ) ) )
GraphSAGE原论文提供了四种AGG函数:
A G G = ∑ u ∈ N ( v ) h u ( l − 1 ) ∣ N ( v ) ∣ AGG =\sum_{u \in N(v)} \frac{\mathbf{h}_{u}^{(l-1)}}{|N(v)|} A GG = u ∈ N ( v ) ∑ ∣ N ( v ) ∣ h u ( l − 1 )
A G G = Max ( { MLP ( h u ( l − 1 ) ) , ∀ u ∈ N ( v ) } ) \mathrm{AGG}=\operatorname{Max}\left(\left\{\operatorname{MLP}\left(\mathbf{h}_{u}^{(l-1)}\right), \forall u \in N(v)\right\}\right) AGG = Max ( { MLP ( h u ( l − 1 ) ) , ∀ u ∈ N ( v ) } )
A G G = LSTM ( [ h u ( l − 1 ) , ∀ u ∈ π ( N ( v ) ) ] ) \mathrm{AGG}=\operatorname{LSTM}\left(\left[\mathbf{h}_{u}^{(l-1)}, \forall u \in \pi(N(v))\right]\right) AGG = LSTM ( [ h u ( l − 1 ) , ∀ u ∈ π ( N ( v )) ] )
h v k ← σ ( W ⋅ MEAN ( { h v k − 1 } ∪ { h u k − 1 , ∀ u ∈ N ( 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. h v k ← σ ( W ⋅ MEAN ( { h v k − 1 } ∪ { h u k − 1 , ∀ u ∈ N ( v ) } )
Note :GraphSAGE和GCN的区别
GraphSAGE取AGG为GCN时,是GCN的局部谱域的粗略线性近似 ,而不是真正的GCN。
GCN是将自身以及邻居节点 进行了对称归一化 ,而GraphSAGE-GCN只将采样到的邻居节点以及自身节点 进行平均处理。
GraphSAGE算法中采用了minibatch ,不将全图输入,而是随机选取一些点输入,随后对这些点进行采样 。
GraphSAGE算法最后一步采样了L2标准化。
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)
对于顶点i i i ,逐个计算它的邻居和它自己之间的相似系数
e i j = a ( W h ⃗ i , W h ⃗ j ) e_{i j} = a\left(\mathbf{W} \vec{h}_{i}, \mathbf{W} \vec{h}_{j}\right) e ij = a ( W h i , W h j )
其中a ( ⋅ , ⋅ ) a(\cdot,\cdot) a ( ⋅ , ⋅ ) 是一个映射,e i j e_{ij} e ij 是一个实数。
对注意力系数进行归一化:
α i j = softmax j ( e i j ) = exp ( e i j ) ∑ k ∈ N i exp ( e i k ) \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)} α ij = softmax j ( e ij ) = ∑ k ∈ N i exp ( e ik ) exp ( e ij )
原论文中还使用了一个LeakyReLU \operatorname{LeakyReLU} LeakyReLU :
α i j = exp ( LeakyReLU ( a → T [ W h ⃗ i ∥ W h ⃗ j ] ) ) ∑ k ∈ N i exp ( LeakyReLU ( a → T [ W h ⃗ i ∥ W h ⃗ k ] ) ) \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)} α ij = ∑ k ∈ N i exp ( LeakyReLU ( a T [ W h i ∥ W h k ] ) ) exp ( LeakyReLU ( a T [ W h i ∥ W h j ] ) )
3.6.2 加权求和(aggregation)
对得到的注意力系数进行加权求和:
h ⃗ i ′ = σ ( ∑ j ∈ N i α i j W h ⃗ j ) \vec{h}_{i}^{\prime}=\sigma\left(\sum_{j \in \mathcal{N}_{i}} \alpha_{i j} \mathbf{W} \vec{h}_{j}\right) h i ′ = σ ⎝ ⎛ j ∈ N i ∑ α ij W h j ⎠ ⎞
为了让模型更佳,利用m u t i − h e a d muti-head m u t i − h e a d (多头注意力机制)进行增强:
h ⃗ i ′ = ∥ k = 1 K σ ( ∑ j ∈ N i α i j k W k h ⃗ j ) \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) h i ′ = ∥ k = 1 K σ ⎝ ⎛ j ∈ N i ∑ α ij k W k h j ⎠ ⎞
即:
h ⃗ i ′ = σ ( 1 K ∑ k = 1 K ∑ j ∈ N i α i j k W k h ⃗ j ) \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) h i ′ = σ ⎝ ⎛ K 1 k = 1 ∑ K j ∈ N i ∑ α ij k W k h j ⎠ ⎞
多头注意力机制示意图:
4 GNN模型整体框架
4.1 实际应用中的GNN网络层
在实际应用中,GNN网络层和许多深度学习模型可以相联系,可以加入BatchNorm,Dropout,Activation,Attention等。
4.1.1 BatchNorm
目标:为了使得训练数值稳定
想法:对数据进行规范化
4.1.2 Dropout
目标:防止模型过拟合
想法:在训练过程中 ,随机丢掉一些信息
4.2 多层GNN网络
如何构建一个GNN?
标准做法:堆叠GNN网络层
输入:原始的特征
输出:Node Embeddings
4.2.1 过平滑问题(over-smoothing)
堆叠过多的GNN网络存在问题过平滑问题
过平滑问题 :所有节点因为信息的过度共享,导致所有节点收敛到相同的Embeddings
过平滑问题发生的原因:GNN的感受野,通过太多层,一个节点可以看到全图的信息。
4.2.2 如何避免过平滑问题
做法一:小心添加GNN层(减少GNN层)
Step1:分析问题GNN所需要的感受野范围
Step2:设置稍微比所需感受野稍深的GNN网络
问题:如何使得浅层的GNN网络更有效果?
若我们需要解决的实际问题中无法避免需要深层的GNN网络。
做法二:GNN网络层使用Skip-connection方法
过平滑问题的原因:Node Embeddings在前面的GNN层已经可以区分开了,而在后面的GNN层,使得Node共享了几乎全图的信息,导致收敛到同一个值。
方法:通过Skip-connection增加前面的GNN层对最后Node Embeddings的影响。
4.2.3 浅层GNN网络的增强
方法1:对每层GNN网络进行增强
在以往的案例,每个transformation或者aggregation函数都只是包含了一层线性层
我们可以把aggregation或者transformation做成一个DNN
4.2.4 深层GNN网络的增强(skip-connection)
想法:通过skip-connection增加模型的复杂度
N种Skip-connection有2 N 2^N 2 N 种可能连接方式
具体做法:在每一个GNN层得到的节点特征输出,加上以前的节点特征,为最终的输出。
其他的做法:直接把每层GNN得到的结果加到最终的输出。
4.3 GNN整体框架
4.3.1 输入处理
在以往的模型,我们假设,输入的图为原始图
这种假设实际中不常用的原因:
特征层面
结构层面
图结构过于稀疏,信息传递效率不高
图结构过于密集,信息传递花费高
图结构过大,训练时间高
解决方法:
图节点特征
图结构
过于稀疏,增加虚拟边和节点
过于密集,做信息传递时候对邻居进行采样
图太大,对图进行采样得到子图再训练
4.3.1.1 特征增广(Feature Augmentation)
情况一:输入图没有任何节点特征
这种情况很常见,只有一个邻接矩阵信息
常见的做法:
(a)对每个节点都给相同的值
(b)对每个节点进行one-hot编码(缺点是无法用于inductive任务)
情况二:图中特定的结构无法被GNN识别
例子:自环图
做法:利用自环图的信息,进行节点特征增广
Clustering coefficient
PageRank
Centrality
4.3.1.2 增加虚拟边/节点(Add Virtual Nodes/Edges)
目标:处理过于稀疏的图
方法1:增加虚拟边
常用方法:通过虚拟边增加二阶连接的邻居
想法:通过A + A 2 A+A^2 A + A 2 替代邻接矩阵A A A
方法2:增加虚拟节点
这个虚拟节点会连接一整张图
假设图是稀疏的,两个节点最短路径也要经过十个节点
增加虚拟节点后,两个节点可以通过虚拟节点连接
优点:提高了信息传递的效率。
4.3.1.3 邻居节点采样
以往的做法:
新想法:对邻居节点进行随机采样,应用于信息传递,解决图过于密集问题
例子:如下图,对A的邻居节点D丢弃,只选择邻居C和B。
优点:能大幅度减少信息传递的时间复杂度
在实际应用中较为常用
4.3.2 数据集分割
本小节探究如何分割训练/验证/测试集。
4.3.2.1 传统数据和Graph数据的不同之处
图像分类:每个数据点都是一个图,每个数据点都是独立的。
节点分类:每个数据点都是一个节点,但每个节点不是独立的。
4.3.2.2 Transductive和Inductive设置
Transductive setting:输入的图包含了整个数据集的划分(包括训练集/验证集/测试集)
我们只划分labels
在训练阶段,我们利用整张图的信息 计算Embeddings,训练时候只用划分的训练labels,对应图中的1和2labels。
在验证阶段,我们利用整张图的信息 计算Embeddings,验证时候只用划分的验证labels,对应图中的3和4labels。
Inductive setting:我们把图中某些egdes丢失,形成多个子图 ,和GraphSAGE中的minibacth操作一样。
4.3.2.3 Transductive和Inductive的区别
Transductive setting:训练/验证/测试集都在同一张图
数据集只包含一张图
整张图看作数据集的划分,而我们只做标签的划分
只能用于节点/边预测任务
Inductive setting:训练/验证/测试集在不同的图
数据集包含很多张图(只有一张图可以通过minibatch划分子图)
划分后,每个阶段只能看到当前的图,可用于预测未看过的图
可以应用于节点/边/图预测任务
4.3.2.4 节点/边/图预测任务例子
1、节点分类
Transductive设置
在整张图上做标签划分,计算Embeddins利用整张图的信息。
Inductive设置
2、图分类
只有Inductive setting可用于图分类
3、链接预测
链接预测的目标:预测缺失的边
设置链接预测是有技巧的
链接预测是一个无监督/半监督的任务。我们需要自己创建标签。
具体而言,我们需要隐藏某些边然后让GNN预测这些边
对于链接预测,我们将边分为两种类型
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:链接预测设置是复杂且有技巧的,可以在不同的论文上看到不同的设置。
4.3.3 下游任务(Prediction Heads)
4.3.3.1 节点层面预测任务
节点层面预测:可以直接使用训练得到的Node Embeddings
4.3.3.2 链接预测任务
边层面预测任务:利用节点对做预测任务
假设我们的任务为k分类任务
计算y ^ u v = Head e d g e ( h u ( L ) , h v ( L ) ) \widehat{\boldsymbol{y}}_{u v}=\operatorname{Head}_{\mathrm{edg} e}\left(\mathbf{h}_{u}^{(L)}, \mathbf{h}_{v}^{(L)}\right) y uv = Head edg e ( h u ( L ) , h v ( L ) ) ,其中Head e d g e \operatorname{Head}_{\mathrm{edg} e} Head edg e 可以如下设置
Concatenation+Linear:y ^ u v = Linear ( Concat ( h u ( L ) , h v ( L ) ) ) \widehat{\boldsymbol{y}}_{\boldsymbol{u} v}=\operatorname{Linear}\left(\text { Concat }\left(\mathbf{h}_{u}^{(L)}, \mathbf{h}_{v}^{(L)}\right)\right) y u v = Linear ( Concat ( h u ( L ) , h v ( L ) ) )
Dot product
y ^ u v = ( h u ( L ) ) T h v ( L ) \widehat{\boldsymbol{y}}_{u v}=\left(\mathbf{h}_{u}^{(L)}\right)^{T} \mathbf{h}_{v}^{(L)} y uv = ( h u ( L ) ) T h v ( L ) 应用于1-way prediction(即预测是否存在边)
应用到k-way prediction,需要做些改变,类似多头注意力机制设置参数:W ( 1 ) , … , W ( k ) \mathbf{W}^{(1)}, \ldots, \mathbf{W}^{(k)} W ( 1 ) , … , W ( k )
y ^ u v ( 1 ) = ( h u ( L ) ) T W ( 1 ) h v ( L ) … y ^ u v ( k ) = ( h u ( L ) ) T W ( k ) h v ( L ) y ^ u v = Concat ( y ^ u v ( 1 ) , … , y ^ u v ( k ) ) ∈ R k \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} y uv ( 1 ) = ( h u ( L ) ) T W ( 1 ) h v ( L ) … y uv ( k ) = ( h u ( L ) ) T W ( k ) h v ( L ) y uv = Concat ( y uv ( 1 ) , … , y uv ( k ) ) ∈ R k
4.3.3.3 图预测任务
图层面预测任务:做图预测任务时,用到所有的node embeddings
假设我们的任务是k-way prediction,目标是设置Head graph \operatorname{Head}_{\operatorname{graph}} Head graph ,计算y ^ G = Head graph ( { h v ( L ) ∈ R d , ∀ v ∈ G } ) \widehat{\boldsymbol{y}}_{G}=\operatorname{Head}_{\operatorname{graph}}\left(\left\{\mathbf{h}_{v}^{(L)} \in \mathbb{R}^{d}, \forall v \in G\right\}\right) y G = Head graph ( { h v ( L ) ∈ R d , ∀ v ∈ G } ) ,Head graph \operatorname{Head}_{\operatorname{graph}} Head graph 可以如下设置:
Global mean pooling:y ^ G = Mean ( { h v ( L ) ∈ R d , ∀ v ∈ G } ) \widehat{\boldsymbol{y}}_{G}=\operatorname{Mean}\left(\left\{\mathbf{h}_{v}^{(L)} \in \mathbb{R}^{d}, \forall v \in G\right\}\right) y G = Mean ( { h v ( L ) ∈ R d , ∀ v ∈ G } )
Global max pooling:y ^ G = Max ( { h v ( L ) ∈ R d , ∀ v ∈ G } ) \widehat{\boldsymbol{y}}_{G}=\operatorname{Max}\left(\left\{\mathbf{h}_{v}^{(L)} \in \mathbb{R}^{d}, \forall v \in G\right\}\right) y G = Max ( { h v ( L ) ∈ R d , ∀ v ∈ G } )
Global sum pooling:y ^ G = Sum ( { h v ( L ) ∈ R d , ∀ v ∈ G } ) \widehat{\boldsymbol{y}}_{G}=\operatorname{Sum}\left(\left\{\mathbf{h}_{v}^{(L)} \in \mathbb{R}^{d}, \forall v \in G\right\}\right) y G = Sum ( { h v ( L ) ∈ R d , ∀ v ∈ G } )
如上设置存在一些问题,Global pooling会丢失某些信息,如计算G 1 G_1 G 1 ,G 2 G_2 G 2 ,无法区分以下情况:
G 1 : y ^ G = Sum ( { − 1 , − 2 , 0 , 1 , 2 } ) = 0 G_{1}: \hat{y}_{G}=\operatorname{Sum}(\{-1,-2,0,1,2\})=0 G 1 : y ^ G = Sum ({ − 1 , − 2 , 0 , 1 , 2 }) = 0
G 2 : y ^ G = Sum ( { − 10 , − 20 , 0 , 10 , 20 } ) = 0 G_{2}: \hat{y}_{G}=\operatorname{Sum}(\{-10,-20,0,10,20\})=0 G 2 : y ^ G = Sum ({ − 10 , − 20 , 0 , 10 , 20 }) = 0
为了解决上述问题,提出一个分层Pooling方法(Hierarchical Global Pooling)
我们将一个图中的node进行分层pooling
G 1 node embeddings: { − 1 , − 2 , 0 , 1 , 2 } G_{1} \text { node embeddings: }\{-1,-2,0,1,2\} G 1 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 1: y ^ a = ReLU ( Sum ({ − 1 , − 2 })) = 0 , y ^ b = ReLU ( Sum ({ 0 , 1 , 2 })) = 3
Round 2: y ^ G = ReLU ( Sum ( { y a , y b } ) ) = 3 \text { Round 2: } \hat{y}_{G}=\operatorname{ReLU}\left(\operatorname{Sum}\left(\left\{y_{a}, y_{b}\right\}\right)\right)=3 Round 2: y ^ G = ReLU ( Sum ( { y a , y b } ) ) = 3
G 2 node embeddings: { − 10 , − 20 , 0 , 10 , 20 } G_{2} \text { node embeddings: }\{-10,-20,0,10,20\} G 2 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 1: y ^ a = ReLU ( Sum ({ − 10 , − 20 })) = 0 , y ^ b = ReLU ( Sum ({ 0 , 10 , 20 })) = 30
Round 2: y ^ G = ReLU ( Sum ( { y a , y b } ) ) = 30 \text { Round 2: } \hat{y}_{G}=\operatorname{ReLU}\left(\operatorname{Sum}\left(\left\{y_{a}, y_{b}\right\}\right)\right)=30 Round 2: y ^ G = ReLU ( Sum ( { y a , y b } ) ) = 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,作为新的图投入到下层训练