探索非欧几里得空间的数据奥秘,从社交网络到分子结构,解码万物互联的智能核心。
图神经网络(GNN)是一种专门用于处理图结构数据的深度学习模型。与传统神经网络处理网格数据(如图像)或序列数据(如文本)不同,GNN直接在图结构上操作,能够有效捕捉节点(实体)之间通过边(关系)形成的复杂拓扑信息。
其核心思想是通过迭代地聚合邻居节点的信息来更新每个节点的表示,使节点表征不仅能反映自身特征,还能编码其所在图结构的上下文信息。
一个图 G 通常定义为 G = (V, E),其中 V 是节点集合,E 是边集合。
大多数现代 GNN 遵循消息传递范式(Message Passing Neural Networks, MPNN),每一层执行三个核心步骤:
hv(k+1) = UPDATE(k)( hv(k), AGGREGATE(k)({ hu(k) : u ∈ N(v) }) )
其中 N(v) 是节点 v 的邻居集合,k 表示第 k 层
根据发送节点、接收节点和边的特征,生成“消息”。
聚合所有来自邻居节点的消息(如 Sum, Mean, Max)。
结合自身特征和聚合消息,更新节点表示。
利用归一化邻接矩阵进行特征传播,类似 CNN 的卷积操作。
📄 论文:Kipf & Welling, 2017 | 🎯 特点:谱域方法,效率高
引入注意力机制,为不同邻居分配不同权重,提升模型表达能力。
📄 论文:Veličković et al., 2018 | 🎯 特点:自适应权重
对邻居进行采样(Sampling)与聚合,支持大规模图的归纳学习。
📄 论文:Hamilton et al., 2017 | 🎯 特点:可扩展性强
基于 Weisfeiler-Lehman 测试设计,通过 MLP 和求和聚合实现最强表达能力。
📄 论文:Xu et al., 2019 | 🎯 特点:理论最优表达能力
社群发现、影响力预测、好友推荐
📊 案例:Facebook 好友推荐
药物发现、分子属性预测、蛋白质结构
📊 案例:AlphaFold 蛋白质折叠
用户-商品交互建模、个性化推荐
📊 案例:淘宝商品推荐
关系推理、问答系统、实体链接
📊 案例:Google 知识图谱搜索
路网流量与速度预测、路径规划
📊 案例:滴滴出行时间预估
点云处理、场景图生成、3D重建
📊 案例:自动驾驶感知系统
数学基础:线性代数(矩阵运算)、图论(图的表示、遍历)、概率论
深度学习:反向传播(BP)、优化算法(SGD、Adam)、正则化技术
📖 推荐资源:《深度学习》花书、Stanford CS224W 课程
PyTorch Geometric (PyG):最流行的图学习库,API 友好
Deep Graph Library (DGL):高性能、灵活的图神经网络框架
NetworkX:Python 图分析基础库
💻 实践:安装环境、运行官方示例、阅读文档
必读论文:
🔬 目标:理解原理、复现代码、调试参数
入门项目:Cora/CiteSeer 引用网络节点分类
进阶项目:分子性质预测(QM9、ZINC 数据集)
高级项目:推荐系统、知识图谱补全、交通流预测
🎯 建议:从开源项目入手,参加 Kaggle 竞赛
图对比学习 (Graph Contrastive Learning):通过数据增强和对比损失,在无标签场景下学习图表征。
Temporal GNN:处理动态图(节点/边随时间变化)。结合 RNN/Transformer 捕捉时间依赖性。
Heterogeneous GNN:处理多类型节点和边的图(如知识图谱)。通过元路径 (meta-path) 或元关系聚合信息。
Graph Transformer:将 Transformer 的全局注意力机制应用于图数据,解决长程依赖问题。
GNNExplainer:识别对预测最重要的子图结构,提升模型透明度。
Fairness in GNN:研究如何消除图数据中的偏见,确保预测结果的公平性。
import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
from torch_geometric.datasets import Planetoid
# 1. 加载 Cora 数据集
dataset = Planetoid(root='/tmp/Cora', name='Cora')
data = dataset[0]
# 2. 定义 GCN 模型
class GCN(torch.nn.Module):
def __init__(self):
super().__init__()
self.conv1 = GCNConv(dataset.num_features, 16)
self.conv2 = GCNConv(16, dataset.num_classes)
def forward(self, data):
x, edge_index = data.x, data.edge_index
# 第一层:卷积 + ReLU + Dropout
x = self.conv1(x, edge_index)
x = F.relu(x)
x = F.dropout(x, training=self.training)
# 第二层:卷积 + Softmax
x = self.conv2(x, edge_index)
return F.log_softmax(x, dim=1)
# 3. 训练模型
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = GCN().to(device)
data = data.to(device)
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)
loss = F.nll_loss(out[data.train_mask], data.y[data.train_mask])
loss.backward()
optimizer.step()
if epoch % 20 == 0:
print(f'Epoch {epoch:03d}, Loss: {loss:.4f}')
# 4. 测试模型
model.eval()
pred = model(data).argmax(dim=1)
correct = (pred[data.test_mask] == data.y[data.test_mask]).sum()
acc = int(correct) / int(data.test_mask.sum())
print(f'Test Accuracy: {acc:.4f}')
💡 代码说明: