资讯动态

MPNN分子图模型解析:消息传递实现量子化学性质预测

发布时间:2026/10/22 9:01:04 来源:尧图企业网站定制
做量子化学性质预测的朋友应该都有印象为了在成千上万个候选结构里快速估算能量我们试过分子指纹、试过手工描述符最后大多绕回到图神经网络这条路上。而在图神经网络的各种框架里MPNNNeural Message Passing for Quantum Chemistry几乎是所有分子图模型的共同起点。这个框架最早给我的感觉是看着很简单细想很颠覆。它没有发明什么复杂的数学工具只是把分子图上的信息传播方式重新抽象了一遍每个原子向邻居发消息邻居聚合消息后更新自己的状态多轮迭代后再汇总成分子性质。这套机制听上去像是化学常识的翻译但它确实横扫了一大堆传统分子表示方法也成了后来无数分子图模型的母版。这篇是这个分享系列的第一篇。我会把MPNN的动机、框架细节、特征工程和复现时容易踩的坑一次讲透。主要面向两类人一类是想把图神经网络用在自己的分子数据上、但不知道从何下手的初学者另一类是已经跑过几个GNN模型、但对为什么有效、为什么某些改法会翻车还缺乏系统理解的研究者。1. 从量子化学的痛点说起分子为什么要用图表示1.1 搜索化学空间时计算代价是最大的瓶颈分子性质预测这件事本质上是在化学空间里做搜索。候选分子可能有几万个甚至几百万个你希望从中筛选出能量低、能隙合适、稳定性好的结构。但每算一个分子的精确性质都意味着一次从头计算解近似薛定谔方程或者做自洽场迭代。单算一个分子可能几分钟到几小时乘上候选数量之后这个方案在成本上就几乎不可行了。数据驱动方法的介入点就在这里先算一批分子作为训练集让模型学习从分子结构到性质的映射之后用训练好的模型去快速预测新候选分子。关键问题是分子该怎么表示才能让模型高效地学到这种映射早期常用的是分子指纹加随机森林或者手工设计大量物理化学描述符再接树模型。这些方法在简单任务上能用但一到需要考虑结构微小变化导致性质剧变的场景就开始露怯。苯环上加一个取代基整个分子的电子分布都变了而固定长度的指纹向量里这种全局变化只表现为少数几个位翻转信息损失非常大。1.2 图表示天然携带拓扑信息分子本身就是一张图原子是节点化学键是边。这个表示保留了元素类型、连接方式、键级、环结构、芳香性等关键信息而且不依赖分子在空间中的朝向天然满足平移不变性。用图做输入等于把分子的拓扑结构原封不动地交给模型而不是先压扁成一个向量再让模型去猜哪里重要。图神经网络的归纳偏置和化学直觉高度一致每个原子主要受到周围邻居的影响远端原子通过多跳关系间接作用。消息传递相当于在分子的连接关系上做局部信息交换每一轮交换扩大一跳范围。对于大多数有机分子来说直径不过十几跳几轮消息传递之后模型就有机会感知整个分子的全局结构。这种局部起步、逐层扩散的表达方式恰好匹配分子性质主要由局部电子环境决定、同时又存在远程共轭效应的真实规律。1.3 MPNN是各类图模型的共同母版MPNN最初是为了统一当时分散的各种图模型写法而提出的抽象框架。它的核心贡献不是某个惊艳的模型结构而是把图神经网络该怎么做拆成了两个明确阶段先做多轮消息传递更新节点状态再把节点状态汇总成整图输出。这个抽象看似平淡却让实验设计变得异常清晰。以前大家写模型总觉得是在堆层现在则是在设计消息函数、更新函数和读出函数每一步都对应可解释的物理含义。我最初接触这个框架时觉得它什么都能往里塞的通用性有点震撼。后面你会发现GCN、GraphSAGE这些模型本质上都能改写成MPNN框架下的若干特例。理解MPNN再去读后来的论文很多操作一眼就能归位到这里换了消息函数那里换了聚合方式不再是一团浆糊。2. MPNN框架拆解消息传递与读出两个阶段2.1 形式化定义与记号先把记号约定清楚。输入是一个分子图 G(V,E)V是原子集合E是化学键集合。每个原子 v 在第 t 轮有一个隐藏状态 h_v^t每条边 (v,w) 有一个特征 e_vw。初始状态 h_v^0 由原子本身的属性编码而来边特征由化学键的属性编码而来。消息传递阶段在 t1 到 tT 之间循环。每一轮对所有节点 v 执行下面的操作m_v^(t1) Aggregate({ M_t(h_v^(t), h_w^(t), e_vw) | w ∈ N(v) }) h_v^(t1) Update_t(h_v^(t), m_v^(t1))用大白话翻译每个原子 v 先对邻居 w 逐个调用消息函数 M_t生成一条消息把所有邻居消息用一个聚合操作合并起来再用更新函数 Update_t 把这个聚合结果跟 v 上一轮自己的状态揉到一起得到新一轮隐藏状态。这个过程和局部环境影响原子性质的化学观念几乎一一对应。初始状态是原子的孤立印象第一轮消息传递后每个原子知道了直接键连的邻居第二轮后知道了隔一个键的原子T 轮之后节点状态已经隐式编码了周围 T 跳范围内的结构环境。对大部分分子来说T 取 3 到 4 就足以覆盖可影响目标性质的主要结构片段。2.2 消息函数与更新函数可以自由组合MPNN的精髓在于 M_t 和 Update_t 可以自由设计。后面涌现的大量图模型差异基本都落在这几个选择上消息怎么生成、邻居怎么聚合、节点状态怎么更新。常见模型在MPNN框架下的对应选择关键差异GCN消息函数≈归一化线性变换聚合求和没有显式的边特征参与GraphSAGE消息邻居采样后聚合更新拼接后过MLP用采样控制邻居规模图注意力网络消息注意力权重加权的邻居特征权重由数据动态学出MPNN完整版消息MLP(当前节点, 邻居, 边特征)边特征显式参与分阶段设计实际做分子预测时我建议第一版模型别追花哨模块。先把最简单的实现跑通把数据接口和训练管线打通再逐个替换消息函数、更新函数和读出方式每一步都直接看验证集误差的变化。这种增量式改法远比一上来就堆复杂设计更容易定位问题也更容易积累哪种结构在我的任务上真的有用的经验。2.3 读出阶段把原子状态汇总成分子的性质消息传递结束后每个节点 v 带着更新后的隐藏状态 h_v^T。读出阶段的任务是把这些节点级表示汇总成一个分子级表示再接回归头或分类头输出目标值。最简单的读出是求和或取平均。求和适合可加性的物理量因为很多分子性质近似等于原子贡献的累加例如原子化能取平均适合与分子大小不直接相关的性质。更复杂的设计包括注意力池化和set2set但在很多分子性质任务上提升并不明显却显著增加了训练不稳定性。这里有一个容易忽略的细节读出阶段的选择会决定模型能否输出带方向的性质。比如偶极矩是矢量如果读出处只是对所有节点特征做无脑求和输出就无法跟随分子旋转而正确变化。等变性这个坑我在第4部分会专门展开。3. 特征工程与关键参数分子图建模的取舍3.1 原子特征与键特征的常用配置我在复现和实验中反复调整过特征组合下面这套配置是比较稳的起点。注意它只是一个初始推荐不同数据集上值得再做消融实验。特征类别常用特征编码方式备注原子基础信息原子序数元素种类one-hot必须决定元素类型原子局部结构氢原子数、度相邻原子数整数归一化或one-hot影响配位与杂化环境电子性质价电子数、电负性、孤对电子数连续值帮模型感知化学活性结构标记芳香性、是否在环内0/1对共轭体系很重要键类型单键/双键/三键/芳香键one-hot必须区分键级键上下文是否共轭、是否在环内0/1影响π体系的性质可选几何量键长、键角连续值引入时注意等变性这些特征不只是填进去就完事得做排除实验才知道哪些真正起作用。我自己的体会是去掉芳香性标记后含苯环分子的能量预测误差明显变大去掉电负性模型对极性键的响应会变钝。特征层面的小改动往往比换一个花哨模型结构对最终误差的影响更大这也是为什么我建议特征工程要排在模型设计前面。3.2 消息函数和聚合方式怎么选最简单的可靠消息函数是两层MLP输入拼接当前节点状态、邻居状态和边特征输出一个消息向量。def message_function(h_v, h_w, e_vw): concat torch.cat([h_v, h_w, e_vw], dim-1) return mlp(concat) # 两层MLP def aggregate(messages): return torch.sum(torch.stack(messages, dim0), dim0)聚合方式的选择要结合任务特性。对于原子化能这类大致可加和的性质求和聚合通常更好因为它保留了原子数越多贡献越大的信息对只需要判断分子整体性质的分类任务均值聚合往往更稳定最大聚合信息损失较大但在判断是否存在某种极端局部结构的场景下反而有用。复杂消息函数并不总是划算。注意力机制可以软性决定谁更重要但在分子这种十几二十个节点的小图上它的优势未必体现得出来。我在公开分子数据集上做的消融结果是简单MLP消息函数表现已经相当好换成注意力机制带来的提升往往不超过几个百分点训练时间和显存占用却翻倍。所以建议先做简单基线再考虑增量。3.3 消息传递轮数不是越多越好分子图直径并不大理论上消息传递轮数覆盖全图直径后每个节点都能感知整个分子。但实际训练中T 加到一定程度后节点表示会趋于同质化这就是图神经网络里常说的过平滑。我测试过一个直观的趋势T 从 1 增加到 3 时验证误差明显下降从 3 增加到 4变化很小加到 5 之后性能反而下滑。节点表示的余弦相似度在第 4 层以后迅速升高说明信息已经开始被抹平。如果确实需要更长距离的信息优先考虑引入全局特征作为额外输入而不是继续加深消息传递。分子质量、总电荷、官能团计数这些宏观量往往比多跑两轮消息传递更直接地帮助预测。4. 复现MPNN时绕不开的坑等变性、过平滑与评估陷阱4.1 能量和偶极矩对坐标的要求完全不同复现MPNN时最容易踩的认知坑是没有分清预测目标对等变性的要求。能量、自由能这类标量是平移不变、旋转不变的分子挪个位置、转个方向能量不变。因此模型输入里不能依赖绝对坐标否则同一个分子换个位置就会被当成不同样本模型必须额外学一个本不该存在的映射。偶极矩则不然。它是矢量分子旋转时偶极矩分量要跟着旋转这叫等变性。如果你用一个固定坐标系下的多层感知机去回归偶极矩的三个分量训练集和测试集稍微有旋转差异误差就会爆炸。我的处理办法是标量性质模型的特征里坚决不放三维坐标只放图拓扑和原子属性矢量性质模型的读出处用原子坐标作为权重系数让输出跟着体系旋转。训练完成后用随机旋转的测试集做一遍验证能很快发现模型是否学到了正确的等变行为。这种用旋转测试来检验物理对称性的检查手段比单纯看验证集MAE可靠得多。4.2 过平滑导致深层模型反而更差有一回我把消息传递轮数从 3 调到 6验证集MAE直接升了20%以上。一开始怀疑特征编码有问题后来把每一层节点表示的余弦相似度统计出来发现第 4 层之后所有原子表示越来越像确实是过平滑在捣乱。缓解措施里效果从好到差依次是控制轮数、加残差连接、对节点特征做LayerNorm、给消息MLP加Dropout。尤其LayerNorm在分子任务上的稳定效果让我印象深刻它几乎不需要调参叠加到消息更新里就能让训练肉眼可见地变稳。还有一个训练细节容易忽略消息传递轮数越多梯度回传路径就越长越容易出现梯度消失或爆炸。我统一把梯度裁剪阈值设成 1.0 左右配合余弦退火学习率整个训练过程会稳健很多。4.3 标签尺度不处理损失函数被大数主导量子化学数据集的回归目标数值范围非常夸张。原子化能动辄相差几十到几百电子伏特直接拿原始值做回归损失函数会被大样本主导模型学到最后基本只会输出一个平均答案。我后来的标准做法是先做标签标准化减去均值、除以标准差训练完成后再反标准化还原预测值。另一个更贴合物理的做法是预测差值即分子总能量减去所有独立原子能量之和。这个目标尺度小、物理意义明确但要求数据集里提供参考原子能量并不是所有数据集都现成。标准化这个改动看起来小儿科实际效果却非常显著。收敛速度肉眼可见变快最终误差也明显下降。在复现MPNN的过程中这是我做过性价比最高的一步改动。4.4 随机划分会让评估结果虚高整个复现经历里最大的暗亏出在评估方式上。最早我按随机划分训练测试集验证MAE很漂亮后来换成按分子骨架划分同一个模型的误差几乎翻倍。原因不复杂。随机划分时测试集分子往往和训练集共享骨架模型可以靠记忆组合蒙对答案按骨架划分后测试集里的分子骨架在训练中从未出现过模型必须真正学会结构到性质的映射才能答对。真实场景里药物筛选、材料设计遇到的几乎都是后者。一个很实际的判断标准如果模型在随机划分上表现良好但面对训练集没见过的骨架变体时误差显著上升说明评估设计本身比模型结构更需要反思。所以我的建议是任何分子模型的比较实验至少同时给出随机划分和骨架划分两组结果。只展示随机划分数字的论文或报告保持警惕。5. 效果实测与下一步在哪里5.1 在公开分子数据集上的对比结果在公开的量子化学分子数据集通常简称QM9上我对比过几类基线分子指纹加随机森林、普通GCN、GraphSAGE、以及MPNN框架下消息函数经过专门设计的模型。分子性质预测任务里MPNN类模型比指纹加随机森林有数量级级别的误差下降。GCN这类早期图模型比指纹基线好一截但通常不如在消息函数上做过优化的MPNN变体。原因倒不是MPNN有什么魔法而是它把消息函数、更新函数拆开设计让模型能针对分子的局部化学环境做更细致的建模。需要强调的是这类数据集里的分子普遍较小样本分布相对集中。它能证明模型的拟合和一定泛化能力但不等于模型在外推到新骨架、更大分子时仍然可靠。真正落地时数据覆盖度往往比模型结构更值钱。5.2 给新任务的最小可用方案如果你要从零开始做一个新的分子性质预测任务我建议不要一上来就攒大模型。先跑通一套最小可用方案原子和键特征用前面表格里的基础配置消息函数用两层MLP加求和聚合消息传递轮数设为3读出用求和或均值标签做标准化评估用骨架划分。这套组合跑通之后再逐项做增量。先换读出再换消息函数再调特征每一步都用验证集说话。绝大多数场景下特征工程和评估设计带来的提升远大于模型结构的炫技。5.3 本系列的路线图这一篇把MPNN的动机、框架和复现要点讲清楚属于第一部分。下一篇我打算把代码层面完全展开从分子的图构建和特征编码开始到消息传递循环与读出头的实现再到训练脚本和评估流程给出一个可以复现、也容易改造成自己数据集的完整示例。第三部分再聊聊MPNN在药物分子性质、材料筛选等场景的实际应用以及注意力机制、等变图网络这些变体分别解决了什么问题。看完这篇如果有什么地方和你的实验体会不一致或者有更好的特征配置欢迎在评论区交流。下一篇我们直接在具体代码里见。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑