赞
踩
第六节主要是对图神经网络做了一个整体上的介绍,本节介绍几种经典的GNN 和设计GNN的基本思路。具体内容为
节点嵌入的计算包括消息传递和聚合两个步骤,消息传递是根据邻域节点的嵌入计算消息,消息聚合是将邻域节点传递的消息与自身的嵌入结合到一起计算新的嵌入。消息计算可以表示为
m
u
(
l
)
=
MSG
(
l
)
(
h
u
(
l
−
1
)
)
,
∀
u
∈
{
N
(
v
)
∪
v
}
\mathbf m_u^{(l)} = \text{MSG}^{(l)} (\mathbf h_u^{(l-1)}), \, \forall u \in \{N(v) \cup v \}
mu(l)=MSG(l)(hu(l−1)),∀u∈{N(v)∪v}
例如线性连接 (Linear layer)为
m
u
(
l
)
=
W
(
l
)
h
u
(
l
−
1
)
,
∀
u
∈
N
(
v
)
m
v
(
l
)
=
B
(
l
)
h
v
(
l
−
1
)
\mathbf m_u^{(l)} =\mathbf W^{(l)} \mathbf h_u^{(l-1)}, \quad \forall u \in N(v) \\ \mathbf m_v^{(l)} =\mathbf B^{(l)} \mathbf h_v^{(l-1)} \quad
mu(l)=W(l)hu(l−1),∀u∈N(v)mv(l)=B(l)hv(l−1)
消息聚合可以表示为
h
v
(
l
)
=
AGG
(
l
)
(
{
m
u
(
l
)
,
∀
u
∈
N
(
v
)
}
,
m
v
(
l
)
)
\mathbf h_v^{(l)} = \text{AGG}^{(l)}(\{ \mathbf m_u^{(l)}, \forall u \in N(v) \}, \mathbf m_v^{(l)})
hv(l)=AGG(l)({mu(l),∀u∈N(v)},mv(l))
GCN 是一种基于空间的图卷积网络,消息传递和聚合比较简单
$$
\begin{align}
& \text{Message: } \mathbf m_u^{(l)} = \frac {1}{|N(v)|} \mathbf W^{(l)} \mathbf h_u^{(l)} \
& \text{Agrregation: } \mathbf h_v^{(l)} = \sigma (\sum_{u \in N(v)} \mathbf m_u^{(l)}) \
& \text{Together: } \mathbf h_v^{(l)} = \sigma (\sum_{u \in N(v)} \frac {1}{|N(v)|} \mathbf W^{(l)} \mathbf h_u^{(l)})
\end{align}
$$
GraphSAGE 中介绍了三种不同的聚合方式,其计算公式如下
h
u
(
l
)
=
σ
(
W
(
l
)
⋅
CONCAT
(
h
v
(
l
−
1
)
,
AGG
(
{
h
u
(
l
−
1
)
,
∀
u
∈
N
(
v
)
}
)
)
\mathbf h_u^{(l)} = \sigma \left(\mathbf W^{(l)} \cdot \text{CONCAT} \left (\mathbf h_v^{(l-1)}, \text{AGG}(\{\mathbf h_u^{(l-1)}, \forall u \in N(v)\} \right) \right)
hu(l)=σ(W(l)⋅CONCAT(hv(l−1),AGG({hu(l−1),∀u∈N(v)}))
消息传递的计算实际是在函数 AGG 中完成的,GraphSAGE 可以分解为两步
聚合函数有三种选择
Mean: 计算邻域节点的加权平均
AGG
=
∑
u
∈
N
(
v
)
h
u
(
l
−
1
)
∣
N
(
v
)
∣
\text{AGG} = \sum_{u \in N(v)} \frac {\mathbf h_u^{(l-1)}}{|N(v)|}
AGG=u∈N(v)∑∣N(v)∣hu(l−1)
Pool: 对邻域节点嵌入向量做变换后,使用平均池化或最大池化
AGG
=
Mean
(
MLP
(
h
u
(
l
−
1
)
)
,
∀
u
∈
N
(
v
)
)
\text{AGG} = \text{Mean}\left(\text{MLP}(\mathbf h_u^{(l-1)}), \forall u \in N(v) \right)
AGG=Mean(MLP(hu(l−1)),∀u∈N(v))
LSTM: 将节点顺序打乱后,再应用 LSTM
AGG
=
LSTM
(
[
h
u
(
l
−
1
)
,
∀
u
∈
π
(
N
(
v
)
)
]
)
\text{AGG} = \text{LSTM} ([\mathbf h_u^{(l-1)}, \forall u \in \pi(N(v))])
AGG=LSTM([hu(l−1),∀u∈π(N(v))])
GraphSAGE 还使用了 L2 归一化,对于节点的嵌入
h
v
(
l
)
=
h
v
(
l
)
∥
h
v
(
l
)
∥
2
\mathbf h_v^{(l)} = \frac {\mathbf h_v{(l)}}{\|\mathbf h_v{(l)} \|_2}
hv(l)=∥hv(l)∥2hv(l)
归一化保证节点的嵌入向量都在同一尺度,在某些情况下可能会有更好的效果。
GAT在消息聚合时给每个节点的消息增加了注意力权重,计算公式为
h
v
(
l
)
=
σ
(
∑
u
∈
N
(
v
)
α
v
u
W
(
l
)
h
u
(
l
−
1
)
)
\mathbf h_v^{(l)} = \sigma \left( \sum_{u \in N(v)} \alpha_{vu} \mathbf W^{(l)} \mathbf h_u^{(l-1)} \right)
hv(l)=σ⎝⎛u∈N(v)∑αvuW(l)hu(l−1)⎠⎞
在 GCN 和 GraphSAGE 中,
α
v
u
=
1
N
(
v
)
\alpha_{vu} = \frac {1}{N(v)}
αvu=N(v)1, 这表示领域
N
(
v
)
N(v)
N(v) 中每个节点对于节点
v
v
v 都是同等重要的。在 GAT 中,
α
v
u
\alpha_{vu}
αvu 是可学习的参数。用
e
v
u
e_{vu}
evu 表示节点
u
u
u 传向节点
v
v
v 消息的重要性,
a
a
a 表示重要性计算函数
e
v
u
=
a
(
W
(
l
)
h
v
(
l
−
1
)
,
W
(
l
)
h
u
(
l
−
1
)
)
e_{vu} = a(\mathbf W^{(l)} \mathbf h_v^{(l-1)}, \mathbf W^{(l)} \mathbf h_u^{(l-1)})
evu=a(W(l)hv(l−1),W(l)hu(l−1))
在原论文中
e
v
u
=
LeakyReLU
(
a
T
⋅
CONCAT
(
h
v
(
l
−
1
)
,
W
(
l
)
h
u
(
l
−
1
)
)
)
e_{vu} = \text{LeakyReLU} \left(\mathbf a^T \cdot \text{CONCAT}( \mathbf h_v^{(l-1)}, \mathbf W^{(l)} \mathbf h_u^{(l-1)}) \right)
evu=LeakyReLU(aT⋅CONCAT(hv(l−1),W(l)hu(l−1)))
其中
a
\mathbf a
a 可学习参数。再使用 Softmax 对边重要性作归一化
α
v
u
=
exp
(
e
v
u
)
∑
k
∈
N
(
v
)
exp
(
e
v
k
)
\alpha_{vu} = \frac {\exp (e_{vu})} {\sum_{k \in N(v)} \exp(e_{vk})}
αvu=∑k∈N(v)exp(evk)exp(evu)
GAT 还可以增加多个注意模块 (Multi-head attention),这样对网络的稳定性有一定提升。具体做法就是对每条边的消息计算多个注意力,然后将这些消息聚合起来得到最终的嵌入向量,公式为
h
v
(
l
)
[
1
]
=
σ
(
∑
u
∈
N
(
v
)
α
v
u
1
W
(
l
)
h
u
(
l
−
1
)
)
h
v
(
l
)
[
2
]
=
σ
(
∑
u
∈
N
(
v
)
α
v
u
2
W
(
l
)
h
u
(
l
−
1
)
)
h
v
(
l
)
[
3
]
=
σ
(
∑
u
∈
N
(
v
)
α
v
u
3
W
(
l
)
h
u
(
l
−
1
)
)
\mathbf h_v^{(l)}[1] = \sigma \left( \sum_{u \in N(v)} \alpha_{vu}^1 \mathbf W^{(l)} \mathbf h_u^{(l-1)} \right) \\ \mathbf h_v^{(l)}[2] = \sigma \left( \sum_{u \in N(v)} \alpha_{vu}^2 \mathbf W^{(l)} \mathbf h_u^{(l-1)} \right) \\ \mathbf h_v^{(l)}[3] = \sigma \left( \sum_{u \in N(v)} \alpha_{vu}^3 \mathbf W^{(l)} \mathbf h_u^{(l-1)} \right) \\
hv(l)[1]=σ⎝⎛u∈N(v)∑αvu1W(l)hu(l−1)⎠⎞hv(l)[2]=σ⎝⎛u∈N(v)∑αvu2W(l)hu(l−1)⎠⎞hv(l)[3]=σ⎝⎛u∈N(v)∑αvu3W(l)hu(l−1)⎠⎞
聚合方式使用 Concat 、求和或者其他方式
h
v
(
l
)
=
AGG
(
h
v
(
l
)
[
1
]
,
h
v
(
l
)
[
2
]
,
h
v
(
l
)
[
3
]
)
\mathbf h_v^{(l)} = \text{AGG}(\mathbf h_v^{(l)}[1], \mathbf h_v^{(l)}[2], \mathbf h_v^{(l)}[3])
hv(l)=AGG(hv(l)[1],hv(l)[2],hv(l)[3])
GAT 的优点有:
与 CNN 中类似,GNN 中也可以使用 Normalization, Dropout, Activation 等模块 ,常用的 GNN 包含的模块如下
Batch Normalization 计算如下
Dropout 作用于消息计算之后,以线性连接为例
激活函数与其他神经网络一样。授课课题组有一个方便的工具 GraphGym
构建多层 GNN 的最简单的方式是将多个单层 GNN 网络按顺序堆叠起来,第1层的输入嵌入为节点特征 h v ( 0 ) = x v \mathbf h_v^{(0)} = \mathbf x_v hv(0)=xv ,依次使用 GNN 计算节点嵌入向量,最后一层输出所需的节点嵌入。
与CNN 等深度神经网络不同的是,多层 GNN 会遇到一个特殊问题——过平滑 (Over smoothing) 。当 GNN 层数太多时,每个节点的嵌入向量会逐渐收敛至同一个值,最后输出的节点嵌入不再能够区分不同节点。过平滑的出现与 GNN 的计算方式密切相关。 目前GNN 一般使用消息传递和聚合的方式来更新节点嵌入,而消息聚合的结果取决于邻域节点,也就是该节点的感受野。通过多层 GNN,节点的感受野不断扩大,获得的信息也从局部扩展到图的全局,但是与其他节点感受野的重合度也越来越大。如下图所示,经过三层 GNN 后,节点的邻域已经扩展到 3跳,但几乎囊括了图中所有节点,不同节点的邻域的重合度也变得非常大,计算得到的嵌入会变得非常接近,最终造成过平滑问题。概括起来就是:堆叠多层 GNN 网络 → 节点之间的感受野高度重合 → 节点嵌入变得十分接近 → 造成过平滑问题。
那么该如何解决过平滑问题呢?可以从两方面着手:一是使用浅层 GNN;二是借鉴 Resnet 的思想,增加跳跃连接 (Skip connections).
在设计 GNN 时,我们需要不能盲目的增加网络的深度,更深的 GNN 不一定有更好的效果。GNN 的层数可以通过分析节点需要的最大感受野来确定(例如图的直径来表示节点最大感受野),网络的层数往往比需要的感受野稍微大一点即可。虽然浅层 GNN 可以避免过平滑问题,那么该如何提高浅层 GNN 的表达力呢?解决方案有两种:
观察到深层 GNN 可能导致过平滑问题,浅层 GNN 的节点嵌入的区分度可能更大,所以我们可以将浅层网络的嵌入通过跳跃连接,与深层网络的嵌入相加,以保留节点的区分度。
比如在 GCN 中,原始的消息聚合方式为 $ \mathbf h_v^{(l)} = \sigma (\sum_{u \in N(v)} \frac {1}{|N(v)|} \mathbf W^{(l)} \mathbf h_u^{(l)})$ ,增加跳跃连接后
h
v
(
l
)
=
σ
(
∑
u
∈
N
(
v
)
1
∣
N
(
v
)
∣
W
(
l
)
h
u
(
l
)
+
h
v
(
l
)
)
\mathbf h_v^{(l)} = \sigma (\sum_{u \in N(v)} \frac {1}{|N(v)|} \mathbf W^{(l)} \mathbf h_u^{(l)} + \mathbf h_v^{(l)})
hv(l)=σ(u∈N(v)∑∣N(v)∣1W(l)hu(l)+hv(l))
疑问:与上一节讲的公式
h
v
(
l
)
=
σ
(
∑
u
∈
N
(
v
)
1
∣
N
(
v
)
∣
W
(
l
)
h
u
(
l
)
+
B
(
l
)
h
v
(
l
)
)
\mathbf h_v^{(l)} = \sigma (\sum_{u \in N(v)} \frac {1}{|N(v)|} \mathbf W^{(l)} \mathbf h_u^{(l)} + \mathbf B^{(l)}\mathbf h_v^{(l)})
hv(l)=σ(∑u∈N(v)∣N(v)∣1W(l)hu(l)+B(l)hv(l)) 很相像,而且与GraphSAGE 中的聚合方式也比较像,这种跳跃连接真的有很大作用吗?
在之间的内容中,输入到 GNN 中计算的图和图的原始数据是一样的,但是实际中,计算图和原始图可能存在不同。我们可能需要改变图的节点特征和图的结构。
当节点没有任何特征是,可以使用常数特征或者独热编码 (one-hot )作为节点特征,二者的优缺点如下
当然这两种特征很难区分图中的某些结构,具体例子参看课件。除此之外,还可使用第二讲中介绍的特征:Clustering coefficient, PageRank, Centerity 等等。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。