图卷积网络 GCN:谱域与空域的邻居聚合
图卷积网络 (GCN) 完全指南:谱域与空域的邻居聚合
1. 图卷积网络是什么?为什么需要它?
在深度学习的世界里,卷积神经网络(CNN)统治了图像、语音等欧几里得数据。然而,现实世界中大量数据天然以图的形式存在——社交网络、分子结构、知识图谱、推荐系统、交通网络等。图是一种非欧几里得结构,每个节点的邻居数量不固定,无法直接用固定尺寸的卷积核进行卷积。
图卷积网络(Graph Convolutional Network, GCN) 就是将卷积操作扩展到图数据上的方法。它的核心思想是:利用图中节点的邻居信息来更新当前节点的表示,通过逐层聚合邻居特征,学习节点的低维嵌入向量,用于节点分类、链接预测、图分类等任务。
本文将从**谱域(Spectral)与空域(Spatial)**两大视角,深入浅出地讲解GCN的数学原理和常用模型。
2. 图的基础定义
在进入GCN之前,我们先明确图的基本符号:
- 一个图表示为 ( G = (V, E) ),其中 ( V ) 是节点集合,( E ) 是边集合。
- 节点数量为 ( N = |V| )。
- 邻接矩阵 ( A \in \mathbb{R}^{N \times N} ),若节点 i 与 j 之间有边,则 ( A_{ij}=1 ),否则为0(通常包含自环,即 ( A_{ii}=1 ))。
- 度矩阵 ( D ) 是对角矩阵,( D_{ii} = \sum_j A_{ij} )。
- 节点特征矩阵 ( X \in \mathbb{R}^{N \times F} ),每一行是一个节点的特征向量,维度为 F。
图上的“卷积”就是要设计一个函数,输入 ( (A, X) ),输出节点的新特征 ( Z \in \mathbb{R}^{N \times F'} )。
3. 谱域图卷积:从傅里叶变换到图拉普拉斯
谱域方法借助图信号处理理论,在图拉普拉斯矩阵的谱上定义卷积。
3.1 图拉普拉斯矩阵
定义归一化图拉普拉斯矩阵: [ L = I - D^{-1/2} A D^{-1/2} ] 它是对称半正定矩阵,可以特征分解: [ L = U \Lambda U^T ] 其中 ( \Lambda = \text{diag}(\lambda_1, \dots, \lambda_N) ) 为特征值,( U ) 是特征向量矩阵。
物理意义:( L ) 描述了图上任意两点的差分平滑性。对于信号 ( x )(即每个节点的特征值),( x^T L x = \frac{1}{2} \sum_{i,j} A_{ij} (x_i - x_j)^2 ) 衡量了信号的“不平滑度”。
3.2 图傅里叶变换与卷积定理
类比经典傅里叶变换,图上的傅里叶变换定义为: [ \hat{x} = U^T x ] 逆变换为: [ x = U \hat{x} ] 图上的卷积定义:信号 ( x ) 与滤波器 ( g_\theta ) 的卷积 = 首先分别变换到谱域,相乘,再逆变换回来。 [ g_\theta \star x = U , g_\theta(\Lambda) , U^T x ] 其中 ( g_\theta(\Lambda) = \text{diag}(\theta) ) 是对角矩阵,可学习的参数 ( \theta ) 就是谱域的滤波器。
这是Spectral CNN 最早的形式(Bruna et al., 2014),但存在三大问题:
- 计算 ( U ) 和 ( U^T ) 代价 ( O(N^3) ),不适用于大图。
- 滤波器不局部化(不是多项式的形式就不能保证空间局部性)。
- 需要整个图的拉普拉斯特征分解,难以泛化到新图。
3.3 切比雪夫多项式近似(ChebNet)
为了解决上述问题,Defferrard et al. (2016) 提出用切比雪夫多项式近似 ( g_\theta(\Lambda) ),避免特征分解,并保证滤波器的局部性。
用 K 阶切比雪夫多项式展开: [ g_\theta(\Lambda) \approx \sum_{k=0}^{K-1} \theta_k T_k(\tilde{\Lambda}) ] 其中 ( \tilde{\Lambda} = \frac{2}{\lambda_{\max}} \Lambda - I ),将特征值缩放到 [-1,1] (保持切比雪夫多项式定义域),( T_k ) 是切比雪夫递推式。
代入卷积公式: [ g_\theta \star x \approx \sum_{k=0}^{K-1} \theta_k T_k(\tilde{L}) x ] 这里 ( \tilde{L} = \frac{2}{\lambda_{\max}} L - I )。此时,计算不再需要特征分解,只需要矩阵与向量相乘,且 K 阶近似意味着每个节点只与 K 步邻居有关(空间局部化)。
这已经是将谱域操作转化为空间域 k 邻域聚合的形式了——K 就是卷积核的感受野大小。
3.4 一阶近似:GCN的诞生
Kipf & Welling (2017) 进一步简化:取 K=2 阶近似(实际只用1阶邻居),并假设 ( \lambda_{\max} \approx 2 ),因此 ( \tilde{L} \approx L - I = - D^{-1/2} A D^{-1/2} )。令 ( \theta = \theta_0 = -\theta_1 ) 来减少参数,得到: [ g_\theta \star x \approx \theta \left( I + D^{-1/2} A D^{-1/2} \right) x ]
为了数值稳定性,引入重归一化技巧:( \tilde{A} = A + I ),( \tilde{D}{ii} = \sum_j \tilde{A}{ij} ),最终得到著名的GCN层: [ H^{(l+1)} = \sigma \left( \tilde{D}^{-1/2} \tilde{A} \tilde{D}^{-1/2} H^{(l)} W^{(l)} \right) ] 其中 ( H^{(l)} ) 是第 l 层的节点特征,( W^{(l)} ) 是可学习权重矩阵,( \sigma ) 是激活函数。
这就是谱域GCN最实用的形式,它已经完全转为一个空间聚合的格式,但源于谱理论。
4. 空域图卷积:邻居聚合的直观视角
空域方法直接在图上定义卷积,核心是聚合邻居信息,不依赖谱理论,形式上更灵活、更直观。
一个通用的空域图卷积层可以写作: [ h_v^{(l+1)} = \text{UPDATE} \left( h_v^{(l)}, \text{AGGREGATE} \left( { h_u^{(l)} : u \in \mathcal{N}(v) } \right) \right) ] 其中 AGGREGATE 是一个排列不变函数(如 sum, mean, max),UPDATE 通常是一个神经网络(如线性变换+非线性激活)。
4.1 GraphSAGE:采样与聚合
面对大规模图,Hamilton et al. (2017) 提出 GraphSAGE(SAmple and aggreGatE)。核心贡献:
- 邻居采样:不聚合所有邻居,而是固定采样一定数量邻居,控制计算量。
- 多种聚合函数:
- Mean aggregator: ( h_v \leftarrow \sigma(W \cdot \text{MEAN}({h_v} \cup {h_u})) )
- LSTM aggregator: 将邻居随机排列后用LSTM聚合(理论上非排列不变,但实践中有效)
- Pooling aggregator: ( \text{AGGREGATE} = \max({ \sigma(W h_u + b) }) )
- 可处理归纳学习(之前未见过的节点),因为聚合参数不依赖图结构本身。
GraphSAGE 的输出通常进行 L2 归一化,常用 loss 为邻近损失。
4.2 GAT:注意力机制聚合
图注意力网络(Graph Attention Network, GAT)由 Velickovic et al. (2018) 提出,用自注意力为不同邻居分配不同权重,而不是平等聚合。
注意力系数计算: [ e_{vu} = \text{LeakyReLU}(a^T [W h_v || W h_u]) ] 其中 ( || ) 表示拼接,( a ) 是可学习注意力向量。然后对邻居进行 softmax 归一化: [ \alpha_{vu} = \frac{\exp(e_{vu})}{\sum_{k \in \mathcal{N}(v)} \exp(e_{vk})} ] 节点更新: [ h_v' = \sigma \left( \sum_{u \in \mathcal{N}(v)} \alpha_{vu} W h_u \right) ] 进一步可以引入多头注意力:并行计算多个注意力头,拼接或平均输出,增强表达能力。
GAT 的优点:隐式地为每条边分配重要性,可解释性强;且因为注意力权重可预先计算,仍是归纳式模型。
4.3 空域方法小结
| 模型 | 聚合方式 | 可学习参数 | 归纳能力 |
|---|---|---|---|
| GCN (Kipf&Welling) | 均值聚合(重归一化度) | 权重矩阵 W | 传导式(需要完整图) |
| GraphSAGE | 采样+均值/LSTM/池化 | W + 聚合参数 | 是 |
| GAT | 注意力加权求和 | W + 注意力向量 | 是 |
5. GCN的实践与代码示例(PyTorch Geometric)
使用 PyTorch Geometric (PyG) 可以几行代码实现上述模型。以下实现一个两层的GCN用于节点分类。
import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
class GCN(torch.nn.Module):
def __init__(self, in_channels, hidden_channels, out_channels):
super().__init__()
self.conv1 = GCNConv(in_channels, hidden_channels)
self.conv2 = GCNConv(hidden_channels, out_channels)
def forward(self, x, edge_index):
# edge_index 形状 (2, E)
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)
# 用法示例 (以Cora数据集为例)
from torch_geometric.datasets import Planetoid
dataset = Planetoid(root='/tmp/Cora', name='Cora')
data = dataset[0]
model = GCN(dataset.num_features, 16, dataset.num_classes)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
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()
类似地,使用 torch_geometric.nn.SAGEConv 或 GATConv 替换即可得到 GraphSAGE 和 GAT。
6. 常见问题与进阶方向
6.1 过平滑 (Over-smoothing)
多层GCN堆叠后,节点特征会趋于相同(拉普拉斯平滑效应),导致无法区分。解决方案:使用残差连接、跳层连接(如 JK-Net)、减少层数、引入 dropout 等。
6.2 大规模图
邻居数量爆炸时,使用采样(如 GraphSAINT, ClusterGCN, PinSage)或者简化聚合(SGC 去除非线性直接做线性传播)。
6.3 异构图
节点或边有多种类型时,需要设计关系特定的变换矩阵,例如 RGCN(关系图卷积网络)或 HGT(异构图Transformer)。
6.4 边特征
许多空域模型可以自然融合边特征:GAT 的注意力计算可以加入边特征;也可以使用 GIN(图同构网络)中的边嵌入。
7. 总结
图卷积网络将深度学习的强大表达能力带入图数据,其发展脉络从严谨的谱域理论逐渐走向灵活、可扩展的空域邻居聚合。
- 谱域GCN 告诉我们图卷积的数学根基,一阶近似得到简洁而优雅的 GCN 层。
- 空域GCN 将问题抽象为消息传递框架,衍生出 GraphSAGE、GAT 等多种实用变体,支持归纳学习和大规模图。
无论从哪个视角出发,核心始终是:融合自身与邻域的信息,学习结构感知的节点表示。掌握这些基础模型,是进入图神经网络广袤世界的第一步。