4. 图神经网络基础回顾

分子图与社交网络、引文网络最大的不同在于:节点是原子,边是化学键,而化学键有单键、双键、三键、芳香键之分,原子有元素种类、杂化方式、形式电荷、手性等属性。这意味着把通用图神经网络直接搬到分子图上,必须回答一个核心问题——消息到底沿着什么传、传什么、怎么聚合、怎么更新。本节围绕消息传递范式这条主线,把 GCN、GAT、MPNN 三种典型模型放在分子图的语境下逐一对照,帮助你在后续建模时能判断“该选哪种、该改哪里”。

一、消息传递范式:一切 GNN 的统一骨架

消息传递(Message Passing)把图神经网络的每一层拆成两个动作:消息生成与传递、聚合与更新。对节点 v 在第 k 层,可写成:

m_v^(k) = AGGREGATE( { MESSAGE(h_v^(k-1), h_u^(k-1), e_uv) : u ∈ N(v) } )
h_v^(k) = UPDATE(h_v^(k-1), m_v^(k))

其中 h 是节点表示,e_uv 是边特征,N(v) 是邻居集合。这个骨架的关键在于:MESSAGE 决定“邻居传什么”,AGGREGATE 决定“怎么合并”,UPDATE 决定“新旧信息如何融合”。GCN、GAT、MPNN 的差异,本质上就是这三个函数的不同选择。

在分子图上,还有一个容易被忽略的约束:置换不变性。原子编号是人为的,交换两个原子的编号不应改变分子表示。因此 AGGREGATE 必须是求和、求均值、取最大值这类对顺序不敏感的操作,而不能是拼接后接全连接。

分子图上的消息传递:以乙醇 C–C–O–H 局部为例 ① 分子图输入 C₁ C₂ O H 单键 单键 单键 C, sp³ C, sp³ O, sp³ H, s ② 消息生成与传递(以 C₂ 为中心) M(h_C₁, h_C₂, e) M(h_O, h_C₂, e) ③ 聚合与更新 AGGREGATE sum / mean / max 置换不变 UPDATE GRU / MLP / 线性 融合旧表示 h_C₂⁽ᵏ⁾ 更新完成 已融合 C₁、O 的邻居信息 下一层继续向外扩散 三种模型的差异定位 GCN:固定权重 + 对称归一化 GAT:注意力权重 + 多头 MPNN:显式边网络 + 读出

二、GCN:固定权重的对称归一化聚合

GCN 把 AGGREGATE 取为邻居表示的加权求和,UPDATE 取为线性变换加激活。其单层公式为:

H^(k) = σ( D̃^(-1/2) Ã D̃^(-1/2) H^(k-1) W^(k) )
à = A + I,  D̃_ii = Σ_j Ã_ij

这里 A 是邻接矩阵,加 I 是为了让节点保留自身信息,D̃ 是度矩阵。归一化系数 1/√(d_i d_j) 的作用是抑制高度数节点对邻居的过度影响。放到分子图上,一个碳原子通常有 3~4 个邻居,度分布比社交网络窄得多,所以 GCN 的归一化在分子图上不会像在幂律图上那样剧烈压缩信号,这是它能在分子性质预测上稳定工作的原因之一。

但 GCN 的局限也很明显:权重只由度决定,与邻居的化学身份无关。对 C–C 键和 C=O 键,GCN 在聚合时给的是同一套归一化系数,无法区分“这个邻居是氧还是碳”。如果任务对官能团敏感(如预测羰基相关的反应活性),GCN 的表达能力就会受限。

三、GAT:用注意力区分邻居重要性

GAT 把 AGGREGATE 中的固定系数换成可学习的注意力系数:

e_ij = LeakyReLU( a^T [ W h_i || W h_j ] )
α_ij = softmax_j( e_ij )
h_i' = σ( Σ_j α_ij W h_j )

其中 a 是注意力向量,|| 表示拼接。GAT 通常使用多头注意力,把 K 个头的输出拼接或平均,以稳定训练。在分子图上,GAT 的优势是能自动学习“哪个邻居更重要”:例如在预测某原子的部分电荷时,模型可能给电负性更大的氧邻居更高权重,而给氢邻居较低权重。这种权重不是人工设定的,而是从数据中学到的。

需要注意的是,GAT 的注意力是节点对级别的,它没有显式使用边特征(键类型)。如果键类型对任务关键,需要在注意力计算中把边特征拼进去,这就自然过渡到 MPNN。

四、MPNN:把边特征显式纳入消息

MPNN(Message Passing Neural Network)是更一般的框架,它把 MESSAGE 写成同时依赖源节点、目标节点和边特征的三元函数:

m_ij = MESSAGE(h_i, h_j, e_ij)
m_i = AGGREGATE({ m_ij : j ∈ N(i) })
h_i' = UPDATE(h_i, m_i)

在分子图上,e_ij 可以直接编码键类型(单键/双键/三键/芳香键)、键长、是否共轭、是否在环上。一个常见的实现是用边网络把键类型嵌入成向量,再与节点表示拼接后送入 MLP。这样,C=O 和 C–O 在消息传递中就会产生不同的消息,模型能区分它们。

MPNN 还强调读出(Readout)阶段:节点表示更新若干轮后,需要一个置换不变的图级读出函数把节点表示汇总为分子表示,常用求和或注意力池化。对分子性质预测,读出后的向量再接入 MLP 回归头或分类头。

五、在分子图上适配时的关键选择

把上述模型落到实际分子任务时,有几个参数和设计点需要明确:

  • 层数(消息传递轮数):每多一层,节点就多看到一跳邻居。分子图直径通常较小(多数药物分子在 10 跳以内),层数取 3~5 层往往已覆盖大部分局部环境;层数过大会导致过平滑,所有原子表示趋同。
  • 隐藏维度:常用 64、128、256。维度太小欠拟合,太大在小数据集上容易过拟合。
  • 边特征编码:至少包含键类型;若数据提供键长、键角、立体信息,可一并编码。GCN 和 GAT 若不改结构,默认不使用边特征。
  • 聚合函数:求和保留邻居数量信息,均值对度不敏感,最大值突出显著邻居。分子任务中求和与均值都常用,可做消融对比。
  • 残差与归一化:在每层更新后加残差连接和 LayerNorm,有助于深层训练稳定。
一个实用的判断规则:如果任务只依赖原子局部环境且键类型影响不大,GCN 是轻量基线;如果邻居重要性差异明显但边特征简单,GAT 更合适;如果键类型、键长等边信息对目标有实质影响,优先选 MPNN 并显式编码边特征。

六、一个可对照的最小实现片段

下面给出 MPNN 单层消息传递的核心逻辑(PyTorch 风格伪代码),便于对照公式理解各函数的位置:

# h: [N, d] 节点表示, edge_index: [2, E], edge_attr: [E, d_e]
msg = edge_net(edge_attr)              # 边特征 -> 消息基
msg = msg * h[edge_index[0]]           # 与源节点表示结合
agg = scatter_sum(msg, edge_index[1], dim=0)  # 按目标节点聚合
h = update_net(torch.cat([h, agg], dim=-1))   # 更新
h = layer_norm(h + h_residual)         # 残差 + 归一化

对照前文公式可以看到:edge_net 与源节点结合对应 MESSAGE,scatter_sum 对应 AGGREGATE,update_net 对应 UPDATE。把 edge_net 去掉、把 scatter_sum 换成带归一化系数的加权和,就退化为 GCN;把聚合权重换成注意力系数,就接近 GAT。理解这条退化链,比单独记忆三个模型更有助于在分子建模中做取舍。

分子图是有向还是无向、是否加自环、边特征是否对称,都会影响消息传递的结果。工程上建议先固定一套约定(例如统一按无向图处理、每条键生成双向边、自环单独用自环边特征表示),再在消融实验中调整,避免不同实现之间无法比较。

小结一下:消息传递范式提供了统一视角,GCN 用固定归一化权重、GAT 用注意力权重、MPNN 用显式边网络,三者在分子图上的适配程度依次提高,代价是参数量和实现复杂度也依次上升。实际建模时,先用 GCN 建立基线,再根据任务对边信息和邻居区分度的需求,决定是否升级到 GAT 或 MPNN。