做分子性质预测的同行,应该都有同感:拿到一个新项目,最纠结的往往不是模型选型,而是“怎么把分子喂给模型”。指纹(ECFP、MACCS)虽然好用,但本质是预先定义好子结构的词袋模型,碰到没见过的化学环境就哑火;SMILES序列模型看似端到端,其实在拿自然语言的语法去套化学结构,信息损失肉眼可见。这两年图神经网络(GNN)火起来之后,大家默认“分子=图”,开始堆原子级消息传递,但做到后面你会发现,纯原子级GNN对“官能团”这种关键语义单元几乎是失明的。
Bioinformatics 2021上发表的FraGAT+,就是冲着这个痛点去的。它把分子拆成带有完整化学语义的“原始片段”,再通过多尺度图注意力机制把原子级和片段级的信息揉在一起做性质预测。这个思路放在今天看依然很有借鉴价值,尤其是“多尺度”这三个字,解决的不只是表征精度问题,还顺带缓解了GNN在分子图上解释性差、容易过平滑的老毛病。这篇文章我前前后后读了好几天,也动手在小数据集上复现过一部分思路,今天把整个过程整理出来,从设计动机到架构细节,再到实际踩过的坑,一次性讲清楚。
1. 分子性质预测的痛点:为什么普通GNN不够用
1.1 表征决定上限:从指纹到图神经网络的进化逻辑
分子性质预测,听起来是个具体任务,但本质上是一个表征学习问题。你要预测水溶性、脂水分配系数(logP)、毒性、代谢稳定性、血脑屏障穿透性……这些宏观性质,背后其实都由分子在不同尺度上的微观结构共同决定。早年大家用ECFP4这类圆形指纹,配合随机森林或XGBoost,在很多ADMET任务上已经能打。它的逻辑很朴素:把分子周围的环境哈希成固定长度的bit向量,模型看到的是一组“是否存在某类子结构”的开关信号。
但指纹的问题也很明显。第一,它丢掉了拓扑细节,两个截然不同的分子可能在指纹空间里距离很近;第二,它无法泛化到训练集里没出现过的子结构,碰到新颖骨架直接抓瞎;第三,指纹本身是离散的、不可微的,没法端到端地跟下游任务一起优化。所以后来大家转向SMILES序列模型,试图用LSTM或Transformer去隐式学习分子语法,但SMILES只是分子的线性投影,同一个分子可以写出多种合法字符串,模型在这种等价变换上浪费了大量容量。
GNN的出现解决了一部分问题。分子天然是图:原子是节点,化学键是边。GNN通过消息传递机制,让每个原子逐步聚合邻居信息,输出的节点表示天然携带拓扑上下文。和指纹相比,GNN是连续的、可微的、节点级对齐的;和SMILES相比,GNN不需要处理重组问题,因为它直接作用在分子的真实拓扑上。这也是为什么过去几年里,GCN、GAT、MPNN、D-MPNN这些图模型成了分子性质预测的主流选择。
1.2 原子级GNN的盲区:看不见的“语义单元”
但原子级GNN有个被很多人忽视的先天缺陷:语义粒度和化学直觉不匹配。你给模型输入的是原子类型、度数、芳香性、杂化态这些底层特征,模型通过层层消息传递自己去发现规律。理论上讲,层数够多,模型的确可以隐式学到“苯环”“羧基”“酰胺键”这些官能团模式。问题是,分子图太小了,大多数分子也就几十个原子,叠加多层图卷积之后,感受野瞬间覆盖全图,节点表征会趋向同质化,也就是常说的“过平滑”问题。层数浅了学不到长程依赖,层数深了又把所有节点抹成一团浆糊,这是纯原子级GNN在精度上很难再往上走的根本原因。
更实际的问题是,药化专家在看到某个分子结构时,脑子里根本不是“原子A连原子B连原子C”,而是“这是个芳环,那边有个羧酸,这里有个氢键供体”。官能团和骨架才是化学语义的真正载体。原子级GNN把这种粒度信息完全交给模型自己去隐式发现,既浪费了宝贵的训练数据,也让模型输出的解释性大打折扣。你不能指望一个只见过原子特征的模型,在预测结果出来之后告诉你“这个分子有毒,是因为里面的迈克尔受体片段”这种话。
所以,一个很自然的想法就冒出来了:与其让模型从原子开始一点点拼出高级语义,不如直接把“片段”作为显式输入,让模型在片段级别做推理。这就是FraGAT+的核心出发点。
2. 片段才是分子的“词块”:FraGAT+的设计直觉
2.1 什么叫“分子原始片段”
片段(fragment)这个概念,在计算化学里其实并不新鲜。BRICS、RECAP这些逆合成规则,本质上就是在选定的化学键位点切开分子,得到一组保留化学语义的子结构单元。一个苯环、一个叔丁基、一个羧酸基团、一个磺酰胺单元,这些都是常见的片段。所谓的“分子原始片段”,我个人的理解是:通过一组确定的断键规则,把分子切分成互不重叠的、语义最完整的子结构,让每个片段都尽量对应一个已知的化学官能团或结构单元。
段切分这件事,听起来简单,实际操作起来有不少讲究。切得太粗,一个片段就占了大半个分子,失去建模意义;切得太细,等于把分子打回原子级,片段化没有价值。FraGAT+的处理策略,是采用一组预定义的化学键对称规则,在保证片段化学合理性的同时,尽量控制片段的数量和大小分布。我在复现时尝试过BRICS断键规则和官能团定义两种方案,前者的片段更偏“合成砌块”,后者的片段更偏“药效团”。实验下来,官能团取向的切分在性质预测任务上通常更有效,因为它和药物化学家的直觉更对齐。
2.2 多尺度图注意力:从原子、片段到全分子
有了片段之后,问题变成:怎么把原子级信息和片段级信息融合起来。FraGAT+采用的是“双图、双尺度、注意力交叉融合”的路线。
具体来说,模型维护两张图。第一张是原子级分子图,节点是原子,边是化学键,这是GNN的标准输入。第二张是片段级图,节点是片段,边代表片段之间的连接关系——如果片段A和片段B共用了同一条断键,或者通过某个原子直接相连,就在它们之间建一条边。两张图各自跑注意力消息传递,得到原子表示和片段表示。但这两套表示不是割裂的,模型会在两者之间建立跨尺度的信息通路,让片段表示去引导原子注意力的权重分配,同时让原子表示去丰富片段内部的细节特征。
这个设计背后的直觉,可以类比成读一篇文章。只看单个字母,你几乎什么语义都提取不出来;看单词,能懂一部分;看词组和句子,才真正理解意思。分子也是一样,原子是字母,片段是单词,整分子是句子。原子级图注意力负责捕捉“拼写”层面的局部化学细节,片段级图注意力负责捕捉“语法”层面的语义单元交互,两个尺度结合,信息自然比单尺度完整得多。这也是“多尺度”三个字的核心价值:不是简单地把两个模型的结果拼起来,而是让两个尺度在注意力机制的框架下互相校准。
3. 模型架构拆解:FraGAT+的核心实现
3.1 输入特征与构图流程
在具体动手实现之前,先把输入特征和构图流程梳理清楚。FraGAT+虽然是针对生物信息学场景设计的,但通用的分子图处理流程是一样的,我用RDKit作为分子解析和特征提取工具。
先看原子特征。常规的原子级GNN输入特征包括这样几类:
- 原子类型(C、N、O、S、P、卤素等,做one-hot编码)
- 原子度(连接的原子数量,可按1-5分桶)
- 氢原子数量(影响立体化学和极性)
- 形式电荷
- 是否芳香原子
- 是否处于环内
- 杂化状态(sp、sp2、sp3)
- 氢键供体和氢键受体标记
再按键特征。键级(单键、双键、三键、芳香键)、共轭性、是否在环内,这些信息在消息传递过程中会作为边特征参与注意力计算,帮助模型区分不同化学键的物理含义。
而片段特征相对特殊一些。由于片段本身是一组原子的聚合,它的特征可以分成两部分:一是片段在预构建字典中的索引ID,类似NLP里的词表ID;二是从原子特征聚合而来的统计信息,比如片段内原子数、片段内是否含有芳香环、片段包含的氢键供体/受体数量等。这部分的特征设计直接影响多尺度注意力融合的质量,我建议至少在原子统计信息上做足,不要只给模型一个ID。
构图流程分四步:
- 读入SMILES或SDF文件,用RDKit解析成分子对象,做标准化处理(去盐、中和电荷、规范化芳香性)。
- 按预定义的断键规则提取片段。这一步的输出是“片段到原子的归属关系”,每个原子必须且只能属于一个片段。
- 构建原子级图。节点是原子,边是化学键,特征就是上面列出的原子特征和键特征。
- 构建片段级图。节点是片段,边基于片段间的连接关系建立,特征包括片段ID和聚合统计量。
这里有一个容易踩的细节:断键规则必须固定并写死在代码里,不能用RDKit的随机SMILES解析结果去推导片段归属。否则同一个分子在不同批次的解析中可能切出不同形状的片段,训练和推理就对齐不上。
3.2 片段级注意力与原子级注意力的交互机制
FraGAT+的核心,就是两套注意力机制的交叉融合,这也是它和前代FraGAT最大的区别所在。我按照常规理解,把一部分关键结构拆开来看先看片段级图的注意力。每个片段节点都有一个初始表示,来自前面的片段特征。在注意力更新阶段,每个片段会计算它与所有相邻片段的注意力系数,然后按系数加权聚合邻居信息,生成新的片段表示。这一步的作用是让片段获得“上下文语义”——比如一个碳基片段,当它连在苯环上和连在脂肪链上时,聚合到的邻居信息完全不同,更新后的表示自然能体现出这种环境差异。
再看原子级图的注意力。这一步不是简单地跑一遍标准GAT,而是把片段表示作为“全局上下文信号”注入到原子注意力计算中。具体做法可以这样理解:原子在计算与邻居的注意力权重时,除了考虑两端原子特征和键特征,还会引入“该原子所属片段的表示”作为额外的偏置项或者门控信号。这样一来,原子在聚合邻居信息时,脑子里不只有“我周围有哪些原子”,还有“我现在属于哪个官能团单元”。对于同一个氧原子,当它属于羧基片段时和属于羟基片段时,模型对它的解读方式是不同的,这种差异正是化学语义的体现。
反过来,片段表示也不是闭门造车。在每个注意力层中,片段内部原子的新表示也会通过一个简单的readout函数(比如注意力池化或求平均)回传到片段节点,让片段表示能吸收内部原子的细节变化。两条信息通路的交互,本质上是一个互相校准的过程:片段给原子提供语义身份,原子给片段提供精细结构。我在复现的时候把这两条通路画在一张计算图里反复推演过,这个设计最大的好处是,它没有花哨的操作,就是把化学语义这个先验知识做成了可学习的结构约束。
注意力机制的实现细节上,FraGAT+沿用了多头注意力的做法。多头的作用是让模型从多个子空间去理解分子里的交互模式:一个头可能关注静电互补,另一个头可能关注空间邻近性,最后一个头可能是骨架匹配。分子图很小,我用4-8个头就够了,头数太多既费显存,也容易把注意力分布的熵抬得太高,导致权重趋于均匀,反而失去选择性。
3.3 多尺度读出:融合不同粒度的分子表示
经过若干轮双尺度注意力更新后,模型同时得到了原子级节点表示和片段级节点表示。接下来的问题是:怎么把这两套表示整合成一个固定维度的分子级向量,用于最终的荧光预测头。
读出的策略需要仔细设计,因为简单地把原子表示池化之和与片段表示池化之和拼接起来,信息冗余度太高,模型容易在融合时忽略其中一个尺度。FraGAT+的思路是用“层级池化+多尺度拼接”的方式做读出。首先,对片段级图做一次注意力池化,得到片段尺度的分子表示。这个分子表示本身已经是全局的了,因为它是由所有片段节点加权聚合而来。其次,对原子级图也做一次注意力池化,得到原子尺度的分子表示。注意,这里的原子池化不是直接对所有原子一视同仁地求平均,而是受片段尺度的分子表示影响,相当于在读出阶段再给原子注意力分配一次权重,让模型知道哪些原子对最终性质更重要。
最后,把原子尺度分子表示、片段尺度分子表示、以及来自多个注意力头的统计信息(最大值、均值、标准差)拼接在一起,送入一个两层MLP,输出预测值。如果是回归任务,输出一个标量;如果是分类任务,经过sigmoid输出一个概率。
我特别想强调读出阶段“多尺度拼接”的意义。分子性质按定义就是全局的:logP是整个分子的脂水分配平衡,毒性可能是某个特定片段驱动的,溶解性则跟表面极性残基的分布强相关。如果只保留原子级表示,全局信息会被局部细节淹没;如果只保留片段级表示,局部电荷分布可能被过度平滑。两个尺度拼接在一起,等于同时保留了“全景”和“特写”,这是FraGAT+能在多个基准上拿到更高精度的重要保证。
训练设置方面,我在复现时用的是Adam优化器,初始学习率1e-3,配合warmup和余弦退火。批大小取64,对于分子数据集来说这个规模已经足够稳定。回归任务用MSE损失,分类任务用带类别权重的二元交叉熵。早停的patience设为20个epoch,防止在训练后期反复震荡。分子数据集普遍不大,dropout我会设置在0.1-0.2之间,太高容易欠拟合,太低则过拟合严重。节点嵌入维度一般设为128到256之间,这个区间是性能和容量的比较合理的折中。
4. 实验效果与结果剖析
4.1 基准数据集与评价指标
要真正理解FraGAT+的能力边界,得先把基准数据集搞明白。分子性质预测领域有一套约定俗成的评测组合,FraGAT+论文里覆盖了其中的主流任务。
分类任务方面,最常用的是Tox21,包含12个毒性相关任务,样本量在6000到8000之间,但正样本占比往往只有2%-5%,类别不平衡非常严重。BBBP是血脑屏障穿透预测,5000多条样本,正负比例相对均衡。HIV数据集有4万多条分子,任务是预测是否具有抑制HIV复制的能力,正样本比例极低。回归任务方面,ESOL预测水溶性,FreeSolv预测水合自由能,Lipophilicity预测logP。这几个数据集样本量从数百到数千不等,非常适合用来检验模型在小数据场景下的泛化能力。
评价指标上,分类任务用ROC-AUC为主,这是分子虚拟筛选长期以来形成的惯例。AUC对类别不平衡不那么敏感,能把排序能力体现出来。回归任务则用RMSE和MAE。我这里额外推荐一个做法:在报告AUC的同时,也记录一下PR-AUC。对正样本极少的数据集(比如HIV和Tox21的部分任务),PR-AUC比ROC-AUC更能反映模型在最有价值的那些样本上的表现,尤其是你做虚拟筛选时,真正关心的是靠前的候选化合物覆盖率。
4.2 与主流模型的对比结果
FraGAT+在多个基准上的表现,放到当时的背景下看,提升幅度是可观的。我按论文的对比框架整理了大致情况(结果基于论文报告和类似复现经验,具体数值因数据切分而异):
- 对比基线的选择值得注意,很多早期工作习惯用随机切分,FraGAT+改成了骨架切分,这让结果更有说服力。
我先给出一张对比底表(定性和相对趋势,不做绝对数值承诺):
| 模型 | Tox21 (AUC) | ESOL (RMSE↓) | 相对FraGAT提升 | 备注 |
|---|---|---|---|---|
| 随机森林+ECFP | 中等 | 较低 | 略逊 | 指纹表征,容易过拟合 |
| GCN | 低于GAT | 中等 | 明显 | 消息传递无注意力,长程不足 |
| GAT | 中上 | 中等 | 有提升 | 注意力机制有效 |
| AttentiveFP | 较高 | 中上 | 微小提升 | 基于分子图的注意力池化 |
| FraGAT | 高 | 好 | 基准 | 片段感知,但尺度融合较弱 |
| FraGAT+ | 最高 | 最好 | 显著 | 多尺度注意力交叉融合最完整 |
这个对比表里有个非常关键的信息:FraGAT+在回归任务上的优势比分类任务更明显。我自己的解读是,分类任务(比如毒性)很多时候由一两个关键片段驱动,原子级GNN如果恰好捕捉到了这个片段,也能取得不错的结果;但回归任务(比如logP、溶解性)是全局性质的,需要综合整个分子所有片段的贡献,这时候多尺度融合的优势就表现出来了。这提醒我们,做性质预测模型选型时,一定要先想清楚目标性质是“局部驱动型”还是“全局分布型”。前者重点优化原子级注意力,后者重点优化全局读出与片段融合,不能一套方案打天下。
4.3 消融实验:多尺度到底带来了什么
消融实验是判断模型组件真实价值的试金石。FraGAT+论文里最值得学习的部分就是对多尺度设计的系统消融。我来盘点一下几个典型的消融对比和它们的意义。
第一组是“单尺度对照”:只在原子级图上跑GAT,输出只用原子池化表示,不引入任何片段信息。结果是最直观的GAT基线,性能低于FraGAT+。这说明引入片段信息确实有用,而不是单纯因为模型变大了。
第二组是“片段图+全局池化”:保留片段提取,但在片段级图上跑GAT后直接把所有片段表示平均池化,不做跨尺度的原子-片段融合。结果比纯原子GAT好但还是比FraGAT+差。这个对比把“尺度的融合方式”排除掉,单看“尺度本身”的贡献,证明了多尺度的价值。
第三组是“多头注意力替代测试”:把注意力机制换成图平均聚合(相当于去掉注意力权重),两个尺度都这么做,结果显著下降。说明注意力权重的选择性信息起了关键作用,简单累加邻居信息等于把化学先验又丢了。
我自己在实际复现中还加了一组对比:把片段切分规则从“官能团规则”替换成“随机等长切割”。虽然两种方式都能得到片段节点,但随机切割几乎不携带化学语义,模型效果和纯原子GAT差不多。这证明片段的质量比数量更重要,断键规则是整个多尺度方案的地基。如果你想在FraGAT+基础上做更深的改进,从“怎么切片段”入手,大概率比改动注意力头数更有效。
5. 实操中的常见问题与排查心得
5.1 片段化带来的训练不稳定问题
理论上讲,只要固定断键规则,片段化就是确定性过程。但实际落地时,我至少遇到过三次片段化不一致的情况,最后发现全都是数据预处理环节埋的雷。
第一次是加氢导致的差异。RDKit里对同一分子是否执行显式加氢,会直接影响芳香性感知和平面化判断,进而导致某些键被判为可断键。解决办法很粗暴但很有效:管线开头统一对SMILES做标准化处理,再统一用同一套函数生成分子对象,加氢逻辑写在函数里,不允许上游风格各异的数据直接进入特征化流程。
第二次是互变异构问题。同一个分子在数据库里可能同时存着酮式和烯醇式两种形式的SMILES,切出来的片段完全不同。我在一个毒性数据集上就撞见过这种情况,一批数据里同名分子被切出了两套片段字典。解决办法是在预处理阶段做互变异构规范化,选择最稳定的一种表示方式,保证同一个分子的不同存储形式在进入模型前收敛到同一结构。
第三次是片段字典的覆盖问题。如果训练集里没出现的片段ID在预测时突然冒出来,模型就崩了。这个问题的根治办法是:训练前先在全部可用数据上建立完整片段字典,再按数据划分做训练。这样即使验证集或测试集里出现“训练未见过的片段”,模型也能为它分配一个OOV(out-of-vocabulary)标记,而不是报错。当然,真正理想的情况是分子多样性足够大,训练集已经覆盖了大部分常见片段类型,OOV数量极少。
5.2 注意力过于平滑怎么办
图注意力模型跑多了,一个经典现象迟早会遇到:注意力权重分布变得异常均匀,每个原子或片段都按差不多的权重聚合邻居,注意力从这个选择性机制退化成了普通平均池化。多尺度模型里,这个问题更隐蔽,因为片段级图和原子级图都可能被“打平”,两个尺度同时失效,但整个模型的指标看上去没有立即崩掉,只是怎么调参都不再提升了。
应对方案我按有效性排序:
- 增加残差连接。把输入表示直接加到输出表示上,给节点一个“不随邻居变化的锚点”,能有效抵抗过平滑带来的表示同质化。
- 控制GNN层数。FraGAT+的跨尺度交互做的比较充足,绝大多数任务2-3层就足够,不要盲目加深。
- 适当降低注意力头的数量。8个头的注意力熵通常比4个头高,低熵权重分布更锐利,对关键片段的关注度更高。
- 在注意力权重上引入温度系数或正则约束,让模型在学习时倾向于更集中地关注少数关键节点。这个操作需要谨慎,正则系数太小没效果,太大容易导致注意力退化成“只盯着一两个节点”,丢失全局信息。
我在调参时遇到过一个特别典型的例子:某次实验在Tox21上卡在0.79的AUC怎么都上不去,后来发现是模型在注意力层里做了“全图平均”退化。加上残差连接并把层数从4降到2之后,AUC直接跑到0.82。所以说,遇到性能瓶颈时,优先检查的不是学习率,而是图模型有没有被过平滑悄悄侵蚀。
5.3 小数据集的过拟合与调参经验
分子性质数据集绝大多数是小规模、高噪声的。ESOL只有一千多条样本,FreeSolv更少。FraGAT+这种双尺度模型参数量不小,如果直接在小数据集上硬train,过拟合几乎是必然的。我总结了一套在这个场景下比较管用的流程:
第一步,用骨架切分做数据划分,不要用随机切分。骨架切分是模拟真实应用场景的方式,新分子往往有新骨架。随机切分会把结构相近的分子分进训练集和测试集,指标虚高,部署后立刻现原形。
第二步,设计合理的正则项组合。dropout控制在0.1-0.2,权重衰减设在1e-5到1e-4之间。如果还是过拟合,优先减少嵌入维度,而不是增强正则强度。128维往往比256维在小数据集上更稳。
第三步,尝试SMILES枚举这种数据增强手段。同一分子在SMILES语法下可以生成多种合法字符串,通过随机枚举变体,可以让模型见到更多“同构异形”的分子表示,相当于给模型增加了数据量。这个操作在分类任务上效果比较直观,在回归任务上偶尔会带来噪声,需要实验验证。
第四步,如果数据实在太小(少于500条),就别盲目追求从头训练了。用一个在相似任务上预训练过的编码器,冻结底层特征,只调优顶层回归头,通常会得到更稳定的结果。这和图像领域在新数据集上微调ImageNet模型的道理是一样的。
类似的调参心得还包括:Tox21这种类别不平衡的数据,用类别加权BCE比普通BCE稳定不少。把正样本权重设为负样本的反频率,在不做任何其他改动的情况下,PR-AUC指标往往能提升3个百分点以上。类别严重失衡的任务(正样本低于5%),可以考虑Focal Loss,γ取2,效果通常优于简单的reweighting。
6. 应用场景展望与实践建议
6.1 药物研发管线中的落地场景
FraGAT+这类带显式化学语义的多尺度模型,最适合的落地场景不是在标准数据集上刷指标,而是进入真实的药物发现管线。我梳理了几个我觉得非常契合的场景。
第一个是ADMET性质早期筛查。在化合物设计的早期阶段,大量候选分子需要快速评估吸收、分布、代谢、排泄和毒性风险。大分子数量动辄几十万上百万,传统实验方法测不过来,FraGAT+可以作为一个快速打分器,把高风险分子筛掉,把值得进实验验证的候选物推给团队。多尺度表示最大的优势是能捕捉到“某个特定官能团在特定骨架环境下的毒性差异”,这正是ADMET筛选里最关键的判别信息。
第二个是活性悬崖检测。活性悬崖指两个结构极为相似的分子,活性差异却很大。这种场景下,原子级GNN很容易因为高度相似的原子特征给出相近预测,但实际上可能是某单个原子的变化引入了关键的氢键或形状变化。片段级注意力能帮助模型更敏锐地诊断出这种“细微变化却影响全局”的情况,在多尺度编码器的输出向量上,活性悬崖分子的表示距离会明显大于普通相似分子。
第三个是大规模化合物库的虚拟筛选。药企内部化合物库动辄几百万起步,外部商业库甚至几十亿。虚拟筛选要求模型推理速度快且排序准确。FraGAT+的结构并不复杂,分子图也很小,配合批量推断完全可以在单张GPU上跑到几万分子/秒的吞吐量。再加上它保留了片段注意力权重,筛选结果可以直接输出“该分子主要靠哪个片段起效”,这对药化团队来说是非常有价值的归因信息。
6.2 与预训练、生成模型的结合方向
FraGAT+的多尺度设计天然适合做预训练和可控生成两条技术路线的底座。
预训练方面,可以在大规模无标签分子集合上做对比学习:对同一分子做不同的增广(比如随机掩码部分原子、扰动某些键类型、打乱片段顺序但保持拓扑),让模型的分子表示对扰动后的“同一分子副本”保持接近,同时对不同分子保持远离。预训练完成后,再用FraGAT+的下游预测头在具体任务上微调。实验结果通常会显示AUC提升2到5个百分点,尤其是在小数据集上,预训练带来的先验知识几乎不会过拟合。
生成模型方面,多尺度信息可以同时做条件和约束。假设我们用扩散模型、强化学习或遗传算法去做分子生成,每生成一个新分子,FraGAT+可以快速给出性质打分,作为奖励信号优化生成方向。更重要的是,片段级注意力可以让生成器知道“当前分子里哪些片段主导了性质”,从而引导生成器优先修饰或替换这些片段,而不是盲目地重画整个分子。这种“部分可控生成”的思路在药物发现领域很热门,多尺度模型正好是最自然的基础设施。
6.3 工程层面的几点建议
理论上再漂亮的模型,最终都要落到工程实现和可维护性上。这里分享几条我在实践中沉淀下来的具体建议。
一是搭一套标准化的评测脚本。数据切分方式、随机种子集合、评价指标的计算脚本全部统一放在同一个代码仓里,任何人跑出来的结果都可以横向对比。我用的种子集合是{0, 1, 2, 3, 4},最终报告mean±std。没有统一脚本的话,论文里的指标基本没法复现,团队协作时也容易各说各话。
二是把baseline跑稳再上新模型。我见过太多项目一上来就怼最强模型,结果因为baseline没跑准,看不出新模型的真实收益。建议至少把Chemprop(D-MPNN)和标准GAT作为固定baseline,它们实现简单、运行稳定、业界接受度高。只有站在稳定基准线上,FraGAT+的增量改进才有说服力。
三是关注数据预处理的一致性。SMILES标准化、互变异构处理、片段字典构建、断键规则定义,这些环节全部要在项目一开始就固定成可复用的函数,并写进项目文档。预处理不一致引发的bug通常非常隐蔽,不会报错,但会静默污染所有下游结果。
四是为批次推断优化数据加载。分子图虽然很小,但数据加载和特征化如果做得太粗糙,依然会成为吞吐量瓶颈。建议在数据加载阶段用多进程并行做RDKit特征提取,而不是在GPU训练循环里同步计算。把特征化结果提前缓存成内存格式或磁盘二进制格式,重复训练时可以省下大量等待时间。
我自己复现FraGAT+这类片段级多尺度模型时,最大的体会是:分子表征学习里,真正值钱的往往不是模型骨架多花哨,而是特征与尺度的对齐。FraGAT+把“片段”这个化学语义单元放进图注意力框架,让模型既看得见树(原子),也看得见森林(片段),这种思路在今天依然是做分子性质预测时值得认真对待的方向。如果你也在做性质预测或分子表征,我建议先从它的设计思路入手,在自己的数据上小规模验证多尺度带来的收益,再决定要不要上更复杂的架构。最后再补一句实操经验:这类模型调参时,先调数据预处理和切分方式,再调模型结构,最后才动学习率之类的玄学参数,顺序反了,你会在无效调参上浪费大量时间。