3. 图神经网络入门
在进入大规模图采样与 Mini-batch 训练之前,必须先理解经典图神经网络(GNN)模型是如何把图结构与节点特征融合起来的。GCN、GraphSAGE、GAT 是三类最具代表性的模型,它们分别从谱域近似、邻居采样聚合、注意力加权三个角度解决“节点如何吸收邻居信息”的问题。理解它们的原理与局限,才能明白为什么大规模图训练必须引入采样机制。
核心原理:从邻居聚合到表示学习
GNN 的基本假设是:节点的语义不仅由自身特征决定,还由它的邻居、邻居的邻居共同决定。一次图卷积可以理解为“聚合邻居特征 + 与自身特征融合 + 非线性变换”。堆叠 L 层后,每个节点就能看到 L 跳范围内的结构信息。
- GCN(图卷积网络):基于谱图理论的切比雪夫近似,使用对称归一化邻接矩阵
 = D̃⁻¹ᐟ²ÃD̃⁻¹ᐟ²,逐层传播H⁽ˡ⁺¹⁾ = σ(ÂH⁽ˡ⁾W⁽ˡ⁾)。它把邻居聚合固定为归一化平均,结构简单、参数少。 - GraphSAGE:不再使用全图归一化矩阵,而是对每个节点采样固定数量的邻居,再选择聚合函数(mean、LSTM、pooling)。它支持归纳学习,新节点无需重新训练即可推理。
- GAT(图注意力网络):为每条边学习注意力系数
αᵢⱼ,让不同邻居拥有不同权重,从而区分重要邻居与噪声邻居,并支持多头注意力增强表达能力。
一句话对比:GCN 是“固定权重的平均聚合”,GraphSAGE 是“采样后的可归纳聚合”,GAT 是“带注意力权重的加权聚合”。
方法流程:一次前向传播发生了什么
以两层 GNN 为例,节点 v 的表示更新流程如下:
- 读取节点
v的初始特征xᵥ,以及它的一跳邻居集合N(v)。 - 对邻居特征做聚合:GCN 用归一化平均,GraphSAGE 用采样后 mean/pooling,GAT 用注意力加权求和。
- 将聚合结果与自身特征拼接或相加,经过线性变换
W与激活函数σ。 - 重复上述过程堆叠第二层,使节点获得二跳邻居信息。
- 输出节点嵌入,用于节点分类、链接预测或图分类任务。
# 以 PyTorch Geometric 为例,两层 GCN 的核心前向
import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
class GCN(torch.nn.Module):
def __init__(self, in_dim, hidden_dim, out_dim):
super().__init__()
self.conv1 = GCNConv(in_dim, hidden_dim)
self.conv2 = GCNConv(hidden_dim, out_dim)
def forward(self, x, edge_index):
x = F.relu(self.conv1(x, edge_index))
x = F.dropout(x, p=0.5, training=self.training)
x = self.conv2(x, edge_index)
return F.log_softmax(x, dim=1)
案例与场景:三类模型的适用边界
| 模型 | 聚合方式 | 是否支持归纳 | 典型场景 | 大规模瓶颈 |
|---|---|---|---|---|
| GCN | 归一化平均 | 否(依赖固定图结构) | 引文网络、小规模同构图 | 需全图邻接矩阵,显存随节点数平方增长 |
| GraphSAGE | 采样 + mean/LSTM/pooling | 是 | 推荐系统、动态新增节点 | 邻居采样数量随层数指数膨胀 |
| GAT | 注意力加权求和 | 是 | 异构图、噪声边较多的图 | 注意力计算与边数成正比,稠密图开销大 |
在真实工业场景中,社交网络可能有数十亿节点、千亿条边,电商推荐图的用户—商品交互更是持续增长。此时无论 GCN 的全图矩阵、GraphSAGE 的邻居爆炸,还是 GAT 的逐边注意力,都会遇到显存、计算和通信的三重压力。
误区与复盘:经典模型为何难以直接扩展
常见误区:认为“把图切小就能训练”。实际上,GNN 的层间依赖会让切分边界节点丢失跨分区邻居信息,导致表示偏差。
- 邻居爆炸:采样
k个邻居、堆叠L层,感受野约为kᴸ。10 个邻居、3 层就是 1000 个节点,计算量迅速失控。 - 全图依赖:GCN 的归一化邻接矩阵需要整图参与,无法像 CNN 那样按 batch 独立切分。
- 显存墙:节点嵌入、邻接索引、中间激活值同时驻留 GPU,规模稍大就 OOM。
- 深度退化:层数增加会带来过平滑(over-smoothing),所有节点表示趋同,反而降低区分度。
复盘结论:经典 GNN 在小图上表现优秀,但大规模图训练必须解决“如何在不丢失结构信息的前提下,把全图计算拆成可并行的 Mini-batch”。这正是后续图采样技术(邻居采样、层采样、子图采样、聚类采样)要解决的核心问题。