Graph Neural Network (GNN)
图神经网络(GNN)通过在相邻节点之间传递消息,从节点和边中学习。内容涵盖消息传递、GCN、GAT、实际应用和代码。
图神经网络(GNN)是一种直接在图上运行的神经网络:图由节点和连接节点的边组成,节点和边都可以带有特征。分子(原子和化学键)、社交网络(用户和关注关系)、道路网络(交叉口和路段)、3D 网格以及人体骨架的关节都属于图。图没有固定的网格或顺序,每个节点的邻居数量也各不相同,因此卷积神经网络(CNN)的滑动滤波器和循环神经网络(RNN)的逐步读取方式无法直接应用。GNN 通过消息传递来处理这些特点:每个节点会反复根据邻居的特征向量更新自身特征,从而生成嵌入,同时编码节点自身的属性及其在图中的位置。
消息传递的工作原理#
GNN 层分三步更新每个节点。每个邻居都会发送一条消息,通常是对其特征进行学习得到的变换。节点使用忽略顺序的函数聚合收到的消息,例如求和、求平均或取最大值。然后,节点将聚合结果与自身特征结合,形成新的表示。由于聚合过程忽略顺序,因此结果不受节点编号方式的影响。Justin Gilmer 及其同事于 2017 年将许多 GNN 描述为这一消息传递神经网络框架的实例。最后一层之后,特定任务的头部会读取节点嵌入,用于给节点打标签、预测缺失边或对整个图分类:
每一层都会将节点的视野扩展一跳,因此经过 k 层后,节点的嵌入会受到 k 条边以内所有节点的影响,这些节点构成了图中的感受野。下面的 PyTorch 代码片段构建了一个包含六个节点的路径图,应用三层图卷积层,并使用 Thomas Kipf 和 Max Welling 的 GCN 中的归一化方法,再通过 autograd 列出每一层之后哪些输入节点会影响节点 0:
import torch
from torch import nn
# A path graph 0-1-2-3-4-5 as an adjacency matrix with self-loops
A = torch.eye(6)
for i in range(5):
A[i, i + 1] = A[i + 1, i] = 1
deg = A.sum(dim=1)
A_hat = A / torch.sqrt(deg[:, None] * deg[None, :]) # GCN normalization D^-1/2 (A + I) D^-1/2
torch.manual_seed(0)
x = torch.randn(6, 4, requires_grad=True) # 4 input features per node
layers = [nn.Linear(4, 4) for _ in range(3)]
h = x
for k, layer in enumerate(layers, start=1):
h = torch.tanh(A_hat @ layer(h)) # each node mixes in its neighbors' transformed features
grad = torch.autograd.grad(h[0].sum(), x, retain_graph=True)[0]
print(f"After layer {k}, node 0 depends on nodes {grad.abs().sum(dim=1).nonzero().flatten().tolist()}")它会输出 [0, 1]、[0, 1, 2] 和 [0, 1, 2, 3]:节点 0 的感受野每层恰好扩展一跳。
常见的 GNN 架构#
- GCN:图卷积网络计算 H′ = σ(D̃^(−1/2) Ã D̃^(−1/2) H W),其中 Ã 是带自环的邻接矩阵,D̃ 是其度矩阵:先对每个节点及其邻居进行按度加权的平均,再乘以所有节点共享的权重矩阵 W。
- GraphSAGE:为每个节点采样固定数量的邻居,并学习聚合器,因此可扩展到超大图,也能为训练之后出现的节点生成嵌入。
- GAT:图注意力网络使用学习得到的注意力分数为每个邻居分配权重,而不是使用固定的、基于度的权重。
- GIN:图同构网络对邻居求和并应用 MLP。Keyulu Xu 及其同事证明,这使它区分图的能力与 Weisfeiler-Lehman 测试一样强;该测试代表了标准消息传递方法的上限。
- 图 Transformer:在所有节点之间应用自注意力,并添加根据图结构计算的位置编码。标准的 Transformer 本身就是一个作用于全连接 token 图上的 GNN。
堆叠过多层会导致过平滑:反复求平均会使节点嵌入彼此靠近,直到无法区分。这就是许多 GNN 只使用两三层的原因,原始 GCN 就使用了两层。PyTorch Geometric 和 Deep Graph Library (DGL) 可在稀疏边列表上高效实现这些层。
实际应用#
- 天气预报:Google DeepMind 的 GraphCast 于 2023 年发表于《Science》,它在覆盖全球的多尺度网格上运行消息传递,可在一分钟内生成分辨率为 0.25° 的 10 天预报;在 1,380 个验证目标中的 90% 上,其表现优于最准确的业务化确定性系统。
- 药物发现:2020 年,MIT 研究人员训练了一个有向消息传递网络,根据分子图预测抗菌活性,并用它发现了 halicin。这种化合物在结构上不同于已知抗生素,并在实验室测试中杀死了多种耐药细菌。
- 推荐系统:Pinterest 的 PinSage 从包含 30 亿个 Pin 和看板、180 亿条边的图中学习 Pin 嵌入,训练数据有 75 亿个样本。
- 基于骨架的动作识别:ST-GCN 将身体关节视为节点,在每一帧中用骨骼连接这些节点,并将相邻帧中的同一关节相连,再根据生成的时空图对动作分类。YOLO26姿态估计模型会为每一帧中的每个人返回 17 个 COCO 关键点,这些关节坐标正是构建此类骨架图的基础。










