引言:当深度学习遇到图结构数据

传统的深度学习模型——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 等方向正在探索图结构与大语言模型的深度融合
点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部