先看效果:社交网络节点分类

下方是一个 7 节点的小型社交图。GNN 通过聚合邻居信息,把节点分到社区A(蓝色)社区B(橙色)。 点击任意节点查看预测结果,或点击"重新训练"重跑模型。

社交关系图
节点分类结果
训练完成后显示...

01 核心原理(大白话版)

你判断一个人的性格,不只看他自己——还要看他的朋友圈。朋友都是运动员,他大概率也热爱运动;朋友都是程序员,他可能经常熬夜。

GNN 做的就是这件事:让每个节点不只看自己的特征,还把邻居的特征"聚合"进来,反复几轮,最终每个节点都"知道"自己在整张图里的位置。

为什么普通神经网络处理不了图?

图有两个让普通神经网络头疼的特性:

节点数不固定

社交网络今天有 100 个人,明天加了一个,全连接层的输入维度就变了。CNN 要求固定尺寸的图像,MLP 要求固定长度的向量——图做不到这点。

没有顺序,只有连接

图里节点 A 和节点 B 的"距离"由边决定,而不是索引顺序。把节点打乱重排,图的结构没变,但普通神经网络会认为是完全不同的输入。

GNN 的核心思路:把图的结构(谁和谁相连)作为归纳偏置,通过消息传递(Message Passing)让每个节点聚合邻居信息,天然适应任意大小和结构的图。

消息传递:GNN 的核心操作

1
发送消息(Message)

每个节点把自己的特征向量沿边发送给所有邻居。边上可以附加权重,表示关系的强弱。

2
聚合(Aggregate)

每个节点收集来自所有邻居的消息,做一个"汇总"操作——常见方式有求和、取均值、取最大值。顺序无关,保证了对节点排列的不变性。

3
更新(Update)

把聚合结果和自身特征拼接,送入一个小神经网络(通常是一个线性层 + ReLU),得到新的节点表示。这就是一层 GNN 完成的事。

堆叠多层 = 扩大感受野

这和 CNN 堆叠卷积层的逻辑完全一样:

  • 第1层:每个节点感知直接邻居(1跳)
  • 第2层:每个节点感知邻居的邻居(2跳)
  • 第 k 层:每个节点感知 k 跳以内的整个局部子图

感受野类比:CNN 的感受野是图像上的一块区域,GNN 的感受野是图上以当前节点为中心的 k 跳子图。层数越多,能"看"到越全局的结构信息。

GNN 能做什么任务?

节点分类

判断社交网络中每个用户属于哪个社群;学术引用网络中每篇论文属于哪个领域。

边预测(链接预测)

预测两个节点之间是否会建立连接,用于推荐系统("你可能认识 TA")、蛋白质相互作用预测。

图分类

把整张图(例如一个分子)分类——这个分子有没有毒性?这段程序有没有漏洞?

图生成

生成新的图结构,例如设计满足特定性质的新分子、生成道路网络布局。

一步步构建 GNN

从图数据结构到消息传递到分类训练,逐步搭建。

第一步 表示图结构

用邻接矩阵和节点特征矩阵表示图。节点特征可以是度数、属性标签等。

第二步 手写消息传递

实现一层 Mean Aggregation:每个节点的新特征 = mean(自身 + 所有邻居的旧特征)。

第三步 加入可学习权重

消息传递后接一个线性变换 W + ReLU,参数通过反向传播学习。

第四步 节点分类训练

堆叠两层 GNN,最后接 Softmax 输出节点类别概率,用交叉熵损失训练。

02 代码

03 学术性讲解

消息传递的数学定义

设图 G = (V, E),节点 v 在第 k 层的表示为 h(k)v,消息传递框架(MPNN)定义为:

m(k)v = AGG({ MSG(h(k-1)u, h(k-1)v, euv) | u ∈ N(v) })
h(k)v = UPDATE(h(k-1)v, m(k)v)

其中 N(v) 是节点 v 的邻居集合,euv 是边特征(可选)。MSG、AGG、UPDATE 是可学习或固定的函数,不同的选择对应不同的 GNN 变体。

图卷积网络 GCN(Kipf & Welling, 2017)

GCN 是最经典的 GNN 变体,其传播规则为:

H(k) = σ( D̃-1/2 Ã D̃-1/2 H(k-1) W(k) )

其中 Ã = A + I(加自环),D̃ 是对应的度矩阵,W(k) 是第 k 层可学习权重矩阵,σ 是激活函数(如 ReLU)。 对称归一化 D̃-1/2 Ã D̃-1/2 消除了高度节点的梯度爆炸问题。

消息传递动画

观察消息如何在图上逐轮传播,感受野随层数扩大:

点击"播放"观察消息在图上逐层传播的过程

图注意力网络 GAT(Veličković et al., 2018)

GCN 中邻居权重固定(由度数决定),GAT 引入注意力机制,让模型自己学习"该更多关注哪个邻居":

αuv = softmaxu∈N(v)( LeakyReLU( aT [W hv ∥ W hu] ) )
h'v = σ( Σu∈N(v) αuv W hu )

∥ 表示向量拼接,a 是可学习的注意力向量。多头注意力(Multi-head Attention)进一步提升稳定性,和 Transformer 的注意力思路一脉相承。

过平滑问题(Over-smoothing)

叠加过多 GNN 层会导致所有节点的表示趋于相同——因为每层聚合都在做"平均化",层数越多,信息越被稀释。实验上 2-3 层 GNN 通常已经足够,超过 5 层反而效果下降。

解决思路:残差连接(初始特征拼接回每层输入)、DropEdge(训练时随机丢弃边)、跳跃知识网络(JK-Net,汇总每层表示)。

图的读出(Readout / Pooling)

节点分类任务直接用节点表示。图分类任务需要把所有节点表示汇聚成一个图级向量:

hG = READOUT({ h(K)v | v ∈ V })

常见 READOUT:全局均值池化、全局最大池化、可学习的 Set2Set、DiffPool(可微分层次池化)。

参数量分析

GCN 一层的参数只有权重矩阵 W(k)(维度 din × dout)和偏置,与图的节点数 |V| 和边数 |E| 无关:

参数量 = d_in × d_out + d_out(偏置)

这使得 GNN 可以在小图上训练、在大图上推理(归纳式学习,Inductive Learning),与传统谱图方法(参数量随节点数增长)形成鲜明对比。

GNN 与 CNN / Transformer 的关系

GNN vs CNN

CNN 是 GNN 在规则网格图(像素)上的特例:邻居是固定的上下左右像素,权重通过卷积核共享。GNN 把这个思路推广到任意图结构。

GNN vs Transformer

Transformer 可以看作"完全图上的 GAT":每个 token 都和所有其他 token 有边,注意力权重就是边权重。GNN 是在稀疏图上做同样的事,计算量更低。

经典 GNN 架构演进

GCN(2017)

谱图卷积的简化版,均值聚合 + 对称归一化,奠定了 GNN 的基本范式。适合半监督节点分类。

GraphSAGE(2017)

采样固定数量邻居,支持归纳式学习(训练后可泛化到未见过的新节点),适合超大规模图(Pinterest 用于推荐系统)。

GAT(2018)

注意力权重自动学习,不同邻居贡献不同权重,表达能力更强,在节点分类基准上全面超越 GCN。

GIN(2019)

图同构网络,理论上达到 Weisfeiler-Leman 图同构测试的上限,是图分类任务上表达能力最强的 GNN 变体之一。