第四章 图神经网络基础:GCN 原理、消息传递与拉普拉斯矩阵

做 ADMET 预测这几年,我最大的感触是:分子不是一串特征,而是一张图。原子是节点,化学键是边。你想想看,传统的机器学习把分子摊平成向量,丢掉了结构信息,就像只看零件清单不看装配图——能猜个大概,但细节全没了。

所以这一章,我们得把图神经网络最核心的三块地基打牢:邻接矩阵与拉普拉斯矩阵(图怎么表示)、消息传递范式(信息怎么流动)、图卷积网络 GCN(经典模型怎么算)。硬啃公式容易晕,我会穿插一些自己踩过的坑,帮你把直觉建立起来。

4.1 邻接矩阵与拉普拉斯矩阵——图的“身份证”

先说最简单的表示。邻接矩阵 A 就是个 0-1 矩阵,节点间有边就填 1,没有就填 0。对于分子图,一般还加上自环(对角线为 1),因为节点自身的信息也要保留。

举个例子,一个 4 个原子的分子,若 1-2、2-3、3-4 有键,邻接矩阵长这样:

[[1, 1, 0, 0],
 [1, 1, 1, 0],
 [0, 1, 1, 1],
 [0, 0, 1, 1]]

但直接用 A 做卷积有个问题——度大的节点(连接多)特征会爆炸,度小的节点被淹没。于是我们引入拉普拉斯矩阵 L:

L = D - A

其中 D 是度矩阵(对角线上是每个节点的度)。更常用的是归一化拉普拉斯:

L_sym = D^{-1/2} L D^{-1/2} = I - D^{-1/2} A D^{-1/2}

为什么要归一化?我在做分子性质预测时,曾试过直接用拉普拉斯,结果分子量大的分子(节点多)预测偏差特别大。后来换成正则化拉普拉斯,梯度稳定多了。说白了,归一化是为了让每个节点不管邻居多少,都能“平等”地聚合信息。

矩阵类型公式用途
邻接矩阵 AA_{ij} = 1 if edge else 0原始图结构
度矩阵 DD_{ii} = ∑_j A_{ij}计算度数
拉普拉斯 LL = D - A频谱分析
归一化拉普拉斯L_sym = I - D^{-1/2} A D^{-1/2}GCN 标准输入
小技巧:在 PyG 或 DGL 里,你不需要手动构建这些矩阵。但理解它们能帮你调参——比如发现 GCN 训练不稳定,先检查一下邻接矩阵有没有加自环,归一化有没有做。

4.2 消息传递范式——GNN 的“通信协议”

现代图神经网络几乎都遵循消息传递(Message Passing)范式。想象这样一个场景:每个节点给自己所有的邻居发一条“消息”,邻居收到后汇总,再更新自己的特征。这个过程一般包含三步:

  1. 消息生成:每个节点用当前特征生成消息,有时还考虑边的信息。
  2. 消息聚合:节点把所有邻居发来的消息“收拢”在一起(求和、平均、最大等)。
  3. 节点更新:把聚合后的消息和节点自身特征结合,生成新的节点特征。

我曾经在构建分子图时犯过一个低级错误——没有把自环消息加上。结果第一层 GNN 后,每个节点只看到邻居信息,完全忘了自己。预测 logP 时误差直接翻倍。你想想看,分子里的碳原子能不能只看邻居?它自己的电子层结构同样重要啊。

形式化地,第 k 层的消息传递可写成:

m_v^(k) = AGGREGATE({W * h_u^(k-1), for u in N(v)})
h_v^(k) = UPDATE(h_v^(k-1), m_v^(k))

AGGREGATE 和 UPDATE 是两个可学习函数。不同的 GNN 变体主要是这两个函数的设计不同。

关键点:所有 GNN 架构(GCN、GAT、GIN、GraphSAGE)都跑不出消息传递这个骨架。你只要掌握了范式,换模型只是换聚合和更新函数。

4.3 GCN 原理解析——从谱域到空间域

图卷积网络(Graph Convolutional Network, GCN)是最经典的图神经网络,由 Kipf 等人提出。它的核心思想是:用频谱图卷积的一阶近似,变成一个简单的“邻居平均”操作。公式很简单:

H^(l+1) = σ( A_hat · H^(l) · W^(l) )

其中 A_hat = D_tilde^{-1/2} · A_tilde · D_tilde^{-1/2},A_tilde = A + I(加自环)。

拆解一下:

  • 加自环:A_tilde = A + I,让节点在聚合时包括自己。
  • 对称归一化:D_tilde^{-1/2} · A_tilde · D_tilde^{-1/2},防止度大的节点特征膨胀。
  • 特征变换:乘以可学习权重矩阵 W。
  • 非线性:激活函数 σ(通常是 ReLU)。

嗯,你可能会问:为什么不用更精确的频谱卷积?因为计算代价太高。GCN 用一阶切比雪夫近似,把复杂度从 O(N²) 降到了 O(|E|),在分子图上非常实用——分子节点数最多几百,但边数可能几千,这个近似在准确性和效率上取得了很好的平衡。

避坑指南:我曾经在 ADMET 数据上直接套用 GCN,发现对于孤立节点(分子中极少数原子没有连接重原子,比如氢原子被单独处理)效果很差。原因是归一化时度数为 1 的节点特征会被过度平滑。解决方案:要么在预处理时合并孤立节点,要么改用 GIN(图同构网络),它用 MLP 替代简单平均,对度的不均衡更鲁棒。

4.4 一张图看懂 GCN 消息传递流程

下面这张 SVG 总结了 GCN 单层的前向过程:从邻接矩阵归一化,到消息聚合,再到特征更新。我自己教学时经常画这张图,学生反馈“一看就懂了”。

GCN 单层消息传递流程 输入:邻接矩阵 A 节点特征 H^(l) 对称归一化 A_hat = D̃^{-1/2}·Ã·D̃^{-1/2} à = A + I(加自环) 消息生成与聚合 m_v = ∑_{u∈N(v)∪{v}} A_hat_{vu}·h_u (邻居加权求和) 特征变换 z_v = m_v · W^(l) W 是可学习权重矩阵 非线性激活 h_v^(l+1) = ReLU(z_v) 输出新节点特征 输出 H^(l+1) 维度:N × d_{l+1} 图卷积过程说明 ① 加自环并对称归一化邻接矩阵,保持数值稳定 ② 邻居特征加权求和,聚合局部信息(消息传递核心) ③ 线性变换 + 非线性激活,提取高阶特征
实践提示:在 PyTorch 中实现 GCN 层只需几行代码。调用 torch_geometric.nn.GCNConv 时,默认已经处理了归一化和自环。但如果你自己手写,一定要记得 A_hat = normalize(A + I),我见过不少人忘记加自环导致收敛慢。

4.5 为什么 GCN 适合 ADMET 预测?

分子图有几个特点:节点数少(几十到几百原子)、边稀疏(化学键很少)、标签通常与全局结构相关(比如毒性、渗透性)。GCN 的邻居平均操作天然适合这种局部→全局的信息传递。经过 2~3 层 GCN,每个节点的感受野覆盖整个分子,然后通过池化得到分子级表征。

我记得第一次在 Tox21 数据集上跑 GCN,对比之前用的 MLP 和随机森林,分类 AUC 从 0.72 直接跳到了 0.85。同事都惊了。其实就是因为 GCN 捕捉了官能团之间的相互作用——比如一个苯环上的取代基可以通过消息传递影响另一个官能团的电荷分布。

总结本章要点:
• 邻接矩阵 + 归一化拉普拉斯是图的“骨架”,必须处理自环和度均衡。
• 消息传递范式中,聚合函数的选择至关重要(求和 vs 平均 vs 最大)。
• GCN 通过一阶谱近似实现高效空间图卷积,适合中等规模分子图。
• 训练时注意孤立节点和过平滑问题,必要时换用 GIN 或添加残差连接。