图神经网络实践
Graph Neural Networks in Practice
Applications and Loss Functions
GNN 常用于以下三种任务:节点分类(如社交网络预测)、图分类(如分子图结构的属性预测)和关系预测(如内容在线平台推荐)。
GNNs for Node Classification
将 GNN 应用于节点分类任务的标准方法是以完全监督的方式训练 GNN,其中使用 softmax 分类函数和负对数似然损失来定义损失:
L
=
∑
u
∈
V
train
−
log
(
softmax
(
z
u
,
y
u
)
)
softmax
(
z
u
,
y
u
)
=
∑
i
=
1
c
y
u
[
i
]
e
z
u
⊤
w
i
∑
j
=
1
c
e
z
u
⊤
w
j
\mathcal{L}=\sum_{u\in \mathcal{V}_\text{train}}-\log(\text{softmax}(\mathbf{z}_u,\mathbf{y}_u))\\ \text{softmax}(\mathbf{z}_u,\mathbf{y}_u)=\sum_{i=1}^c\mathbf{y}_u[i]\frac{e^{\mathbf{z}_u\top\mathbf{w}_i}}{\sum_{j=1}^ce^{\mathbf{z}_u\top\mathbf{w}_j}}
L=u∈Vtrain∑−log(softmax(zu,yu))softmax(zu,yu)=i=1∑cyu[i]∑j=1cezu⊤wjezu⊤wi
Supervised, semi-supervised, transductive, and inductive
可以将图神经网络中的节点分成三类:
- 训练节点。这些节点包含在 GNN 消息传递过程中,且被用作损失函数计算。
- 传导(transductive )测试节点。未被标记且不用作损失函数计算,但仍参与 GNN 消息传递操作。
- 归纳(inductive )测试节点。在训练期间不会用作消息传递操作和损失函数计算。
术语“半监督“适用于在传导测试节点上测试 GNN 的情况,因为在这种情况下,GNN 在训练期间观察测试节点(但不观察其标签)。术语归纳节点分类用于区分测试节点及其所有关联边在训练期间完全未被观察到的设置。
GNNs for Graph Classification
图分类典型任务是基于分子图预测分子性质,在这种情况下,采用以下形式的平方差损失计算误差:
L
=
∑
G
i
∈
T
∣
∣
M
L
P
(
z
G
i
)
−
y
G
i
∣
∣
2
2
\mathcal{L}=\sum_{\mathcal{G}_i \in \mathcal{T}}||\mathbf{MLP}(\mathbf{z}_{\mathcal{G}_i})-y_{\mathcal{G}_i}||_2^2
L=Gi∈T∑∣∣MLP(zGi)−yGi∣∣22
其中 MLP 是具有单变量输出的密集连接神经网络。
GNNs for Relation Prediction
推荐系统,知识图谱补全等关系预测任务通常采用成对节点嵌入损失函数。
Pre-training GNNs
预训练技术已成为深度学习的标准实践。 Deep Graph Infomax (DGI) 涉及最大化节点嵌入
z
u
\mathbf{z}_u
zu 和图嵌入
z
G
\mathbf{z}_\mathcal{G}
zG 之间的互信息。形式上,这种方法优化了以下损失:
L
=
∑
u
∈
V
train
E
G
log
(
D
(
z
u
,
z
G
)
)
+
γ
E
G
~
log
(
1
−
D
(
z
~
u
,
z
G
)
)
\mathcal{L}=\sum_{u\in \mathcal{V}_\text{train}} \mathbb{E}_\mathcal{G} \log(D(\mathbf{z}_u, \mathbf{z}_\mathcal{G})) + \gamma \mathbb{E}_{\tilde{\mathcal{G}}} \log(1-D( \tilde{\mathbf{z}}_u, \mathbf{z}_\mathcal{G}))
L=u∈Vtrain∑EGlog(D(zu,zG))+γEG~log(1−D(z~u,zG))
D
D
D 表示鉴别器函数,这是一个经过训练来预测节点嵌入是否来自真实图
G
\mathcal{G}
G 还是损坏版本
G
~
\tilde{\mathcal{G}}
G~ 的神经网络。通常,通过以某种随机方式修改节点特征、邻接矩阵或两者来损坏图。
Efficiency Concerns and Node Sampling
Graph-level Implementations
为了最大限度地减少运行消息传递所需的数学运算数量,最有效的策略是使用 GNN 方程的图级实现。其关键思想是基于稀疏矩阵乘法实现消息传递操作。例如,基本 GNN 的图级方程由下式给出:
H
(
t
)
=
σ
(
A
H
(
k
−
1
)
W
neigh
(
k
)
+
H
(
k
−
1
)
W
self
(
k
)
)
\mathbf{H}^{(t)}=\sigma \left(\mathbf{A}\mathbf{H}^{(k-1)} \mathbf{W}_{\text{neigh}}^{(k)}+ \mathbf{H}^{(k-1)} \mathbf{W}_{\text{self}}^{(k)} \right)
H(t)=σ(AH(k−1)Wneigh(k)+H(k−1)Wself(k))
其中
H
(
t
)
H^{(t)}
H(t) 是一个矩阵,包含图中所有节点的 k 层嵌入。这种方法的局限性在于,它需要同时对整个图和所有节点特征进行操作,由于内存限制,这可能不可行。此外,使用图级方程本质上将梯度下降限制为全批量(而不是小批量)梯度下降。
Subsampling and Mini-Batching
为了限制 GNN 的内存占用并促进小批量训练,可以在消息传递期间使用节点的子集。挑战在于我们不能简单地在图中的节点子集上运行消息传递而不丢失信息,在删除节点时也会删除和节点相连的边。为了克服这个问题,研究者设计了对节点邻居进行二次采样的策略,基本思想是首先为批次选择一组目标节点,然后递归地对这些节点的邻居进行采样,以确保维持图的连通性。
Parameter Sharing and Regularization
正则化是任何机器学习模型的关键组成部分,下面介绍一些特定于 GNN 设置的正则化方法。
Parameter Sharing Across Layers. 具有多层消息传递的 GNN 中经常采用的一种策略是参数共享。核心思想是在 GNN 中的所有 AGGREGATE 和 UPDATE 函数中使用相同的参数。一般来说,这种方法在六层以上的 GNN 中最有效,并且通常与门控更新函数结合使用。
Edge Dropout. 另一种 GNN 特定策略称为边缘丢失。在这种正则化策略中,我们在训练期间随机删除(或屏蔽)邻接矩阵中的边缘,直觉认为这将使 GNN 不易过度拟合,并且对邻接矩阵中的噪声更加鲁棒。这种方法在 GNN 知识图谱中的应用中特别成功,并且它是原始图注意网络 (GAT) 工作中使用的一项基本技术。另请注意,邻域二次采样方法会导致这种正则化的副作用,使其成为大规模 GNN 应用中非常常见的策略。
Reference: Hamilton W L. Graph representation learning[M]. Morgan & Claypool Publishers, 2020.