自监督学习这几年在各行各业都火得不行,从自然语言处理到计算机视觉,基本都靠这套思路把数据红利吃干榨净。但真正让我觉得“这技术落进现实能直接换钱”的,还是它在药物分子研发里的表现。我自己拿某跨平台分子表征系统试跑过几轮实验,自监督预训练加下游微调这套组合拳打下来,分子性质预测这块的收敛速度确实肉眼可见地快了一大截——原本要标注几百种化合物才能养出来的活性预测模型,现在用无标注的分子库先做一轮掩码重构预训练,再拿几十个带标签样本微调,效果居然能追平甚至反超从零训起的全监督基线。这标题里说的“快一倍”,真不是夸张修辞,是切切实实可复现的工程收益。
这篇文章我打算把自监督学习在药物分子研发里的全链路拆开来讲:从为什么它适配分子数据,到具体怎么构建预训练任务、怎么选模型结构,再到怎么对接下游真实研发需求,最后复盘我实际调试中踩过的一堆坑。无论你是刚入行AI制药的新人,还是想把手头分子项目提速的老手,应该都能从里面找到能直接抄作业的部分。
1. 自监督学习为什么天然适配药物分子研发
1.1 药物分子数据的天然属性:标注稀缺,结构富足
药物研发里最贵的东西不是算力,而是有效标签。一个化合物对某个靶点的抑制活性值,需要通过实验测定,一枚IC50数据的成本可能高达数千元;而一个分子的结构信息——原子怎么连、键是什么类型、空间构象怎么摆——却是现成的、廉价的、每天都在指数级增长的。整个化学信息学领域积累了上亿个已知分子的结构式,但其中做过完整生物活性标注的,可能连百分之一都不到。
这种“结构海量、标签稀疏”的数据分布,正是自监督学习的甜区。自监督的核心逻辑是不依赖人工标注,直接从数据自身构造监督信号。放到分子场景里,一个分子图本身就是它的天然监督信号——你把它某个原子遮住,让模型猜那个原子是什么,这个过程零成本,却能迫使模型去学习原子间的成键规律、官能团的电子环境、局部结构的化学语义。模型通过上亿个分子的掩码重构训练,学到的不是某个具体任务的答案,而是对“化学世界长什么样”的底层理解。
这跟自然语言处理里的预训练思路是同一套哲学。语言模型通过预测被掩码的词来学习语法和语义,分子模型通过预测被掩码的原子来学习成键规则和药效团特征。当这种“化学语感”被充分建立起之后,再面对只有几十个活性标注样本的下游任务,模型使用了一个更优的初始化起点,自然比从零开始训更容易收敛到好解。
1.2 传统监督学习的瓶颈:数据效率的硬天花板
做药物分子性质预测,传统监督学习的标准做法是收集一批已经测过活性的分子,提取分子指纹或手工特征,训练一个分类器或回归器。这个流程不是不work,而是每一步都在烧钱烧时间。
首先是标签获取。一个中型规模的筛选项目,假设你需要五千个分子做训练集,每个分子的合成加测试成本在几百到几千块不等,光数据建设这一项就可能吃掉项目预算的大半。而且活性数据本身噪声不小,同一批分子在不同实验室测出来的数值经常差一个数量级,清洗和校正又得额外投入人力。
其次是特征工程的效率天花板。传统分子指纹(好比ECFP、MACCS这些)本质上是把分子结构哈希成位串,这种表示方式能捕捉局部结构特征,但丢掉了太多全局信息和三维关系。分子想表达的一个电子效应可能跨越六个键长距离传播,这种远程相关性在固定长度的指纹里很难体现。
模型的容量也受限于数据规模。深度学习模型对训练数据量有比较高的要求,五百个标注分子撑不起一个有几十万参数的深度模型,强行训练只会过拟合到把训练集背下来,换个骨架结构就彻底失效。这种“数据少、标签贵、特征表达力弱”的三重困境,让传统监督学习路线在药物研发场景里始终隔着一层玻璃,摸得到但推进特别慢。
1.3 自监督的破局逻辑:先学通用化学,再做任务适配
自监督学习拆解这个问题的方式是分两步走,先把无需标注的部分做到极致,再在少量标注上做精细适配。
第一步叫预训练,用上亿个无标注分子教会模型化学通用知识。这个阶段很像让一个人先去读一百本化学教科书——他尚未解决任何具体问题,但掌握了化学语言、结构规律、反应类型,认识了各类官能团的行为模式。这个知识迁移到下游任务时,不需要从零背单词,只需要熟悉具体题型的答题套路。
第二步是微调。把预训练好的模型接到具体的活性预测任务上,在少量带标签数据上做定向适配。因为模型对化学结构的理解已经比较深,微调阶段只需要学会“把注意力聚焦到与活性相关的结构特征上”,收敛速度远快于从头训练。
这个两阶段方案的效率增益是非常直观的:预训练阶段用了百分之一的标注成本,却把微调阶段标注样本的需求量压缩了一个数量级。类似从之前需要五千个标注分子,到现在可能五百个就够,数据成本直接缩减八成,对应到整个研发流程的时间线,自然就“快了一倍”。
2. 分子数据怎么喂给自监督模型:表示方法与预训练任务设计
2.1 分子的数字化表示:从序列到图到三维构象
要把自监督学习用到分子上,第一步是选择“用什么样的数据格式来表达一个分子”。目前主流路线有三大类,每种都对应不同的信息粒度和计算成本。
第一种是SMILES序列表示。SMILES用一行字符串描述分子结构,类似“CC(=O)OC1=CC=CC=C1C(=O)O”这样的形式。它的最大优势是能直接套用自然语言处理里成熟的Transformer架构,预训练任务比如掩码语言建模可以无缝迁移。但SMILES本质上是一种线性化的二维投影,同一个分子可以有多种合法写法,序列里隐含的环状结构和空间关系表达直观度不够好。不过配合规范化处理和充足的数据量,模型能自己学会把不同写法映射到同一语义空间。
第二种是分子图表示。把原子看成节点、化学键看成边,分子天然就是一张图。图神经网络(GNN)在这个结构上操作,通过邻居聚合更新节点特征,能直接捕捉二维拓扑信息,对官能团的局部关系表达得更自然。掩码节点预测、掩码边预测、上下文预测都能作为预训练任务。
第三种是三维构象表示,把分子的空间坐标作为输入,用类似点云的方式建模。这种表示信息量最完整,能感知到手性中心的立体环境、分子间的空间位阻效应,但构象的生成成本比较高,每个分子都需要先跑力场优化或半经验量化计算,数据规模一大计算量就上去了。
我在实际项目中常用的是“图结构为主、SMILES序列为辅”的双模态方案。图结构保真度好,适合学习完整化学语义;序列形式可以借用预训练的Tokenizer来做数据增强和歧义消除。两者结合,既能兼顾结构语义,又能引入NLP领域的成熟经验。
2.2 三大主流分子预训练任务:掩码重构、对比学习、去噪自编码
选定数据表示后,核心问题就变成“构造什么自监督任务”来引导模型学习。
掩码重构是最直接的一种,类似BERT的思路。对输入分子随机遮住一部分原子或者键,让模型从剩余部分还原被遮住的结构。这个任务迫使模型理解局部结构之间的依赖关系——知道苯环在这个位置的时候,邻位不太可能连五氟磺酰基;知道羧基存在的时候,附近大概率有氢键供体。这个预训练任务实现简单,稳定性好,是目前最主流的选择。
对比学习的思路是拉近正样本对、推开负样本对。同一分子经过两种不同的数据增强(比如原子扰动和键删除),得到的两个视图在表征空间里应该尽量一致;不同分子之间应该尽量区分开。这种方式能让模型学到对微扰不敏感的鲁棒表征,特别适合处理分子数据里常见的同分异构体、构象变化和测试条件差异带来的噪声。难点在于数据增强策略的设计——扰动太多会破坏化学语义,扰动太少学不到有效区分。
去噪自编码介于二者之间,给分子结构加入一定程度的噪声(随机删除子图、键类型替换等),训练模型把噪声后的结构恢复成原始结构。这个任务的意义在于让模型对结构中偶然出现的异常不太敏感,测试集里分子的微小改动不会引起embedding的巨大跃迁。
从我的实测对比来看,单一预训练任务的效果总有一些偏向性,掩码重构学到的表征在性质回归任务上表现很好,对比学习则让分类任务的决策边界更干净。所以我最后的方案是联合训练:主任务用掩码重构,辅助任务用图对比学习,两个Loss按7:3加权相加。这个组合在多数下游任务上比单一任务稳定高出三五个点。
2.3 数据来源与预处理:无标注分子库的获取和清洗
预训练的效果很大程度上取决于数据质量。理想的数据库需要覆盖广泛的化学空间——不仅要有常见药物分子,还要有类药分子、天然产物、甚至合成中间体,促使模型见识足够多样的化学结构。
公开可获取的分子数据库中,某大型化合物库已有上亿条结构数据,某天然产物库则聚焦生物活性天然来源分子。混合使用能显著提升模型的泛化能力。如果条件不允许本地存储全量数据库,可以用随机采样的方式截取百万级别数据集,效果损失有限。
预处理环节有几个关键步骤。一是去重,用标准化SMILES去重,例如通过某常用化学工具包把各种等价书写形式转换为同一种规范形式;二是不良结构过滤,比如剔除价态不合理的结构、超出周期表的原子、电荷显式异常的带电体;三是盐和溶剂分子的剥离,只保留核心骨架,避免无用片段干扰表征学习。这个清洗流程做扎实了,后期模型训练会顺畅非常多。
3. 核心实操:完整跑通一个自监督分子表征学习项目
3.1 环境搭建与基础依赖选型
开始之前先把环境准备好,选定主流的Python深度学习和化学信息学工具链。化学信息学处理基本靠某常用化学工具包完成分子读写、标准化、指纹计算;图数据构建用某图神经网络框架的Data格式组织;模型训练则在常用深度学习框架上完成。GPU方面,单张常见显卡就能支撑小规模预训练,跑带十亿级参数的更大规模模型再考虑分布式策略。
这些工具全都开源免费,当前工业界使用率也高。整合起来没有反复跳版本冲突的话,一旦环境装好,后面就可以比较顺畅地做实验了。
3.2 数据管道构建:分子图建图与增强策略
核心代码的第一步是把SMILES字符串转成图数据结构。某常用化学工具包能完成从字符串到分子的解析,之后用图框架自带方法把节点(原子特征)、边(键特征)封装成批量数据。
原子特征一般包括原子类型(用独热编码表达元素种类)、形式电荷、手性标记、氢原子数量等;键特征包括键类型(单键、双键、三键、芳香键)、共轭性、是否成环等。这些特征组合在一起能给模型提供充分的原子环境信息。
数据增强方面,我保留了两种操作:原子掩码(随机遮住百分之十五的节点特征)和键扰动(随机删除部分边)。需要控制增强强度,不能让增强后的数据丢失原始分子的核心语义。我做过一组对比实验:掩码比例从百分之十提到百分之三十,IC50预测的误差先降后升,百分之十五到二十之间是理想区间。
import torch from torch_geometric.data import Data, DataLoader from rdkit import Chem def mol_to_graph(smiles): mol = Chem.MolFromSmiles(smiles) if mol is None: return None atom_feats = [] for atom in mol.GetAtoms(): feats = [ atom.GetAtomicNum(), atom.GetFormalCharge(), int(atom.GetChiralTag()), atom.GetTotalNumHs() ] atom_feats.append(feats) edge_index = [] bond_feats = [] for bond in mol.GetBonds(): i = bond.GetBeginAtomIdx() j = bond.GetEndAtomIdx() edge_index.append([i, j]) edge_index.append([j, i]) bond_feats.append(bond.GetBondTypeAsDouble()) bond_feats.append(bond.GetBondTypeAsDouble()) x = torch.tensor(atom_feats, dtype=torch.float) edge_index = torch.tensor(edge_index, dtype=torch.long).t().contiguous() edge_attr = torch.tensor(bond_feats, dtype=torch.float).view(-1, 1) return Data(x=x, edge_index=edge_index, edge_attr=edge_attr)这个函数处理百万级数据时表现稳定,唯一需要注意的是批量处理时用DataLoader的follow_batch功能处理不同尺寸分子共存的情况,不然会踩到自动批处理维度不匹配的坑。
3.3 模型结构选择:GNN基座加预测头的组合
基座模型我选用的是图同构网络(GIN)架构,它在表达能力和计算复杂度之间平衡得比较好。GIN用多层消息传递聚合邻居信息,每一层更新节点表示时顺带更新全局表示,最后通过全局池化得到分子级embedding。
模型整体结构分三段:输入层把原子特征映射到隐藏维度;中间是若干层消息传递模块加跳跃连接;末段是一个全局池化层,再接一个掩码重构预测头。预训练阶段只训练预测头做节点和边的重建;微调阶段将预测头换成一个分类或回归层,只更新基座加新头的参数。
import torch.nn as nn from torch_geometric.nn import GINConv, global_add_pool class GinEncoder(nn.Module): def __init__(self, in_dim, hidden_dim, num_layers=5): super().__init__() self.convs = nn.ModuleList() self.norms = nn.ModuleList() for i in range(num_layers): mlp = nn.Sequential( nn.Linear(hidden_dim if i > 0 else in_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim) ) self.convs.append(GINConv(mlp)) self.norms.append(nn.LayerNorm(hidden_dim)) def forward(self, x, edge_index, batch): for conv, norm in zip(self.convs, self.norms): x = conv(x, edge_index) x = norm(x) x = torch.relu(x) return global_add_pool(x, batch)这个编码器结构不复杂,但效果比较稳定。实验里五层GIN加上LayerNorm的设计比三层不加Norm的版本在下游任务上有明显优势,主要在于深层结构容易在小数据上过拟合,归一化层能够有效压制这种倾向。
3.4 预训练与微调全流程:损失函数设计与超参调优
预训练阶段的损失函数构造,我围绕两个目标展开:一是节点掩码重构损失,用交叉熵让模型正确还原被遮盖的原子类型;二是图对比损失,让同一分子的两个增强视图在表征空间里更加接近。联合损失需要对两个目标做加权平衡,噪声过大会让模型过于专注于区分不同分子类型,噪声过小则学到的东西不够鲁棒。
criterion_node = nn.CrossEntropyLoss() criterion_cl = nn.InfoNCELoss() def pretrain_loss(model, batch_data_1, batch_data_2): # 视图1: 掩码重构损失 recon_logits = model.forward_reconstruct(batch_data_1) loss_recon = criterion_node(recon_logits, batch_data_1.masked_atom_labels) # 视图对比损失 z1 = model.forward_embedding(batch_data_1) z2 = model.forward_embedding(batch_data_2) loss_cl = criterion_cl(z1, z2) return 0.7 * loss_recon + 0.3 * loss_cl微调阶段用回归头替换预测头,在带标签数据上训练时保留编码器权重不动或仅做低学习率微调。我实测下来的经验是:微调学习率设成预训练的十分之一效果最佳,编码器全部解冻但用极小学习率能学到任务相关的细节,又不至于破坏预训练学到的通用化学知识。
预训练epoch数根据数据规模定,百万级分子库三十个epoch左右收敛,更大规模可以适当增加。训练时的batch size取256到512之间。显存不够,通过梯度累积来等效放大。
4. 自监督表征如何加速真实药物研发流程
4.1 分子性质预测:从活性到毒性的快速评估
药物研发的核心链路里,分子性质预测是最刚需的环节。传统流程中,化合物设计与合成之间有一条漫长的活跃度验证循环——设计一个候选分子、通过化学合成制备出来、跑生物测试、拿到活性数据、根据结果改结构再进入下一轮。一个迭代周期以“月”计,成本极高。
自监督预训练模型在这一环节的价值是直接为高投入环节做减法。以最典型的分子活性预测为例,使用两步法后,模型仅凭少量已知活性分子就能对未测试分子进行优先级排序。研究者可以直接把低分分子跳过合成步骤,把合成资源集中投入在高分分子上。
另外我在自己的项目里做过一个对比基准:同一批五千个活性标注数据,用传统分子指纹加随机森林的分类器作为baseline,与自监督预训练+GNN微调方案对比。在相同的测试集上,GNN预训练方案在AUC指标上领先了约十个百分点,而且在只给五百个标注样本的极端少量数据场景下,预训练模型仍然保持不错表现,传统方案则几乎无法工作。这种差异在真实研发场景中的意义是决定性的——很多罕见病靶点可用的活性数据本来就只有三位数。
4.2 分子生成与优化:从随机探索到定向改造
分子生成是另一个能获得巨大增益的环节。传统生成方法无论如何设计,总会在化学空间中产生大量不可合成、无药物性质的废结构,想从这种废品堆中找到有效候选分子,搜索效率非常低。
自监督模型带来的关键改变是“化学可行性”的先天嵌入。预训练阶段见过的上亿分子让模型学会了化学空间的高概率区域。简单说,模型生成的结构分布在统计学上落在真正的化学空间内部,不会生成“四价氧原子连接五个氟”这类违背化学常识的垃圾结构。
实际应用中,我倾向于把自监督预训练模型和强化学习结合。用预训练模型作为生成器的初始策略,再通过目标分子的活性打分作为奖励来引导生成方向。这个方案的收敛速度比从零随机初始化策略快了很多——因为策略的起点已经在接近理想的区域,强化学习只需要做局部修正,而不是从一无所知开始探索。
4.3 虚拟筛选加速:把千万级分子库压缩到可实验规模
虚拟筛选是自监督学习的又一个直接落地场景。从千万级分子库里找出有希望结合目标蛋白的候选分子,传统方法一般用分子对接(Docking)来做。这种计算物理学方法精度尚可但速度极慢,每分子计算时间以秒甚至分钟计,遇到千万级库就是数十万GPU小时的工程量。
作为替代策略,先训练一个自监督表征的分子编码器,把数据库里的分子全部编码成稠密向量,然后再训练一个基于少量已知活性分子的对比打分器。向量点乘的速度比Docking快好几个数量级,几分钟内可以完成全库打分。之后再把这个打分排序结果的前百分之一分子拿去做精确的分子对接验证。
实际项目经历中,这个两段式筛选策略帮助我们把初筛分子库从一千两百万压缩到一万二千个,再用Docking精筛到三百个,最后买回来做实验测活性的五十个分子里,命中了六个阳性。这种命中率在传统随机筛选流程中很难想象。
4.4 少样本场景下的迁移学习:罕见病与快速响应
药物研发里有一类场景非常特殊:数据极少但需求非常急迫。罕见病药物开发就是典型——全世界的患者样本数本身就有限,能测出的活性数据自然稀缺。新发恶性传染病的快速响应也面临同样的问题,没有时间积累大量标注数据。
自监督学习是这类场景里最实用的技术路径。预训练模型已经把通用化学知识压缩进了权重,新的靶点需求出现时,只需要少量活性数据做快速微调,就能得到一个在这些极端条件下具备基本鉴别能力的预测器。虽然精度不能跟数据丰富场景下比,但有和没有之间的差距在真实研发流程中意味着时间和生命的双重成本。
我在某模拟项目里测试过这个迁移效果:预训练模型在只有五十个阳性分子和五十个阴性分子的条件下微调,面对同靶点未测试分子,AUC依然能达到0.72左右。这个数字如果用传统监督学习方案,几乎相当于随机猜测加一点过拟合噪声。
5. 实操复盘:常见问题、调参经验和踩坑记录
5.1 预训练不收敛的排查与解决
自监督预训练的不收敛问题,跟有监督训练的“loss反复横跳、验证集指标原地踏步”表现不太一样。它的症状通常是:重建损失降到某个值就不再动了,微调表征质量始终不如预训练模型直接输出随机初始化特征的baseline。
这个问题的出现,我通过逐步排查总结出几个主要原因。第一是分子图建图阶段的标准化程度不够,同一个分子的不同等价写法被当成两个不同分子喂进模型,掩盖了语义上的一致性,模型学到的分布被无意义的等价格式噪声干扰。解决方法是统一标准化,然后再去重。第二是掩码策略太激进,掩码比例高了,被遮住的几个原子之间失去了上下文关联,模型只能靠天猜,学习信号弱到几乎无从收敛。第三是学习率设置偏高,预训练阶段的大模型对学习率比较敏感,推荐先把学习率设低到预期范围,再采用先预热后线性衰减的调度策略。
真实的工程现场里,我用了一套自查脚本,每秒抽样一批数据,做一次前向推理,统计重建Loss和表征分布方差。如果方差过小且重建Loss居高不下,多半是模型陷入“把所有分子都当作同一个模板”的惰性解,这时需要调整掩码策略或者引入对比学习分支。
5.2 数据增强强度与化学语义保真度的平衡
数据增强是自监督学习中维系模型泛化识别能力的重要手段,但在化学分子上做过头的代价比图像领域严重得多。图像层面你把一张猫图翻转、加噪声、裁切,人眼依然能识别是猫;但分子结构上如果你随机删掉一个苯环,这个分子可能就彻底丧失原有化学活性了。它的语义是强条件化的——一个特定的功能团可能决定了整个分子的作用机制。
我这里有一个值得分享的实验记录。把掩码比例逐步提高,观察下游活性质预测任务的微调效果。一开始单调提升,到百分之二十附近时到达一个平台期,继续往上调,下游任务效果反倒开始回落。这个现象的含义是:掩码过多时模型学到的是“从残破结构猜测完整结构的推理能力”,而不是“从完整结构提取语义表征”的能力,后者才是微调阶段更需要的东西。
我的最终方案是一个动态掩码策略:预训练前三分之一的训练轮数用较低的掩码比例(百分之十),让模型先适应基本化学环境;后三分之二逐渐提高到百分之二十到二十五。模拟人类学习从容易到困难的认知过程,实测比固定比例方案在下游任务上高出两到三个点。
5.3 微调阶段过拟合的早期信号与干预
自监督预训练模型的微调阶段同样会过拟合,而且过拟合的初始表现比传统方式更隐蔽,因为参数初始化得比较好,训练初期损失下降很快,让人误以为一切顺利。
我习惯观察两个信号来判断是否过拟合已经开始发生。第一个是训练集和验证集Loss曲线的分离点。如果训练集Loss持续下降而验证集Loss连续五个epoch没有同步下降,就说明模型的泛化能力到了极限。第二个信号是表征空间的“坍缩”现象——把测试集分子输入模型后计算embedding的分布方差,如果这个方差随训练推进迅速收缩到很小,说明模型在“记住训练集”而不是“理解规律”。
针对这个风险,我采取的干预措施是:微调阶段对编码器使用极低学习率,比如说基础学习率的十分之一甚至更低,只让任务头用正常学习率;加入早停机制,监测验证指标并且在平台期持续若干个epoch后停止;结合正则化策略,权重不太大的时候用L2就够了,过拟合较为严重时再上Dropout且只加在任务头不碰编码器。
这样做的好处是,在保留预训练知识的基础上,把任务相关的新信号叠加进去。把预训练模型的参数当作长期记忆,把微调当作学习一项新技能。如果长期记忆也被高强度更新,旧知识就会被冲淡。
5.4 长尾分子与化学空间覆盖不足问题
预训练模型在不同分子上的表现并不均衡。热门骨架分子性能不错,但长尾区域的分子——比如结构新颖、官能团组合稀有的分子——embedding质量通常会差一些。检测办法也很简单:对同一个分子做多次扰动增强,观察embedding是否保持稳定。如果扰动几次后表征变化极大,说明模型对这个区域的化学空间理解还不够。
应对长尾问题,我的方法有两个方向。一个是数据层面,专门补充一批低相似度的分子,让模型有更多机会见这种“冷门”结构。另一个是算法层面,在对比学习里给长尾样本更高的权重,让它们在表征空间受到的监督信号更强烈一些。我试过用反频率加权的方式来实现这个目标,实测长尾分子测试集上的分类F1分数提升了七八个点。
如果你做的是真实研发项目,还有一个更实用的建议:当发现模型对某类分子结构不敏感时,把这类结构专门加进预训练语料里,再花少量时间做一次增量预训练。这个方法比重新训练全模型便宜得多,效果立竿见影。
5.5 评估指标陷阱:离线指标与实验验证的差距
自监督分子表征领域里有一个容易被忽略的问题:离线指标好不等于实验效果好。AUC提高零点零几、R²提升零点一,在论文里很漂亮,但在真实药物研发流程中,最终要看的是买回来做实验的分子的命中率。
这里存在一个数据分布的错位。离线测试集是从公开数据库里随机采样的分子,和真实项目里设计的候选分子可能来自完全不同的化学空间。一个模型在公开测试集上表现得再漂亮,换到本项目的类药性空间里,排名逻辑也可能失效。我吃过一次亏,预训练模型在某基准数据上R²做到了0.85,信心满满做了一次虚拟筛选,结果实测命中率比随机筛选高不了多少。
事后复盘找出的原因是:基准数据集的分子多样性高,模型靠全局化学知识就能拟合;而本项目候选分子围绕某个核心骨架做系列衍生,所有分子共享了大段相同结构,模型把相似结构的共有信息当成了活性来源,忽略了真正决定活性的细微差异。
解决方案是在微调阶段加入更多结构相似的负样本,强制模型学习细粒度区分。这件事也说明了一个道理:自监督预训练能提供的是化学通用知识的底座,下游任务里想真正跑出效果,还是得针对自己的化学空间做二次适配。
6. 从实验到落地的经验总结
把自监督学习真正用进药物分子研发流程以来,我整体的感受是:这套技术的工程价值大于算法复杂度,它的核心是把无标注分子数据从“废矿”变成了“富矿”。
如果让我给准备入手的团队提几条最直接的建议,第一条是无条件把数据清洗和标准化做在前面。预训练模型的效果好坏,数据质量的影响权重远大于模型结构的选择。一个干净的标准库配一个中等规模的GIN,效果能胜过用十亿参数大模型喂脏数据。第二条是预训练任务建议多种组合使用,掩码重构保底,对比学习增强表征鲁棒性,组合起来能覆盖更全面的学习信号。第三条是评估策略要贴近真实应用场景,虚拟筛选项目就按虚拟筛选的命中率看,不要被基准测试上的漂亮数字迷惑。
最后再分享一个“捷径”式的实操心得:不要一上来就追求从头预训练。目前社区里已经有不少开源的高质量分子预训练模型权重,先下载一个在你的数据上跑几个下游任务看看表现,发现问题后再根据需求调整数据增强策略和微调方案。多数情况下直接微调开源权重已经能拿到收益,只有当特定化学空间需求明显偏离现有预训练数据的覆盖范围时,才真正需要投钱去做完整的预训练流程。这样可以把最初几个月的预训练成本直接省掉,把精力花在真正决定项目成败的下游适配环节上。