GCN — 半监督节点分类与图神经网络的奠基¶
2016 年 9 月 9 日,Kipf & Welling 在 arXiv 发布 GCN (1609.02907),2017 年 ICLR 接收。 这是一篇只有 14 页的论文,把谱图卷积理论从 Bruna 2014 的复杂频域计算简化为 一个 1 阶 Chebyshev 近似,最终归结为一个朴素的传播公式 \(H^{(l+1)} = \sigma(\hat{D}^{-1/2}\hat{A}\hat{D}^{-1/2}H^{(l)}W^{(l)})\)。 在 Cora / CiteSeer / Pubmed 三大引用网络数据集上,GCN 把半监督节点分类准确率从之前的 70-75% 推到 80%+,且模型只需 2 层、几千个参数。 GCN 是图神经网络(Graph Neural Network, GNN)的真正起点 —— 它把"图上的卷积"工程化为可微分、可批量训练、可端到端优化的层,直接催生了 GAT (2018) / GraphSAGE (2017) / Message Passing Neural Network (2017) 等整个 GNN 家族,被引数 ~3 万次,是 ICLR 2017 影响力最大的论文之一。
一句话总结¶
GCN 用 谱图卷积的 1 阶 Chebyshev 近似 推导出 \(H^{(l+1)} = \sigma(\hat{D}^{-1/2}\hat{A}\hat{D}^{-1/2}H^{(l)}W^{(l)})\) 这一极简传播公式,让节点通过 2-3 层网络聚合"邻居 + 邻居的邻居"信息,把图上的半监督节点分类从复杂的谱方法变成与 CNN 一样易训的端到端层,成为整个 GNN 家族的奠基范式。
历史背景¶
2016 年的图机器学习在卡什么¶
2016 年的 graph ML 主流仍是谱图方法 + 节点 embedding 两大阵营:
(1) 谱方法(Spectral,Bruna 2014 / Defferrard 2016):理论严谨,把图卷积定义在 graph Laplacian 的特征空间里,但计算昂贵(每次需特征分解 \(O(N^3)\))、不能跨图泛化(特征空间依赖图结构); (2) Random walk embedding(DeepWalk 2014 / node2vec 2016):把图上随机游走当成"句子"用 word2vec 训练节点向量,简单高效但无法端到端训练、不能利用节点特征、新节点要重训。
学界明显的开放问题:「能不能设计一个像 CNN 一样易训、端到端、可跨图泛化、可利用节点特征的 graph 卷积层?」
直接逼出 GCN 的 2 篇前序¶
- Bruna et al., 2014 (Spectral CNN on Graphs) [ICLR]:第一次在图上定义谱卷积,但每层需特征分解,复杂度 \(O(N^3)\),不可扩展
- Defferrard, Bresson, Vandergheynst, 2016 (ChebNet) [NeurIPS]:用 K 阶 Chebyshev 多项式近似谱卷积,避开特征分解,复杂度 \(O(K|E|)\)。但 \(K\) 阶超参敏感,且结构仍较复杂
GCN 把 ChebNet 进一步激进简化为 \(K=1\)(1 阶近似),得到一个非常优雅的传播规则。
作者团队当时在做什么¶
Thomas Kipf 当时是阿姆斯特丹大学的 PhD(导师 Max Welling),后加入 Google Brain 主导多个 GNN 工作(Relational GCN / Graph VAE);Max Welling 是 VAE / Bayesian DL 名家。这对师生当时的目标是用 deep learning 方法做半监督节点分类,结果从谱方法的工程化简化中意外发现了通用的 GNN 范式。
工业界 / 算力 / 数据¶
- GPU:单 GPU 训完所有实验,Cora 数据集(2708 节点)几秒钟收敛
- 数据:Cora(学术引用,7 类)、CiteSeer(6 类)、Pubmed(3 类)、NELL(知识图谱)
- 框架:TensorFlow + 自家代码(github/tkipf/gcn star 7k+,是早期 GNN 学习者必读源码)
- 行业:图结构数据无处不在(社交网络 / 推荐系统 / 知识图谱 / 分子图),但缺乏统一框架
方法详解¶
整体框架¶
Graph G = (V, E):
Adjacency A (N×N)
Node features X (N×D)
Labels Y_l (only N_l << N labeled)
↓
[GCN Layer 1] H^(1) = ReLU(Â · X · W^(0)) # Â = D^{-1/2}(A+I)D^{-1/2}
↓
[GCN Layer 2] H^(2) = softmax(Â · H^(1) · W^(1))
↓
Loss = -∑_{i∈labeled} ∑_c Y_{ic} log H^(2)_{ic}
| 配置 | 通常值 |
|---|---|
| 层数 L | 2-3(再深会过平滑) |
| Hidden dim | 16-64 |
| Dropout | 0.5(防过拟合) |
| 参数量 | Cora 上 ~23k,比 CNN 小几个量级 |
关键设计¶
设计 1:1 阶 Chebyshev 近似 + Renormalization Trick —— 极简传播公式¶
功能:把谱图卷积简化为一个矩阵乘法,避开特征分解,且层间数值稳定。
推导起点(ChebNet 谱卷积):
取 \(K=1\)、\(\lambda_{\max} \approx 2\) 简化:
进一步令 \(\theta_0 = -\theta_1 = \theta\)(只用一个参数):
Renormalization Trick:直接用 \(I + D^{-1/2}AD^{-1/2}\) 在深层堆叠会数值爆炸(特征值范围 [0, 2]),改为:
特征值范围被限制在 [0, 2),深层堆叠数值稳定。
最终传播规则:
为什么这个公式如此优雅?
- \(\tilde{A} H^{(l)}\):每个节点取「自己 + 邻居」的隐藏表示加权平均
- \(W^{(l)}\):线性变换(学特征映射)
- \(\sigma\):非线性激活
- 完全等价于 CNN 的"局部加权 + 卷积核 + 激活",只是邻域定义在图上
设计 2:Message Passing 视角 —— 把 GCN 看作邻居聚合¶
功能:把上面的矩阵公式改写为节点级的"消息传递 + 聚合",让 GCN 易于推广到边特征 / 异构图 / inductive 学习。
节点级公式:
每个节点 \(v\) 的更新 = 自己 + 所有邻居 \(u\) 的特征经 \(W^{(l)}\) 变换后对称归一化加权求和。
对比同期 GNN 方法:
| 方法 | 聚合公式 | 跨图泛化 | 用节点特征 |
|---|---|---|---|
| DeepWalk (2014) | random walk + word2vec | 否 | 否 |
| ChebNet (2016) | K 阶 Chebyshev 谱卷积 | 否 | 是 |
| GCN (2017) | 1 阶简化 + renormalize | 半(同图) | 是 |
| GraphSAGE (2017) | 邻居采样 + 多种聚合(mean/LSTM/pool) | 是(inductive) | 是 |
| GAT (2018) | attention 加权邻居 | 是 | 是 |
| MPNN (2017) | 通用消息传递框架 | 是 | 是 |
设计 3:半监督 Loss + Dropout —— 小标签 + 大未标节点的训练¶
功能:在 Cora 这种「只有 140/2708 节点有标签」的极端半监督场景下,让模型学到所有节点的有用 embedding。
核心思路:
只在标注节点 \(\mathcal{Y}_L\)(Cora 上 140 个,CiteSeer 120 个,Pubmed 60 个)算 cross-entropy,但前向传播覆盖所有节点。未标注节点通过邻接矩阵帮助标注节点,反过来标注节点也帮助未标注节点学到合理 embedding。
伪代码:
import torch
import torch.nn as nn
class GCNLayer(nn.Module):
def __init__(self, in_dim, out_dim):
super().__init__()
self.W = nn.Linear(in_dim, out_dim, bias=False)
def forward(self, X, A_norm):
# A_norm = D^{-1/2}(A+I)D^{-1/2} 预先计算
return A_norm @ self.W(X)
class GCN(nn.Module):
def __init__(self, in_dim, hidden, num_classes):
super().__init__()
self.gc1 = GCNLayer(in_dim, hidden)
self.gc2 = GCNLayer(hidden, num_classes)
self.dropout = nn.Dropout(0.5)
def forward(self, X, A_norm):
h = torch.relu(self.gc1(X, A_norm))
h = self.dropout(h)
return self.gc2(h, A_norm) # 不加 softmax,CrossEntropyLoss 内部做
# 训练(半监督)
out = model(X, A_norm) # (N, num_classes)
loss = F.cross_entropy(out[train_mask], Y[train_mask]) # 只在标注节点
设计 4:浅层堆叠(2-3 层)—— 暴露过平滑问题¶
功能:刻意保持网络浅(2-3 层)以避免节点表示在深层"过平滑"(Over-Smoothing)。
核心观察:GCN 每层等价于一次邻居聚合。L 层后,每个节点的 receptive field 是 L-hop 邻居。在小图(Cora 平均路径 ~6)上,L=2-3 已经覆盖大部分节点的有效邻域,再深会让所有节点的表示收敛到同一个不可分的常数向量(Over-Smoothing 现象)。
对比深度对性能的影响(论文 Figure 4):
| 层数 | Cora acc | 现象 |
|---|---|---|
| 1 | 79.0 | 信息覆盖不足 |
| 2 | 81.5 | 最优 |
| 3 | 80.2 | 略微下降 |
| 5 | 70.5 | over-smoothing |
| 7 | 49.7 | 严重 over-smoothing |
设计动机 / 局限:浅 GCN 是 ad-hoc 解决方案,真正解决 over-smoothing 的工作(DropEdge / GCNII / PairNorm)在 2019-2020 才出现,构成 GNN 后续核心研究方向。
损失函数 / 训练策略¶
| 项 | 配置 |
|---|---|
| Loss | Cross-entropy on labeled nodes only |
| Optimizer | Adam (lr=0.01) |
| Weight decay | 5e-4 |
| Dropout | 0.5 |
| Hidden | 16 |
| Layers | 2 |
| Epochs | 200 with early stopping |
| Renormalization | \(\tilde{A} = \hat{D}^{-1/2}(A+I)\hat{D}^{-1/2}\)(关键 trick) |
| Train/Val/Test split | 半监督,仅 ~5% 标签 |
失败案例¶
当时输给 GCN 的对手¶
- DeepWalk (Cora 67.2 → GCN 81.5):纯结构 embedding 不能用节点特征,输 14 点
- node2vec (74.8 → 81.5):同上
- ICA + LP (75.1 → 81.5):传统 ML 方法,慢且效果差
- ChebNet K=3 (81.2 → 81.5):性能相当但模型复杂,参数多
- Planetoid (75.7 → 81.5):random walk + 半监督但慢
论文承认的失败 / 局限¶
- 过平滑问题:超过 3 层性能急剧下降(70+ → 49)
- 大图扩展性:full-batch 训练在 100k+ 节点图上 OOM;GraphSAGE (2017) 用邻居采样解决
- 不能 inductive 学习:训练时见过的图结构是固定的,新节点加入要重训
- 静态图假设:动态图(社交网络新关系出现)需重训
- 同质图假设:异构图(多种节点 / 边类型)需扩展(→ R-GCN 2018)
「反 baseline」教训¶
- 「谱方法理论上严谨,必须用 K 阶 Chebyshev」(ChebNet 路线):GCN 证明 K=1 + renormalization 已足够,复杂度从 \(O(K|E|)\) 降到 \(O(|E|)\)
- 「random walk embedding 是 graph ML 标配」(DeepWalk / node2vec 路线):GCN 端到端学习直接超过 10+ 点
- 「图卷积难以训练 deep」:浅 2-3 层就很强,但确实不能加深(暴露 over-smoothing 问题)
实验关键数据¶
主实验(节点分类准确率 %)¶
| Method | Cora | CiteSeer | Pubmed | NELL |
|---|---|---|---|---|
| ManiReg | 59.5 | 60.1 | 70.7 | 21.8 |
| SemiEmb | 59.0 | 59.6 | 71.1 | 26.7 |
| LP | 68.0 | 45.3 | 63.0 | 26.5 |
| DeepWalk | 67.2 | 43.2 | 65.3 | 58.1 |
| ICA | 75.1 | 69.1 | 73.9 | 23.1 |
| Planetoid | 75.7 | 64.7 | 77.2 | 61.9 |
| GCN | 81.5 | 70.3 | 79.0 | 66.0 |
全部 4 个数据集 SOTA,平均 +6 点提升。
模型比较¶
| Model | Cora | 训练时间 | 参数量 |
|---|---|---|---|
| ChebNet (K=2) | 81.2 | 7s | 47k |
| ChebNet (K=3) | 79.5 | 8s | 70k |
| GCN (renorm) | 81.5 | 4s | 23k |
| GCN (no renorm, \(I+D^{-1/2}AD^{-1/2}\)) | 79.5 | 4s | 23k |
GCN 用更少参数、更短时间拿更好结果。
关键发现¶
- renormalization trick 是关键:去掉后掉 2 点
- 2 层是甜点:1 层不够、4+ 层 over-smoothing
- 小标签也能高准确率:仅 ~5% 标签拿到 80%+ 准确率,证明半监督学习潜力
- 极简公式最强:K=1 简化版打败 K=3 ChebNet
- 训练极快:Cora 4 秒收敛,比 random walk + word2vec 快 100×
思想史脉络¶
graph LR
Bruna[Bruna 2014<br/>Spectral CNN on Graphs] -.谱理论起点.-> GCN
ChebNet[ChebNet 2016<br/>K 阶 Chebyshev 多项式] -.直接前身.-> GCN
DeepWalk[DeepWalk 2014<br/>random walk + word2vec] -.对照路线.-> GCN
Node2Vec[node2vec 2016<br/>biased random walk] -.对照路线.-> GCN
CNN[CNN 1998-2015<br/>local convolution] -.灵感.-> GCN
GCN[GCN 2017<br/>renormalized 1-order spectral conv]
GCN --> GraphSAGE[GraphSAGE 2017<br/>邻居采样 + inductive]
GCN --> MPNN[MPNN 2017<br/>统一消息传递框架]
GCN --> GAT[GAT 2018<br/>attention 加权邻居]
GCN --> RGCN[R-GCN 2018<br/>异构图扩展]
GCN --> GCNII[GCNII 2020<br/>解决 over-smoothing]
GCN --> PinSAGE[PinSAGE 2018<br/>Pinterest 工业推荐]
GCN --> GraphTransformer[Graph Transformer 2020<br/>图上的 Transformer]
GCN --> GraphMAE[GraphMAE 2022<br/>图自监督预训练]
GCN --> GraphormerGT[Graphormer 2021<br/>图上 Transformer + edge encoding]
GCN -.思想启发.-> AlphaFold[AlphaFold 2 2021<br/>Evoformer 对蛋白质图建模]
前世¶
- Spectral CNN (Bruna 2014):第一次定义谱图卷积
- ChebNet (Defferrard 2016):K 阶 Chebyshev 多项式简化谱卷积
- DeepWalk / node2vec (2014-2016):random walk embedding 对照路线
- CNN (1998-2015):local convolution 灵感
今生¶
- 架构家族:GraphSAGE 2017(inductive)、MPNN 2017(统一)、GAT 2018(attention)、R-GCN 2018(异构)、GCNII 2020(深 GCN)
- 大规模图:PinSAGE 2018(Pinterest 工业推荐)、Cluster-GCN 2019(采样训练)
- 图上的 Transformer:Graph Transformer 2020、Graphormer 2021
- 图自监督:GraphMAE 2022、SimGRACE 2022
- 跨学科外溢:AlphaFold 2 (2021) 的 Evoformer 把 GCN 思想用到蛋白质图建模;分子性质预测、药物发现、知识图谱推理
误读¶
- 「GCN 是 spectral 方法」:实际上 GCN 因为 renormalization 已脱离严格谱解释,更像 spatial GNN
- 「GCN 适合所有图任务」:Over-smoothing 让深 GCN 失败;inductive 任务需 GraphSAGE
- 「GCN 比 Transformer 弱」:在异构图 / 长程依赖上是的,但在分子 / 物理仿真等局部交互任务上 GCN 仍是高效选择
当代视角(2026 年回看 2017)¶
站不住的假设¶
- 「2 层就够」:今天 GCNII / PairNorm / GraphSAGE 等可训 50+ 层
- 「Full-batch 训练可行」:大规模图(OGB benchmark 数百万节点)必须用采样(GraphSAGE / Cluster-GCN)
- 「图结构静态」:动态图 / 时空图 / 流图需要专门方法(DyRep / TGN 2020)
- 「local aggregation 足够」:长程依赖任务上 Graph Transformer 远胜 GCN
- 「同质图假设」:异构图(社交网络多关系)需 R-GCN / HAN 等
时代证明的关键 vs 冗余¶
- 关键:renormalization trick、对称归一化邻接矩阵、半监督 cross-entropy、message passing 视角、浅层网络默认值
- 冗余 / 误导:纯谱解释(被 spatial / message passing 视角替代)、固定 2 层(被自适应深度替代)、full-batch(被采样替代)、only homogeneous graph(被异构 GNN 扩展)
作者当时没想到的副作用¶
- 整个 GNN 学科诞生:GCN 之后 5 年内 GNN 论文从每年几十篇暴涨到上万篇,ICLR / NeurIPS / KDD 都开 GNN 专题
- 工业大规模部署:PinSAGE (Pinterest)、TwHIN (Twitter)、阿里 GraphLearn / Embedding service、美团推荐 GNN —— GCN 直接催生工业图学习栈
- AlphaFold 2 借用思想:Evoformer 的 pair representation update 本质是图上消息传递
- 跨学科外溢:分子性质预测(MolNet / OGB-mol)、物理仿真(GNS / MeshGraphNet)、社交推荐(GraphRec)、生物网络分析、城市交通(ST-GCN)
- Over-smoothing 成为 GNN 核心理论问题:催生 DropEdge 2019 / PairNorm 2019 / GCNII 2020 / NodeNorm 等系列工作
如果今天重写 GCN¶
- 换成 GraphSAGE / GAT 风格的可 inductive 设计
- 加 GraphNorm / PairNorm 防 over-smoothing
- 用 mini-batch 邻居采样适应大图
- 加 edge feature 处理(用 R-GCN 或 MPNN 风格)
- 默认 8-16 层(per GCNII 经验)
- 加 attention / Transformer 层处理长程依赖
但「邻居聚合 + 线性变换 + 非线性」核心 message passing 范式不变。
局限与展望¶
作者承认¶
- 2 层网络的 receptive field 限制(仅 2-hop 邻居)
- 大图 OOM 问题(full-batch 训练)
- 训练 / 测试图必须相同(transductive 限制)
- 仅同质图(一种节点 + 边)
自己发现¶
- Over-smoothing 限制深度
- 不能利用边特征 / 边类型
- 不能处理动态 / 异构 / 多重图
- 在长程依赖任务上效果差
改进方向(已被后续工作证实)¶
- GraphSAGE (2017):邻居采样 + inductive
- GAT (2018):attention 加权邻居
- R-GCN (2018):异构图
- GCNII (2020) / PairNorm (2020):解决 over-smoothing
- Graph Transformer (2020+):长程依赖
- Cluster-GCN / GraphSAINT (2019):大图采样训练
相关工作与启发¶
- vs ChebNet (跨简化层级):ChebNet K 阶 Chebyshev,GCN 取 K=1。教训:极致简化往往比精细调参更有用,且对后续工作启发更大
- vs DeepWalk (跨范式):DeepWalk 把 graph 当 sequence,GCN 把 graph 当卷积域。教训:选对正确的 inductive bias 可以省下 90% 工程量
- vs CNN (跨数据结构):CNN 在 grid 上做 local 卷积,GCN 在 graph 上做 local 聚合。教训:CNN 的成功范式(局部 + 权重共享 + 深层堆叠)可以泛化到任何结构化数据
- vs Transformer (跨结构):Transformer 是 fully-connected attention(图的特殊情况),GCN 是 locally-connected。教训:sparse local 和 dense full 各有优势,长程依赖用 Transformer,局部交互用 GCN
- vs GAT (跨代际继承):GAT 把 GCN 的固定归一化权重换成 attention。教训:固定权重 → 可学习权重往往是 GNN 进化的方向
相关资源¶
- 📄 arXiv 1609.02907 · ICLR 2017 OpenReview
- 💻 作者原始 TF 实现 · PyG (PyTorch Geometric) · DGL (Deep Graph Library)
- 📚 后续必读:GraphSAGE (2017)、GAT (2018)、MPNN (2017)、GCNII (2020)、OGB benchmark
- 🎬 Kipf 自己的 GCN 介绍 blog · Stanford CS224W (Graph ML 课程)
🌐 English version · 📚 awesome-papers project · CC-BY-NC