引言:当深度学习遇到图结构数据
传统的深度学习模型——CNN 擅长处理网格结构(图像),RNN/Transformer 擅长处理序列结构(文本)。但在现实世界中,大量数据以图的形式存在:社交网络、分子结构、知识图谱、推荐系统。图神经网络(Graph Neural Network, GNN)正是为了解决这一挑战而诞生的深度学习分支。
一、图的基本表示
一个图 G = (V, E) 由节点集合 V 和边集合 E 组成。在 GNN 中需要表示三种信息:
- 节点特征 X ∈ R^(N×D):每个节点的 D 维特征向量
- 邻接矩阵 A ∈ R^(N×N):表示节点间的连接关系
- 边特征 E ∈ R^(M×K):每条边的 K 维特征(可选)
二、GNN 核心范式:消息传递
Scarselli 等人于 2005 年提出的 GNN 原型引入了消息传递(Message Passing)机制,所有现代 GNN 都遵循这一范式:
// 消息传递伪代码
for each node v:
1. 聚合邻居消息: m_v = AGGREGATE({h_u | u ∈ N(v)})
2. 更新自身状态: h_v = UPDATE(h_v, m_v)
典型的 AGGREGATE: MEAN, SUM, MAX, ATTENTION
典型的 UPDATE: MLP, GRU, LSTM
三、主流 GNN 架构
3.1 GCN(Graph Convolutional Network)
Kipf & Welling (2016) 提出的 GCN 是 GNN 领域最具影响力的工作之一。GCN 对邻接矩阵进行对称归一化:
H^(l+1) = σ(D̃^(-1/2) Ã D̃^(-1/2) H^(l) W^(l))
其中 Ã = A + I(加自环)
D̃ 是 Ã 的度矩阵
W^(l) 是可学习参数
σ 是激活函数(通常为 ReLU)
3.2 GraphSAGE
Hamilton 等 (2017) 提出的 GraphSAGE 引入了采样和聚合的可扩展策略:
- 归纳学习:能为未见过的节点生成嵌入(非直推式)
- 邻居采样:每个节点只采样固定数量的邻居,控制计算量
- 多种聚合器:Mean、Pooling、LSTM
3.3 GAT(Graph Attention Network)
Veličković 等 (2018) 引入注意力机制到图计算中,让模型学习邻居的重要性权重:
α_ij = softmax_j( LeakyReLU(a^T [Wh_i || Wh_j]) )
h_i' = σ( Σ_{j∈N(i)} α_ij · Wh_j )
其中 a 和 W 是可学习参数
|| 表示拼接操作
3.4 GIN(Graph Isomorphism Network)
Xu 等 (2019) 从理论证明了 GNN 的表达能力上限——GIN 的表达能力等价于 WL(Weisfeiler-Lehman)同构检验。
四、PyG 实战:训练 GCN 分类模型
import torch
from torch_geometric.nn import GCNConv
from torch_geometric.datasets import Cora
import torch.nn.functional as F
# 加载引文网络数据集
dataset = Cora(root='./cora')
data = dataset[0] # 2708节点,7类,1433维特征
class GCN(torch.nn.Module):
def __init__(self, in_channels, hidden, out_channels):
super().__init__()
self.conv1 = GCNConv(in_channels, hidden)
self.conv2 = GCNConv(hidden, out_channels)
def forward(self, x, edge_index):
x = self.conv1(x, edge_index)
x = F.relu(x)
x = F.dropout(x, training=self.training)
x = self.conv2(x, edge_index)
return F.log_softmax(x, dim=1)
model = GCN(dataset.num_features, 16, dataset.num_classes)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)
model.train()
for epoch in range(200):
optimizer.zero_grad()
out = model(data.x, data.edge_index)
loss = F.nll_loss(out[data.train_mask], data.y[data.train_mask])
loss.backward()
optimizer.step()
五、GNN 应用场景
| 领域 | 应用 | 代表工作 |
|---|---|---|
| 化学计算 | 分子性质预测、药物发现 | DGL-LifeSci, SchNet |
| 推荐系统 | 用户-物品二部图建模 | PinSage (Pinterest) |
| 知识图谱 | 实体关系推理 | R-GCN, CompGCN |
| 交通预测 | 路网流量预测 | ST-GCN, DCRNN |
| 代码分析 | 程序依赖图漏洞检测 | CodeGraph, Devign |
六、GNN 的挑战与未来
- 过度平滑(Over-smoothing):深层 GNN 中所有节点嵌入趋于相同,通常超过 3-4 层性能下降
- 可扩展性:全图训练对大图不友好,需要采样策略和分区技术
- 异构图(Heterogeneous Graph):现实世界图通常有多种节点/边类型,需要更复杂的建模
- 与LLM结合:GraphRAG、Spectral-GNN 等方向正在探索图结构与大语言模型的深度融合

发表评论 取消回复