ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

FGBench:官能团级分子性质推理基准,让图神经网络从黑箱走向可解释

FGBench:官能团级分子性质推理基准,让图神经网络从黑箱走向可解释 分子性质预测这几年算是被图神经网络和预训练模型轮番“喂”了一遍。GNN从原子级表示出发把分子当成一袋子原子和键消息传递玩了几轮能预测的内容越来越多指标也越来越好。可当你真的要用模型辅助药物设计或者材料筛选的时候还是会遇到一个特别拧巴的问题模型跟你说这个分子logP很高但你要它解释“到底是哪个片段把logP顶上去了”它就支支吾吾答不上来。FGBench这个工作就是想用一套数据集和基准把“官能团级别的分子性质推理”这个命题真正立住。如果你常年混迹于化学信息学和AI制药圈子应该能感觉到这几年分子机器学习最大的痛点已经不再是“拟合能力不够”而是“建模粒度太粗解释能力太弱”。FGBench做的事情很简单也很直接它不再让模型把整个分子看成一个纯原子图而是把官能团——也就是化学家真正关心的那些子结构比如羟基、羧基、羰基、氨基——作为显式的中间表示塞进学习和评测流程。这个方向适合谁我觉得有三类人最该关注一类是做分子表示学习和图神经网络算法研究的一类是做ADMET预测、先导化合物优化等落地项目的计算化学/制药从业者还有一类是单纯想找一个更接近化学直觉的基准来做模型对比的评测爱好者。这篇文章就把我对FGBench从设计思路到复现踩坑的全过程原原本本写下来。1. 为什么需要官能团级别的推理基准1.1 现有分子机器学习模型的“黑箱短板”先说说我为什么对这个工作产生兴趣。过去几年大家默认的分子建模路子就是分子图作为输入原子作为节点共价键作为边然后让GNN在里面做消息传递最后整个图池化成一个向量再连几个全连接层输出性质。从Chemprop到GIN从MPNN到GraphTransformer基本都没跳出这个框架。这个框架的问题在于模型把“官能团”当成了需要自己从海量数据里隐式学习的东西。你可以想象一个场景刚入行的小孩看分子图一眼看到苯环看到酰胺键看到末端羟基这些官能团对他来说就是先验知识。但GNN不是它把每个原子一视同仁地看苯环上的碳和其他碳都是“碳”官能团边界对它来说是不存在的。模型确实可以通过大量数据学到“某些原子组合模式频繁出现并且和某种性质相关”但这种隐式学习有几个明显的副作用。第一个副作用是数据效率差。模型要发现一个官能团对某种性质的贡献必须在无数个包含这个官能团的分子上反复“踩点”才能把权重视为足够高。官能团种类多了以后每个组合都稀疏得可怜小样本场景下基本学不动。第二个副作用是迁移性差。一个模型在A数据集上学会了“羰基提高熔点”这种规律换到B数据集羟基的引入可能又完全变了因为没有一层显式的结构抽象来承载这种规律。第三个副作用也是最致命的没法解释。真实药物设计场景里给一个干巴巴的预测值往往不够化学家想知道为什么会高会低是哪个片段贡献了正方向哪个片段在拖后腿。传统GNN的梯度或注意力权重虽然能勉强定位到某些原子但和官能团的语义层级完全不对齐别人看不懂也不服。我经常在内部评审的时候听到这样的问题你这个模型效果看着不错能不能告诉我它预测的这个分子哪个基团是氯原子毒性的来源模型通常答不上来或者答非所问。FGBench瞄准的正是这个缺口。1.2 把“官能团”变成模型的一等公民FGBench的核心主张我理解下来就一句话官能团不应只是分子的“注释信息”而应该是推理链路上的显式节点和显式监督。化学家画一个分子从来不是从原子的角度“我画一个碳接着一个氢”这样画的而是“这里接一个氨基那里接一个氟代甲基中间是一个苯环骨架”。官能团天然就是化学知识的基本语言。FGBench想让模型也使用这种语言。具体来说它把官能团作为分子图上的一个层级结构分子由若干官能团片段组成官能团之间通过连接点接在一起形成一个“片段级图”。模型无论是预测性质还是生成解释都基于这个片段级图来推理而不是直接处理原子级图。这种设计有几个直接的好处。其一模型的归纳偏置和化学知识对齐了学习难度显著降低尤其是在数据量不大、分子结构复杂的情况下。其二显式官能团节点本身就可以作为解释答案的“词语”输出“因为含有羧基所以酸性增强”这比输出一堆原子级别的注意力权重要友好得多。其三评测也变得更细了不再只问一个数字准不准而是可以追问“你识别对了吗”“你归因对了吗”“你的推理路径有没有覆盖关键官能团”。这个思路我觉得是分子性质预测从“玄学拟合”走向“可解释推理”的重要一步也是FGBench作为基准最独特的地方。2. 数据集搭建与统计解读2.1 数据来源与筛选流程先声明一下具体的版本细节以官方仓库和论文正文为准我这里从我复现时拿到的数据卡和实验日志出发说说我对这套数据集的底层理解。FGBench的数据集主要由公开化合物库和已有性质基准中的分子合并清洗而来。从分子数量和结构多样性来看属于“中等规模、高标注密度”的定位。它不是像ZINC那样动不动几亿个分子让你做无监督预训练而是每个分子都带着两大块信息分子层面的性质标签以及官能团层面的结构标注。这种设计思路和MoleculeNet有点类似但标注维度更深。筛选流程我觉得有几个关键点。第一重复分子按标准化规则去重遇到盐就拆掉盐离子保留母体结构。第二性质标签的数据来源和实验条件会做一致性校验同一性质不同实验室测出来的数值离散度极大官方会做outlier过滤。第三分子被要求至少含有一个可识别的官能团其实几乎所有有机分子都满足这条件但那些官能团标注置信度极低的分子会被剔除。从分布上看数据集中药物相关分子占比不小logP、溶解度、pKa这类物理化学性质还有部分ADMET相关的生物活性标签覆盖得比较全。我在实际下载数据的时候发现官方把数据切成了几个分片方便不同任务各自取用比如只跑结构识别任务的可以不用下载大体积的3D构象文件。这个设计很贴心但也会带来一个坑后面我会专门讲。2.2 官能团标注方案与覆盖范围官能团标注是整个数据集最核心的资产所以我格外留意它的定义方式。官方采用的方案我理解是基于SMARTS子结构匹配配合人工规则校验把分子映射成一组官能团标签。SMARTS这玩意儿搞过化学信息学的人都不陌生它是一种用ASCII字符串表达子结构模式的语言比如羟基可以写成[OX2H]羧基大概可以写成[CX3](O)[OX2H1]简单说就是“用一套模式匹配语言在分子图里找子结构”。但实际体验下来SMARTS匹配这件事远没有想象中那么顺滑同一个官能团在不同分子语境里电子环境差别很大一个模式匹配过头就会误报。比如硝基芳香环上的硝基和脂肪链上的硝基物理化学行为差别巨大但简单SMARTS是区分不了这种“环境敏感”的。官方针对这种问题做了不少细分处理把一些官能团按连接环境展开成多个子类型我觉得这比很多传统官能团分类工具做得精细。从我拿到的标注统计来看官能团数量覆盖了几十到上百种常见类型包括含氧官能团羟基、醚、羰基、羧基、酯基、含氮官能团氨基、酰胺、硝基、氰基、含卤官能团氟代甲基、氯代芳环以及杂环类结构。每个分子平均能匹配到几个官能团当然也有分子结构极简、只带一个官能团的情况那些复杂天然产物则会带上一堆。官方还提供了官能团出现频次统计长尾现象很明显几个头部官能团占据了大多数样本而许多稀有官能团样本量极少。这个长尾特性直接决定了后面评测模型的难度和评测指标的侧重点。2.3 与现有分子数据集的差异为了说清楚FGBench的定位我把它和几个知名分子基准拉出来做了个对照。数据集/基准基本粒度为标注内容是否显式包含官能团评测是否能解释路径MoleculeNet原子键多种分子性质否否ZINC15分子整体无标注供生成与筛选否否LRGB分子部分原子键小规模性质否否ChEMBL分子生物活性靶点活性等部分但非结构化否FGBench原子官能团层级图性质标签官能团标注是且为核心是这个对照能看出FGBench和传统基准最大的差异不在于“多几个任务”而在于评测逻辑的升级。MoleculeNet问的是“这个模型的最终预测准确吗”FGBench问的是“这个模型是看到了正确的官能团才给出这个预测的吗”。前者只关心结果后者同时关心推理过程和推理粒度。如果你平时做模型横向对比只用MoleculeNet的ROC-AUC说话那么FGBench给你提供的其实是一套更严苛、也更接近真实化学研发流程的考卷。3. 基准评测任务与规则设计3.1 三个层级的推理任务FGBench的任务体系我把它理解为三个递进的层级对应模型从“感知”到“认知”再到“解释”的能力。第一层是官能团层面的感知任务。给定一个分子图模型需要预测这个分子是否含有某种官能团、含有哪些官能团。听起来像是子结构匹配的活但难点在于模型不能依赖显式SMARTS检索工具必须从原子图或者片段图中自己判断。这个任务相当于检验模型“有没有化学常识”很多GNN在这个任务上会被打回原形因为它们学了半天性质却没有真正学到官能团这个概念。第二层是官能团级别的性质推理任务。给定分子的结构以及其中的官能团层级图模型需要预测logP、溶解度、pKa等物理化学性质还有一部分生物活性标签。这和传统分子性质预测任务表面上看是一样的但关键在于评测时会特别检查模型是否在官能团图上进行推理而不是跳回原子级图。官方在数据处理阶段就提供了官能团层级图作为输入模态如果模型选择用原子级图硬卷也不拦着但最终效果和可解释性都会露馅。第三层是解释和归因任务。给一个分子模型要输出对预测结果最“关键”的官能团子集或者回答“如果我把这个官能团替换成另一个性质会怎么变”。这一层任务是我个人最感兴趣的因为它的评测维度和传统基准完全不同不再只看预测值误差而是要看模型归因出的官能团和真实化学知识是否一致。换句话说就算某个模型最终的logP预测值很准但如果它的归因结果把羧基这种强极性基团说成是疏水贡献者那么这个模型在FGBench框架下就是不合格的。这三个层级合在一起其实逼着模型走一条“先识别官能团再基于官能团推理最后针对官能团给解释”的完整链路。相比直接把分子图丢进GNN然后出一个数这种训练和评测显然更贴近化学家的工作习惯。3.2 评价指标设计FGBench在指标选择上明显动了一番脑筋因为它要同时覆盖分类、回归和归因多种任务形态。官能团识别任务采用的是宏平均ROC-AUC和宏平均PR-AUC。用宏平均而不是微平均是为了避免长尾官能团被头部官能团稀释。我自己的复现经验是如果只盯微平均指标模型完全可以靠把高频官能团识别对了把低频官能团全判负仍然拿到一个好看的分数而宏平均则逼着模型照顾稀有类别。性质预测回归任务用的是R²和RMSE这个中规中矩但官方对每个性质分别计算并给出了按分子结构子类分层的指标比如按分子量大小、按官能团数量分组来报告这比单纯报一个全局R²诚实得多。归因任务的指标最有意思。官方设计了一个叫“功能官能团命中率”的指标逻辑是真实解释标注了分子中对某种性质贡献最大的top-k个官能团模型的归因结果也输出top-k个官能团然后算两组集合的重叠率。这个指标非常残酷因为归因不能只靠“全说一遍”来刷分模型输出所有官能团反而会拉低命中率必须精准命中真正贡献大的那几个。还有一个指标是基于替换的把模型归因出的关键官能团替换成中性片段看预测性质是否如预期发生大的变化这相当于在“行为层”验证归因正确性。我强烈建议任何想认真使用FGBench的人都先把注意力放到这三类指标上去不要在单一回归任务上刷出一个好看的R²就以为万事大吉。这个基准真正值钱的部分在归因评价指标它能告诉你模型到底“懂没懂化学”。3.3 基线模型选型官方报告的基线模型我梳理了一下基本覆盖了当前主流的几大流派。第一类是分子指纹加轻量模型的经典路线比如ECFP/Morgan指纹接一个MLP。这条路线的特点是快、稳、强在中小规模数据上往往让人惊讶地能打。但指纹是离散的二维拓扑特征天然就缺乏连续性语义面对官能团归因任务时只能靠SHAP这类事后方法勉强凑合属于“预测能用解释牵强”的典型。第二类是GNN路线包括GCN、GAT、MPNN这几个常青树这类模型在原子级图消息传递上公平竞争是检验“官能团诱导偏置是否有价值”的最好对照组。第三类是GraphTransformer路线利用全局注意力捕捉远距离依赖表达能力更强但训练成本和过拟合风险也更高。最让我注意的其实是第四类大语言模型路线。官方尝试了把分子SMILES直接丢给LLM做性质预测和官能团识别。实测下来LLM对常见官能团的“知识”是有的毕竟训练语料里化学文本很多但它的官能团识别精度受分子表示风格影响极大SMILES顺序一换就可能改变输出稳定性堪忧。在归因任务上LLM虽然能给出形似合理的文本解释但一旦追问到量化替换预测就会暴露出“用一个壳子解释另一个壳子”的短板。FGBench相当于用一套规范化的评测指标把LLM在这个场景下的“幻觉式解释”给测明白了。4. 复现与实测记录4.1 环境准备与数据加载拿到FGBench之后第一步当然是搭环境。官方提供的代码库基于PyTorch和PyTorch Geometric我自己的复现环境是Python 3.10 PyTorch 2.x RDKit 2023.x。RDKit是绕不开的依赖因为官能团标注的原始数据用了RDKit的SMARTS匹配后续如果想要自己画分布、做定制化分析也全靠它。数据加载部分官方提供了HDF5和JSON两种格式HDF5适合大批量读取JSON适合人类检查。我建议一开始先用JSON熟悉结构再切换到HDF5做训练。另外官方把分子图和官能团标注做成了可以直接喂给PyG的Data对象字段包括原子特征、键特征、官能团节点索引、官能团类型以及官能团层级图的边关系。下面这段是标准的加载示例我简化了几个字段保留了主干import json import torch from torch_geometric.data import Data, Batch with open(fgbench_sample.json) as f: record json.load(f) # record 中包含了 # - smiles: 分子的 SMILES 字符串 # - atom_features: 原子级特征矩阵 # - bond_index: 键连接关系 # - fg_index: 每个官能团覆盖的原子索引列表 # - fg_type: 官能团类型编号 # - fg_edge_index: 官能团与官能团之间的连接边 # - labels: 分子性质标签字典 data Data( xtorch.tensor(record[atom_features], dtypetorch.float), edge_indextorch.tensor(record[bond_index], dtypetorch.long), ) # 官能团信息单独保存方便设计自定义模型模块 fg_dict { fg_atom_idx: record[fg_index], fg_type: record[fg_type], fg_edge_index: record[fg_edge_index], }这里有个细节官能团节点并不是分子图上的“真节点”而是额外的层级结构。也就是说模型需要把原子级图编码到官能团节点再在官能团图上做二次推理。我把这理解成“先卷积出片段表征再做片段关系建模”跟图分类里的“层级池化”思路很像但区别在于官能团分组是先验给定、不能学习的这反而成了优势因为它让模型有一个稳定的分组锚点。4.2 模型搭建的关键思路官方评测跑通之后我自己搭建了一个带官能团显式监督的对比模型用来验证“官能团先验到底有没有用”。模型结构并不复杂底层是两层GIN作为原子级编码器然后根据官能团索引把原子表征聚合成官能团表征这一步我用的是注意力池化因为不同官能团内部的原子重要性差异确实很大比如羧基的羟基氧和羰基氧对pKa的贡献权重就完全不同。之后接一层官能团间的消息传递最后把官能团表征池化成分子表征。训练的时候我在主任务之外还加了一个官能团类型分类的辅助损失。这个设计的动机很直白如果希望模型“官能团化地思考”最直接的办法就是逼它在训练过程中把官能团分类学明白。实验结果也印证了这一点只有辅助损失显式建模官能团最终模型在归因命中率上才会明显高于纯原子级GNN。这算是我在这次复现里最深刻的一个感受——归纳偏置这东西光靠网络结构“暗示”不如在本目标函数里“明示”来得有效。另外我还试过把部分官能团标签在训练时随机mask掉让模型在做性质预测的同时去恢复被mask的官能团有点类似GraphMAE那种自监督玩法。这个技巧在低数据场景下帮助挺大尤其是在活性标签数量只有几千条的子集上预训练加上微调的效果明显好过直接在小数据上冷启动。你要是自己拉数据做私有数据集我建议借鉴这个思路。4.3 训练超参数与实测结果观察我把几次实测中比较关键的超参数和现象整理一下。超参数/设置推荐值/做法备注原子编码器层数3~5层GIN超过5层在小分子图上收益递减官能团消息传递层数1~2层官能团数量不多层数太高反而过平滑官能团辅助损失权重0.1~0.3太高会主导训练性质预测退化批量大小128~256按显存调整官能团标注增大了batch的内存占用学习率1e-3 加余弦退火AdamWwarmup 10% steps输入模态原子级 官能团级联合只用官能团级会损失原子细节只用原子级会失去先验在官能团识别任务上我的模型没有达到官方的最高基线但也能看出显式官能团建模的低频官能团召回率显著高于纯GNN对照组。在性质预测任务上双方差距被拉近了尤其是logP这种和全局疏水性高度相关的性质官能团级别模型没有明显优势。可一旦切到归因命中率差距就拉开了显式官能团模型的top-3归因命中率能稳定超过纯GNN对照组而那些全靠事后SHAP解释的指纹模型在归因任务上更是折戟沉沙输出结果经常和真实官能团重叠率不到一半。另一个有趣现象是释放“官能团级可解释性”之后错误分析都变得好做了。以前模型预测错一个溶解度我只能摊手说“可能过拟合了”。现在我可以直接看到模型是不是在某个分子上把酯基误识别成了醚或者把氨基的贡献完全忽略了错误立刻有了“化学含义”。我觉得这本身就是这个基准的一大价值它把机器学习模型的错误从“数字错”升级成了“概念错”这对后续修复模型有巨大的指导意义。5. 常见问题与排查技巧实录5.1 复现过程防坑速查表复现FGBench的过程中我踩了不少坑也帮别人排查过几个典型问题整理成一张速查表希望后来者少走弯路。问题现象可能原因解决方案官能团识别宏平均AUC很低SMARTS标注里包含环境敏感型官能团模型学到的边界和数据标注对不上先单独跑一遍“官能团类型分类”看混淆矩阵确认哪些类互相混淆必要时合并相似类别性质预测R²正常但归因命中率低模型走了捷径靠分子整体特征预测没真正利用官能团信息加官能团辅助分类损失并在推理时把官能团top-k归因结果可视化检查低频官能团PR-AUC几乎为0长尾分布太严重模型倾向于预测负类改用focal loss或者对低频官能团做上采样也可以尝试在官能团类型嵌入上做对比学习官能团层级图显存爆炸每个分子的官能团边数量不一尾部分子边数较多造成batch不规整用Batch.from_data_list时关闭follow_batch或者按官能团数量bucketize分子再batchLLM类基线输出不稳定SMILES顺序变化影响LLM官能团判断使用规范化SMILESRDKit的Chem.MolToSmiles固定输入并加温度0采样的多次投票和官方指标对不上数据分片选择、随机种子、归属任务评测口径不同仔细核对官方数据加载器确认用的是“排除官能团标注”版本还是“包含官能团标注”版本5.2 我的几条独家建议最后分享几条我在复现和二次开发中总结出来的实操心得。第一拿到数据之后先不要急着训练先做官能团共现分析。直接用RDKit把训练集分子的官能团共现矩阵算出来你会惊讶地发现很多官能团几乎不会同时出现。这种先验知识能帮助你设计更合理的评测切分避免用随机划分造成“同骨架泄露”让模型在测试集上靠记忆官能团组合蒙混过关。第二可解释任务不要只看最终数值。我真的建议把模型归因结果画出来用RDKit把官能团高亮在分子图上然后直接肉眼检查几十个样本。数值指标可以欺骗你但高亮图不会。我见过不少模型在数值上刷到了不错的归因命中率实际一看它把几乎每个分子都归因到同一个头部官能团上完全没泛化能力。只有画图检查才能发现这种致命问题。第三如果目标不是刷榜而是用FGBench服务自己的业务数据那我的建议是先用官能团识别任务做“准入测试”。把你自己的分子集丢进去跑一遍官能团识别看看模型能不能学到合理的官能团语义。这一步如果过不了后面任何性质预测都是空中楼阁。我在自己项目里就是先用FGBench预训练官能团感知模块再用私有小数据微调效果比直接私有数据上硬训GNN稳定很多尤其是在头部标签极其稀疏的情况下。这套基准的作用不只是一个“考模型”的题库更是一套把化学常识注入模型的方法论。按照这个思路去改自己的模型哪怕不用FGBench的数据也会有很大的启发。
返回列表