GNN 图神经网络
让神经网络读懂"关系"——不只看单个数据点,还要看它跟谁相连、邻居是什么样的
✦ 先看效果:社交网络节点分类
下方是一个 7 节点的小型社交图。GNN 通过聚合邻居信息,把节点分到社区A(蓝色)或社区B(橙色)。 点击任意节点查看预测结果,或点击"重新训练"重跑模型。
01 核心原理(大白话版)
你判断一个人的性格,不只看他自己——还要看他的朋友圈。朋友都是运动员,他大概率也热爱运动;朋友都是程序员,他可能经常熬夜。
GNN 做的就是这件事:让每个节点不只看自己的特征,还把邻居的特征"聚合"进来,反复几轮,最终每个节点都"知道"自己在整张图里的位置。
为什么普通神经网络处理不了图?
图有两个让普通神经网络头疼的特性:
节点数不固定
社交网络今天有 100 个人,明天加了一个,全连接层的输入维度就变了。CNN 要求固定尺寸的图像,MLP 要求固定长度的向量——图做不到这点。
没有顺序,只有连接
图里节点 A 和节点 B 的"距离"由边决定,而不是索引顺序。把节点打乱重排,图的结构没变,但普通神经网络会认为是完全不同的输入。
GNN 的核心思路:把图的结构(谁和谁相连)作为归纳偏置,通过消息传递(Message Passing)让每个节点聚合邻居信息,天然适应任意大小和结构的图。
消息传递:GNN 的核心操作
每个节点把自己的特征向量沿边发送给所有邻居。边上可以附加权重,表示关系的强弱。
每个节点收集来自所有邻居的消息,做一个"汇总"操作——常见方式有求和、取均值、取最大值。顺序无关,保证了对节点排列的不变性。
把聚合结果和自身特征拼接,送入一个小神经网络(通常是一个线性层 + 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)定义为:
其中 N(v) 是节点 v 的邻居集合,euv 是边特征(可选)。MSG、AGG、UPDATE 是可学习或固定的函数,不同的选择对应不同的 GNN 变体。
图卷积网络 GCN(Kipf & Welling, 2017)
GCN 是最经典的 GNN 变体,其传播规则为:
其中 Ã = A + I(加自环),D̃ 是对应的度矩阵,W(k) 是第 k 层可学习权重矩阵,σ 是激活函数(如 ReLU)。 对称归一化 D̃-1/2 Ã D̃-1/2 消除了高度节点的梯度爆炸问题。
消息传递动画
观察消息如何在图上逐轮传播,感受野随层数扩大:
点击"播放"观察消息在图上逐层传播的过程
图注意力网络 GAT(Veličković et al., 2018)
GCN 中邻居权重固定(由度数决定),GAT 引入注意力机制,让模型自己学习"该更多关注哪个邻居":
∥ 表示向量拼接,a 是可学习的注意力向量。多头注意力(Multi-head Attention)进一步提升稳定性,和 Transformer 的注意力思路一脉相承。
过平滑问题(Over-smoothing)
叠加过多 GNN 层会导致所有节点的表示趋于相同——因为每层聚合都在做"平均化",层数越多,信息越被稀释。实验上 2-3 层 GNN 通常已经足够,超过 5 层反而效果下降。
解决思路:残差连接(初始特征拼接回每层输入)、DropEdge(训练时随机丢弃边)、跳跃知识网络(JK-Net,汇总每层表示)。
图的读出(Readout / Pooling)
节点分类任务直接用节点表示。图分类任务需要把所有节点表示汇聚成一个图级向量:
常见 READOUT:全局均值池化、全局最大池化、可学习的 Set2Set、DiffPool(可微分层次池化)。
参数量分析
GCN 一层的参数只有权重矩阵 W(k)(维度 din × dout)和偏置,与图的节点数 |V| 和边数 |E| 无关:
这使得 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 变体之一。