8.1 分子表征学习:从指纹到图神经网络 本节摘要:图神经网络(GNN)让模型从数据里自己学出分子表示:消息传递把邻居信息聚合进每个原子的向量,读出函数把原子向量汇成分子向量,任务头在其上做预测。本节拆解消息传递的机制,给出一个可运行的分子性质分类最小模型,并示范"指纹基线对决"这一深度时代的基本修养。 AI 编目员上岗第一课。第4章你亲手挑描述符、算指纹;本节把这些活交还给模型——表示不再手工设计,而是随任务一起训练。这不是替代关系:理解手工特征,正是判断学得特征好坏的参照系。 让模型自己长出描述符 嵌入是深度学习的通用语:把对象变成稠密向量,让"语义相近"翻译成"向量相近"。分子表征学习的目标,就是把每个分子映到一个向量,使预测任务需要的结构信息都装在里面。
本节摘要:图神经网络(GNN)让模型从数据里自己学出分子表示:消息传递把邻居信息聚合进每个原子的向量,读出函数把原子向量汇成分子向量,任务头在其上做预测。本节拆解消息传递的机制,给出一个可运行的分子性质分类最小模型,并示范"指纹基线对决"这一深度时代的基本修养。
AI 编目员上岗第一课。第4章你亲手挑描述符、算指纹;本节把这些活交还给模型——表示不再手工设计,而是随任务一起训练。这不是替代关系:理解手工特征,正是判断学得特征好坏的参照系。
嵌入是深度学习的通用语:把对象变成稠密向量,让"语义相近"翻译成"向量相近"。分子表征学习的目标,就是把每个分子映到一个向量,使预测任务需要的结构信息都装在里面。图神经网络做这件事的先天优势是输入形态正确——分子本来就是图(2.2 节),GNN 直接吃图,不必先压扁成定长指纹再丢失信息。
消息传递是 GNN 在图上学习的基本动作,一轮传递分三步。第一步,收集:每个原子看看自己的直接邻居。第二步,聚合:把邻居们的当前表示按某种方式汇合(求和、取平均、取最大——求和最常见,因为它区分一个双键和两个单键)。第三步,更新:用自己的旧表示加聚合结果,算出新表示。跑两三轮传递,每个原子的表示就装下了半径二以内的环境——这正是 4.2 节摩根指纹半径二的手工对应物:指纹把环境哈希成一位,GNN 把环境映射成一个连续向量,后者信息量大得多,也 task-aware 得多(训练信号会引导它关注对任务有用的环境)。读出是最后一跃:把全部分子的原子向量汇合成分子向量(求和或注意力加权),交给分类或回归头。

背景。同事听说图模型万能,想把项目数据集(约两千个分子,二分类标签"能否穿越血脑屏障")直接交给一个三层图同构网络。你的任务不是拒绝,而是立一场公平对决:同一个骨架划分下,GNN 对阵 4.2 节的摩根指纹加随机森林。
操作。图模型一侧的最小实现(图学习框架风格):
import torch from torch_geometric.nn import GINConv, global_add_pool class TinyGNN(torch.nn.Module): def __init__(self, n_atom_feats, hidden=64): super().__init__() self.conv1 = GINConv(torch.nn.Sequential( torch.nn.Linear(n_atom_feats, hidden), torch.nn.ReLU(), torch.nn.Linear(hidden, hidden))) self.conv2 = GINConv(torch.nn.Sequential( torch.nn.Linear(hidden, hidden), torch.nn.ReLU(), torch.nn.Linear(hidden, hidden))) self.head = torch.nn.Linear(hidden, 1) def forward(self, x, edge_index, batch): h = torch.relu(self.conv1(x, edge_index)) h = torch.relu(self.conv2(h, edge_index)) return self.head(global_add_pool(h, batch)) # 读出:求和汇成分子向量
基线一侧:两千位摩根指纹进随机森林(第5、6章的老配方)。两边同用骨架划分、同报 AUC。
结果。典型量感:随机划分下 GNN 约 零点八九、指纹基线约 零点八七;骨架划分后 GNN 掉到零点七六,基线掉到零点七四。GNN 赢,但赢的是零点零几——而训练成本、调参时间、可解释难度全面倒挂。
解读。这场对决的读法比结果重要。其一,基线不立,深度不谈:多数中等规模数据集上,指纹加树模型的基线极难击败——深度学习的收益要靠数据量与结构信息量撑(百万级样本、三维任务、多任务共享才逐渐拉开差距)。其二,骨架划分后大家都掉分,说明基线时代的好成绩同样有近亲水分——6.2 节的纪律对深度模型原样适用。其三,GNN 的真实优势场景是端到端多任务:多个性质共享一套嵌入,特征工程消失,加新任务只加一个头——工业界用它不是为了单点精度,是为了流水线统一。给同事的结论:这个数据集用基线,把算力省下来留给数据量上百倍的项目。
变式。三个常见的进阶方向。预训练嵌入:用 8.3 节的预训练图模型或化学语言模型产出向量,再接浅层分类头——少标签数据集的实际首选;三维感知网络:把坐标与距离塞进消息传递(等变图网络),构象敏感的性质(对接打分、量子属性)由此起飞;注意力可视化:哪条边、哪个原子在传递中权重大,可给化学家当"模型在看哪"的线索——解释是线索不是证据,别忘了 6.2 的立场。
图模型不是默认选项,给它排一个量级对号表。
百级样本(几十到几百):别想深度。理化描述符加线性模型、或指纹加正则化回归是天花板;此时数据一点都不能浪费在验证集上,交叉验证加简单模型才是正解。千级样本(本项目所在量级):基线为王的时代,GNN 可以试但预期收益按零点零几计;真正的决策点是"多任务"——若有四五个性状要同时预测,共享底座的图模型开始划算,特征工程的人力省下来是真金白银。万级到十万级:深度方法的主场开启,表征学习对指纹的差距拉开到可感;预训练编码器(8.3 节)作为初始化几乎必选。百万级以上:手工特征全面退居基线角色,端到端表征加预训练是标准配置。
这张表的另一面是三个高频坑。坑一,网络加深不加脑:分子图小而规整,三四层消息传递已覆盖多数任务的感受野,盲目加深徒增过拟合面。坑二,泄漏走批处理暗门:按分子随机切分却忘了同一实验批次的信息关联(同板、同浓度系列的样本高度相关),切分口径要连批次一起考虑——第6章的划分纪律在图学习里的变体。坑三,只报均值不报方差:随机种子一换,图模型成绩波动常超过基线与它的差距,五种子均值加标准差是发表与汇报的诚实底线。