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 必须是求和、求均值、取最大值这类对顺序不敏感的操作,而不能是拼接后接全连接。
二、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,有助于深层训练稳定。
六、一个可对照的最小实现片段
下面给出 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。