
看到 FGBench 这个题目做分子机器学习的同行应该都会有点共鸣终于有人把“官能团”这个化学语义单元正式搬进了 benchmark 体系里。NIPS 2025 这个工作出来以后我第一反应是过去几年我们太依赖“黑盒分子图”了。预测 logP、溶解度、渗透性、hERG 毒性这些 ADMET 性质模型确实能刷高分但问它“这个分子到底因为哪个官能团才有这个性质”它往往只能说出一串不痛不痒的注意力权重。FGBench 想处理的核心问题就是把分子性质推理的粒度从原子/键下放到官能团让模型不仅会预测还能说清楚“是哪儿起了作用”。这篇内容我会从数据设计、任务拆分、模型路线到调参踩坑尽量讲透适合正在做 AI 制药、化学信息学或者分子表征学习的工程师和研究生。1. FGBench 是什么为什么分子性质推理要下沉到官能团粒度1.1 分子性质推理的原有痛点传统性质预测的输入可以分成几类SMILES 字符串、分子图、3D 构象、分子指纹。基于图的 GNN 类模型确实很流行但它默认把每个原子当作节点、把化学键当作边原子之间的局部语义主要靠消息传递慢慢“学出来”。问题在于化学家脑子里面的推理单元从来不是单个原子而是羟基、羧基、氨基、酰胺、苯环、硝基这些官能团。举一个很直白的例子一个酚羟基和一个醇羟基两个结构只差一个苯环的连接环境但它们的酸性、氧化敏感性、蛋白结合方式完全不同。如果模型只看原子级别邻域它要花很大的代价才能学到“苯环上的 OH 和脂肪链上的 OH 不是一回事”。而官能团级别的表示天然就把这个信息编码进去了。FGBench 的数据和任务设定就是想推动模型学会这种“化学语义单元”的推理方式。1.2 这个 benchmark 到底解决什么问题从题目来看FGBench 做了两件事一方面给到一份带官能团标注的数据集另一方面定义了若干基准任务专门用来评估模型“在官能团粒度上的性质推理能力”。这个定位和现有 benchmark 不一样它不只是比“谁的性质预测准确率更高”更关键是比“谁能在官能团和性质之间建立可解释的关联”。对工业界的价值也很明显。药物化学项目里最常见的动作是“改一个基团看活性变化”一个聪明的分子生成模型应该能说“把芳香环上的甲氧基换成羟基溶解度可能会提高”而不是只能生成一堆 SMILES 再交给下游黑盒筛选。FGBench 这类数据集如果做得扎实是可以直接作为分子优化、虚拟筛选、ADMET 早期预警的评测基线的。2. 数据集搭建思路从分子序列到官能团标注2.1 数据来源与清理的常规路线写这种分子数据集最先绕不开的是数据来源。通常的做法是从公开化合物数据库拿分子结构比如 PubChem、ChEMBL、ZINC 这些再根据任务目标筛选性质标签完整的子集。FGBench 如果按主流 benchmark 的实现方式大概率也会做这些基础动作过滤盐、中和电荷、去除重复分子、用 RDKit 标准化 SMILES再把混合物拆成单一组分。这些步骤听起来机械实际上每一步都可能影响标签质量。举个例子同一个分子在数据库中可能存在“羧酸”和“羧酸钠盐”两种记录如果不做去盐和中和官能团标注会重复性质标签也可能被带偏。还有立体异构的问题SMILES 不区分手性时一个分子可能有多个构型但生物活性差异巨大。FGBench 的标题没强调手性但我在实际做类似数据集时至少会保留 isomeric SMILES不能一股脑把所有手性信息丢掉。2.2 官能团词汇表与标注方案要让模型在官能团粒度上推理必须先定义清楚“官能团”这张词典。化学里的官能团定义本身有弹性所以 FGBench 这类数据集必须把边界定死。我推测它会有类似下面这套常见模式含氧官能团醇羟基、酚羟基、羧基、酯基、醚键、羰基、醛基含氮官能团伯/仲/叔胺、酰胺、硝基、亚胺、腈基含硫官能团巯基、硫醚、砜、亚砜芳香体系苯环、吡啶、呋喃、噻吩等杂芳环自动标注最直接的方法是 SMARTS 匹配。RDKit 提供Chem.MolFromSmarts和GetSubstructMatch可以非常快地给整个数据集打标。但要注意SMARTS 模式不是万能的一个羟基的 SMARTS 写得宽一点可能把羧基里的 O-H 也算进去这时候就需要设定优先级或者排除规则。from rdkit import Chem patterns { alcohol_oh: Chem.MolFromSmarts([OX2H]), phenol_oh: Chem.MolFromSmarts([c][OX2H]), carboxylic_acid: Chem.MolFromSmarts([CX3](O)[OX2H]), primary_amine: Chem.MolFromSmarts([NX3;H2]), amide: Chem.MolFromSmarts([CX3](O)[NX3]), nitro: Chem.MolFromSmarts([NX3](O)[O-]), } def annotate_fgs(mol): fgs set() for name, patt in patterns.items(): if mol.HasSubstructMatch(patt): fgs.add(name) return fgs注意上面的 SMARTS 只是示例实际建库时要根据数据集特点反复校准。尤其要处理“重叠官能团”比如酰胺既含有羰基又含有 N-C 键一个分子可能同时被判给“酰胺”和“羰基”。这不一定错多标签本来就可以重叠但评测和下游建模时一定要明确到底用“是否存在”还是“包含数量”。2.3 标签质量的人工校验机器打标之后不能直接拿来做 ground truth。实际经验里SMARTS 标注的假阳性和假阴性都不少比如环内 N 原子被误判成胺或者硝基的电荷写法没匹配上。比较好用的校验办法是抽样本做人工检查算标注器之间的一致性再对着教科书的官能团定义写排除规则。如果 FGBench 的标注真的能做到“由化学规则引擎出初稿 专家校验 争议样本仲裁”那这份数据的价值就远大于单纯给出分子-性质标签的普通数据集。因为官能团标注本身就带一层可解释信号后续可以拿来训练解释模型也可以作为多任务学习的辅助标签。这也是我看好这个 benchmark 的原因。3. 基准任务拆解FGBench 到底在测什么能力3.1 任务一官能团识别第一个任务可以很直接给定分子结构让模型输出这个分子包含的全部官能团。这是推理的“前置能力”相当于让模型先证明它认识化学语义单元。这个任务表面上简单但实操中有两个坑第一多标签分类的类别数可能到几十甚至上百正负样本极不平衡第二官能团之间高度相关比如酯基和羰基经常同时出现模型很容易偷懒只学相关性不学真正的结构特征。评估这一类任务不能只看准确率更适合看 macro F1 和 AUPRC。AUPRC 对正样本稀有的官能团更敏感macro F1 能平衡各类别差异。跑基线的时候官方应该会给 GNN、分子指纹加逻辑回归、预训练分子模型这些对比。我自己的经验是简单 ECFP 加线性模型在很多官能团识别任务上效果不差因为官能团的局部特征在指纹里本来就很明显这也是 FGBench 提醒我们的一件事新模型如果连指纹基线都干不过那说明它并没有真正学会官能团语义。3.2 任务二官能团感知的性质预测第二个任务才是重头戏在知道官能团标签或官能团掩码的情况下预测分子性质。这里“性质”可以是溶解度、logP、渗透率、hERG 毒性、CYP 抑制等。任务设计上可能有两种变体变体 A模型可以同时看到分子结构和官能团标注预测性质变体 B模型先预测官能团再用预测结果辅助性质预测检验官能团预测质量对下游的影响变体 B 更有意思它把“官能团识别”和“性质预测”串成一条因果链。如果官能团识别错了下游性质预测应该会掉点这能测试模型有没有真正利用官能团信息。评测指标要看任务类型回归用 RMSE 和 MAE分类用 AUC。但比指标更重要的是“官能团信息是否真的起效”。我记得有研究提出过一个概念比较加不加官能团特征时的性能差异这个差值能直接说明官能团表示的增量价值。3.3 任务三性质相关官能团的定位与排序第三个任务也是 FGBench 最独特的点给定分子和性质让模型指出到底是哪些官能团对该性质贡献最大。这不是单纯的分子性质预测而是“分子性质推理”。模型必须输出一个官能团重要性排序类似于可解释性的归因结果。评测这块比较难因为 ground truth 怎么定义是个大问题。一种方案是让领域专家标注哪些官能团对某个性质“显著相关”比如 hERG 风险里芳香碱性氮的贡献很大另一种方案是通过对照分子计算性质变化比如把分子里的某个官能团替换成氢原子看性质变化多少变化大的官能团就是重要贡献者。FGBench 如果能把这种“分子编辑式 ground truth”做出来对后续可解释性模型评测意义很大。评估指标可以用 hit3、归因排名和 expert 标注的一致性。4. 实操路线基于 FGBench 快速搭一套官能团感知模型4.1 环境准备和数据处理如果手上已经拿到 FGBench 数据集我建议第一步不要着急上大模型先把数据管线搭稳。环境方面Python 3.9 配上 RDKit、PyTorch、PyTorch Geometric 就够了。首次拿到数据先跑一段描述性统计看官能团分布、性质分布、分子量分布。数据划分是这个类型 benchmark 最容易翻车的地方。随机划分在分子数据上非常不可靠因为同一个 scaffold 的分子会在训练集和测试集同时出现模型通过记忆骨架就能“刷高”成绩。FGBench 这类数据集如果是负责任的设计至少会提供 scaffold 划分版本也就是按 Bemis-Murcko 骨架将分子分开。from rdkit.Chem.Scaffolds import MurckoScaffold def get_murcko_scaffold(mol): return MurckoScaffold.MurckoScaffoldSmiles(molmol, includeChiralityFalse)拿到 scaffold 后可以先把所有分子按不同 scaffold 分组再用GroupKFold或手动拆分保证同一个 scaffold 只出现在一个 fold 里。这能大幅减少信息泄漏评测出来的分数才对真实应用有参考意义。同时还要留一个随机划分版本作为对照组因为两者之间的差距本身也是一个值得报告的信息。4.2 三条模型路线特征拼接、多任务、归因解释想用官能团信息提升性质推理能力我建议分三条路线渐进尝试。第一条路线是特征增强。把官能团标签向量或官能团计数向量拼到分子图的全局特征里或者作为边特征的一部分。这种做法最简单适合快速验证官能团信息是否有用但缺点是官能团特征和分子结构分开模型容易把它们当成两套独立信息不利于细粒度推理。第二条路线是多任务学习。主任务是性质预测辅助任务就是官能团识别。模型共享底层分子表征上面分出两个预测头一个头输出 logP 或 hERG 分类另一个头输出官能团多标签。多任务的好处是底层的图编码器必须同时保存“官能团识别”和“性质预测”所需的信息这通常比单任务学到的表征更鲁棒。第三条路线是显式归因推理。先用 GNN 或 Transformer 提取原子级表征再把原子归并到官能团片段上得到官能团级别的池化向量最后用这些向量预测性质。预测之后还可以用 integrated gradients 或者基于扰动的方法计算每个官能团对输出的贡献。这条路线解释性最好但工程复杂度也最高而且归并方式需要精心设计否则官能团边界一错整个推理链都受到污染。4.3 评测协议和基线对比千万不要只跟自己的模型比较。FGBench 这种 benchmark 的价值就在于标准化评测所以拿到数据后我建议把经典基线全部跑一遍RDKit 分子描述符加 XGBoost、ECFP 加线性模型、GIN、GCN、MPNN以及预训练分子 Transformer。Baseline 的意义不在于说哪个模型最好而在于给后来者一个标尺。跑评测时还要注意随机种子。GNN 训练对种子很敏感同一套数据换一个种子AUC 可能上下波动 2 到 3 个点。所以至少要跑 5 个种子报告均值和标准差最好再做一个配对显著性检验。这个习惯我自己也是吃了很多亏才养成的不然很容易把随机噪声当成真实提升。5. 常见问题与调试避坑从官能团标注到训练收敛5.1 官能团标注的典型翻车现场我整理了一下这种“官能团级数据”最容易遇到的问题基本可以按现象快速定位。现象可能原因解决思路同一个分子在不同批次标注结果不一致SMILES 标准化和去盐不统一先全局标准化用同一个 RDKit 流程某些官能团数量远多于其他类别天然不平衡比如甲基/苯环太常见不要强行过采样改用 AUPRC 评估官能团预测高分但性质预测没提升模型只记忆了官能团和性质的表层关联尝试分子编辑式任务或消融实验官能团重叠严重标签相关性过高定义体系本身允许重叠在文档里写清楚重叠规则或建立层次化标签模型对 scaffold 过拟合数据划分没有按骨架拆分改用 scaffold split并报告 random split 差异补充一个我经常犯的错误把官能团标签当成完全独立的类别来处理忽略它们之间的化学相关性。比如芳香硝基经常连在苯环上模型完全可以靠“检测到苯环就预测有硝基”来蒙混过关虽然指标不差但推理逻辑是错的。所以在设计评测时最好加入“对抗样本”比如人工修改官能团但保持分子骨架不变看看模型能不能察觉化学反应性的变化。5.2 训练官能团感知模型的调参建议如果你用的是 GNN 加多任务架构有几个参数值得反复调。首先是原子特征维度官能团识别对原子类型和杂化状态很敏感建议把 degree、氢原子数量、环大小、是否是芳香原子、手性标记全部放进去。其次是消息传递层数官能团的范围通常不超过几个键层数堆到 5 层以上反而会过度平滑小分子性质预测里面 2 到 4 层往往就够。多任务训练时官能团识别和性质预测两个 loss 的权重也需要调。我习惯先把辅助 loss 权重设成 0.1 左右再观察主任务验证集指标如果官能团任务想让模型学到更完整的表征可以把它提到 0.5但要注意别让模型只顾辅助任务。稳妥的做法是用验证集上的主任务指标做早停辅助任务指标只作为观察项。还有一点容易被忽略官能团归属的“原子掩码”。如果数据集给定每个官能团对应的原子序号那么可以用这些掩码给消息传递过程本身做 mask让信息只在官能团内部先聚合再跨官能团交换。这种结构比单纯拼接官能团特征更符合化学直觉也更容易解释。FGBench 如果提供原子级官能团归属不走这条路就太可惜了。5.3 评估结果的可信度和可复现性一版评测跑完复杂度不会太低。我分享一个个人流程先把数据统计写到固定文件包括分子数、官能团类别数、空标签比例、性质缺失情况然后固定环境版本RDKit、PyTorch、CUDA 都记下来最后跑三个随机种子用测试集评估一次测试集绝对不能在调参时反复看。做 benchmark 评测最忌讳的是“用测试集调参”哪怕只是看一眼测试集分数决定改不改学习率也算泄漏。最推荐的做法是再切一个小的验证集或者做交叉验证等所有参数都定下来之后再统一跑一次测试集。FGBench 这种标准化资源希望官方能把数据划分的代码和评测脚本一起公开这样大家才敢拿自己的模型去横向对比。6. 对官能团级推理的后续扩展想法FGBench 这个方向如果做得细完全可以不只停在分类任务上。一个是我很关注的“官能团编辑”任务给定一个分子和目标性质让模型输出应该把哪个官能团改成哪个官能团这比生成整个分子更高频也更贴近药物化学家的日常操作。第二个是“官能团上下文”建模同一个羟基在不同环系、不同立体环境下的影响差很多未来可以把官能团表示和分子全局拓扑一起编码而不是孤立做多标签分类。再往深入想官能团级推理可以跟 pKa 计算、溶解度预测、代谢位点预测这些具体物理化学问题结合。性质不是一个官能团“独立贡献”的结果分子整体电子效应、共轭体系、空间位阻、构象都会改变同一个官能团的真实行为。所以理想状态是模型在官能团和全局分子之间做交互把局部的“官能团词典”和全局的“分子语境”同时利用起来。FGBench 能提供一个评测这些能力的数据集对研究者来说已经是很好的起点。7. 一些个人实操体会我在类似数据上踩过的最大一个坑是以为“官能团标注”本身就能解决可解释性。其实标注只负责告诉你“分子里有什么官能团”并不告诉你“模型用了哪些官能团做出预测”。这个问题我建议从任务设计上逼模型一步让模型输出官能团级的重要性权重而不是只在输入侧加官能团特征。FGBench 第三类任务如果做得好就是方向上的正确引导。另一个体会是不要迷信大的预训练模型。预训练模型确实在分子性质预测上很能打但官能团推理这种偏结构化、偏语义的任务结构化的 GNN 加上明确的官能团池化常常能给出更稳定的可解释结果。把预训练模型的 embedding 拿来初始化再在上面加官能团推理头往往比端到端完全训练更稳。最后分享一个具有可操作性的小技巧在拿到 FGBench 数据之后先抽 500 个分子做一次“人肉标注质检”。把 RDKit 自动标注结果打印成表格同时让熟悉化学的人逐个看记录哪些官能团被漏掉、哪些被重复标记。这 500 个样本花不了太多时间却可以帮你校准后面的所有模型设计和结果解读。数据质量这件事上预处理投入多少时间都不过分。