第 21 天 · 各种图神经网络,其实都在传消息
一句话
论文提出消息传递神经网络(MPNN)框架,指出此前 8 种图神经网络都是它的特例。作者在框架内组合出新变体,在 QM9 分子性质预测的 13 个目标中有 11 个达到化学精度。
论文讲了什么
结论先行:这篇论文做了两件事。第一,它给图神经网络提供了一套统一的语言:传消息、更新节点、读出整图。第二,它用这套语言系统地搜索设计空间,在分子性质预测上大幅超过此前的方法。
问题。化学家用密度泛函理论(DFT)计算分子的能量、偶极矩、轨道能级。每个分子都要消耗大量 CPU 时间。如果神经网络能快速给出接近 DFT 的结果,就能筛选大量候选分子。分子天然是图:原子是节点,化学键是边。原子没有固定顺序,所以模型输出不能依赖节点编号。
方法:MPNN 框架。每个节点 v 有一个隐状态 h_v。模型先做 T 轮消息传递,再做一次读出:
- 消息函数:
m_v = Σ_{w∈N(v)} M(h_v, h_w, e_vw)。节点 v 从每个邻居 w 收一条消息,消息内容取决于两端节点和边特征e_vw,然后求和。 - 更新函数:
h_v ← U(h_v, m_v)。节点用收到的消息更新自己。 - 读出函数:
ŷ = R({h_v})。把所有节点的最终状态合成整图的预测值。R 必须与节点顺序无关。
作者把 Duvenaud 的分子指纹、门控图神经网络(GG-NN)、交互网络、深度张量网络、Kipf 的图卷积网络等 8 种模型逐一写成 M、U、R 的具体选择。
最佳组合。
- 边网络(edge network)做消息函数:
M(h_v, h_w, e_vw) = A(e_vw) h_w。A 是一个神经网络,输入边特征,输出一个 d×d 矩阵。键的类型和原子间距离因此能决定信息怎样变换。 - GRU 做更新函数:来自 GG-NN,各轮共享权重。
- Set2Set 做读出函数:来自第 16 天的 Order Matters,用注意力反复读取节点集合。
作者还试了两项改进。虚拟元素:加一个连接所有原子的"主节点",或在不成键的原子之间加虚拟边。塔结构(towers):把 d 维状态切成多份分别传消息,降低 d×d 矩阵的计算量。
关键结果。QM9 数据集约有 13.4 万个有机小分子,每个分子最多 9 个重原子(C、N、O、F),提供 13 个 DFT 计算的性质。论文用"误差 ÷ 化学精度"作为指标,小于 1 即达标。最佳 MPNN 在 13 个目标中的 11 个达到化学精度。实验还表明:输入原子间的空间距离、显式加入氢原子,都能显著降低误差。
关键概念
- 消息传递神经网络(Message Passing Neural Network, MPNN)
- 一个描述图神经网络的通用框架,由消息函数 M、更新函数 U、读出函数 R 组成。很多图模型只是这三个函数的不同选择。
- 读出函数(readout function)
- 把所有节点的最终隐状态合成一个整图向量的函数。它必须与节点顺序无关,最简单的选择是求和。
- 边网络(edge network)
- 论文的最佳消息函数。一个神经网络读入边特征,输出 d×d 矩阵,再乘以邻居状态。不同的键和距离因此对应不同的变换。
- Set2Set
- Vinyals 等人提出的集合读出方法。它用 LSTM 生成查询,多轮注意力读取节点集合,比直接求和更有表达力。
- 化学精度(chemical accuracy)
- 化学界认为有实用价值的误差上限,每个性质各有阈值。论文把误差除以这个阈值报告,比值小于 1 即达标。
- QM9 数据集
- 约 13.4 万个最多含 9 个重原子的有机小分子,每个分子带 13 个 DFT 计算的量子化学性质,是分子机器学习的标准基准。
历史位置:为什么值得读
2017 年之前,图神经网络各说各话。分子指纹、GG-NN、图卷积网络、交互网络各有一套记号和动机。研究者很难看出它们的共同点,也很难比较优劣。这篇论文给了一套共同语言,此后"消息传递"成为图学习的标准说法。PyTorch Geometric 的核心基类就叫 MessagePassing,要求用户实现 message 和 update 两个方法。
它影响了两条后续路线:
- 分子与材料:SchNet、DimeNet,以及之后的等变图网络(NequIP、MACE)都沿用了"沿边传消息、用距离调制消息"的思路。
- 通用框架:2018 年的图网络(Graph Networks)综述进一步把边状态和全局状态也纳入更新。
它和清单里其他论文关系密切。第 19 天的关系网络相当于在完全图上做一次消息传递,再用求和读出。第 16 天的 Set2Set 在这里被用作读出函数。作者之一 Oriol Vinyals 也是第 16 天和第 18 天论文的作者。读完这三篇,你会看到 Google 团队在 2015–2017 年怎样一步步建立"处理集合与图"的工具箱。
学前准备
- 理解 GRU 的更新门和重置门(可回看第 2 天的 LSTM)
- 知道图的邻接表示:节点、边、邻居
- 理解 Set2Set 的注意力读出(先看第 16 天)
- 会用 PyTorch 的 index_add_ 或 scatter 按索引求和
在原仓库怎么学
- 运行 setup.py:检查依赖,设置随机种子,检测设备。
- 阅读 data/README.md:了解仓库使用的合成分子数据。
- 阅读 implementation.py:对照论文找出消息函数、GRU 更新、Set2Set 读出三部分。
- 按顺序做 exercises/ 里的 5 个练习:
exercise_01_message_functions.py实现 3 种消息函数,exercise_02_graph_construction.py从原始数据构建分子图,exercise_03_readout_functions.py实现求和读出与 Set2Set,exercise_04_edge_networks.py实现输出矩阵的边网络,exercise_05_property_prediction.py完成多目标回归训练。 - 对照 exercises/solutions/ 检查实现。
- 运行 train_minimal.py:用
--message-type切换消息函数,用--readout切换读出方式,用--n-messages改变传递轮数,用--epochs 2快速试跑。 - 用 visualization.py 画分子图、消息流动、训练曲线和各性质误差,并查看 plots/ 里的训练曲线。
- 最后用 notebook.ipynb 串起全流程。
今天再看
消息传递仍是图学习的主干。2026 年,药物发现和材料模拟里的机器学习势函数大多基于消息传递,例如 MACE 和 DeepMind 用于材料发现的 GNoME。
它和大语言模型的联系很直接。Transformer 可以看成在"所有 token 互相连接的完全图"上做消息传递,注意力权重决定每条消息的分量。图 Transformer 则把两者合并:在图结构上加注意力,或把图的边信息编码进注意力偏置。
MPNN 也有已知的局限。Xu 等人 2019 年证明,标准消息传递的区分能力不超过 1 阶 Weisfeiler-Lehman 图同构测试。层数一多,节点表示会趋于相同,这个现象叫过平滑(over-smoothing)。后续很多工作都在解决这两个问题。
容易卡住的地方
- 批处理大小不同的图时出错:把多张图的节点拼成一个大张量,边索引加上节点偏移,再用 batch 向量记录每个节点属于哪张图。读出时按 batch 分组求和。
- 边网络显存爆炸:每条边要生成一个 d×d 矩阵。先把隐藏维度设为 32 或 64 跑通,再放大;这也是论文提出塔结构的原因。
- 13 个目标的数值尺度差别很大:训练前对每个目标单独标准化到均值 0、方差 1,否则大尺度目标会主导损失。
- 看不懂论文结果表:表中数字是误差除以化学精度的比值,不是原始误差。小于 1 表示达到化学精度。
延伸阅读
- 原论文:Neural Message Passing for Quantum Chemistry
- 原仓库第 21 天目录:21_Neural_Message_Passing/ —— 代码、笔记本、练习与答案(英文)
- Gated Graph Sequence Neural Networks —— MPNN 采用的 GRU 更新来自这里
- Order Matters: Sequence to sequence for sets —— Set2Set 读出的原论文,即第 16 天
- SchNet —— 用连续距离滤波传消息的分子模型
- How Powerful are Graph Neural Networks? —— 消息传递表达能力的理论上限