一、预训练模型与ADMET简介
各位同学,咱们今天开篇先聊点实在的。预训练模型迁移到ADMET预测——这个组合在药物发现圈子里,最近两年火得不行。我刚开始接触那会儿,也琢磨过:为啥非要把这两个东西绑在一起?
嗯,别急,我们先把底层的概念理清楚。
1.1 预训练模型:到底是个啥?
预训练模型,说白了就是“先在大数据上学一遍,再搬到小任务上调优”。你要是用过BERT、GPT或者ChemBERTa,应该不陌生。传统的做法是:拿一个任务,从头训练一个模型。数据少,模型就废。预训练的思路正好反过来——先在海量无标签数据上“预训练”一个通用表征,再在目标任务上做微调。
我个人习惯把预训练理解成“打基础”。就像学拳击,你先得练体能、练步伐,而不是一上来就打实战。
预训练的核心价值:
- 从大规模数据中学习通用特征
- 减少下游任务对标注数据的依赖
- 提高模型在小样本场景下的泛化能力
举个例子,在NLP里,BERT在数十亿文本上预训练,然后只需要少量标注数据就能做情感分析。在分子领域,道理一样——我们把数百万个分子结构丢给模型,让它自己学会“分子长什么样”。
1.2 ADMET预测:为什么这么重要?
ADMET,全称是吸收、分布、代谢、排泄、毒性。你想想看,一个候选化合物,活性再强,要是毒性大、代谢快、吸收差,那就是纸上谈兵。我在项目中遇到过不止一次:体外活性数据漂亮得不行,一进动物实验就翻车,后来一查,是代谢稳定性太差。
ADMET预测的价值就在于:在进入湿实验之前,先用计算模型筛一遍。这样做的好处很明显——省成本、省时间、降低后期失败率。
常见的ADMET属性,我列了个表:
| 属性 | 含义 | 关键指标 |
|---|---|---|
| 吸收 (Absorption) | 化合物进入体循环的能力 | Caco-2渗透性、口服生物利用度 |
| 分布 (Distribution) | 化合物在体内组织的分布程度 | 血浆蛋白结合率、表观分布容积 |
| 代谢 (Metabolism) | 化合物被酶系统转化的过程 | CYP450代谢稳定性、代谢位点 |
| 排泄 (Excretion) | 化合物从体内排出的途径和速率 | 半衰期、清除率 |
| 毒性 (Toxicity) | 化合物对生物体的有害效应 | hERG抑制、肝毒性、基因毒性 |
这些属性,每一个预测不准,都可能导致整个项目流产。所以业界对ADMET预测的精度要求,其实比活性预测还高。
一个常见的坑: 很多初学者以为ADMET预测可以套用活性预测的模型。我曾经也犯过这个错——直接把一个QSAR模型拿过来预测hERG,结果误差大到离谱。后来才发现,ADMET数据的分布和活性数据完全不一样,样本不平衡、实验噪声大,需要专门的策略来处理。
1.3 预训练模型怎么迁移到ADMET?
好,核心问题来了:预训练模型和ADMET预测怎么结合?
你想想看,ADMET数据有几个特点:数据量小、实验成本高、单个属性的标注样本少。拿hERG抑制数据来说,公开库也就几万条。几万条数据,在深度学习领域,根本不够看。
预训练模型迁移正好能解决这个痛点。具体怎么干?我一般分三步:
- 选模型: 找一个在分子大数据上预训练过的模型,比如ChemBERTa、MolCLR、GROVER。
- 做适配: 把预训练模型的输出层改成适应ADMET任务的分类或回归头。分类任务用交叉熵,回归任务用均方误差。
- 微调: 用ADMET数据对模型进行微调。注意学习率要小,一般1e-5到5e-5,不然预训练学到的知识会崩掉。
这其中的技术细节,咱们后面几章会一点点拆开讲。先放张图,让你对整个知识体系有个全貌:
一个小建议: 刚开始接触迁移学习的时候,别急着改模型结构。先把预训练模型当特征提取器用,看看效果怎么样,再决定要不要做微调。这样能帮你快速定位问题出在数据上还是模型上。
1.4 迁移学习为什么适合ADMET?
说到底,迁移学习的本质是“举一反三”。你在化学空间的大数据上学到了分子的通用表示,这个表示对ADMET任务天然就有帮助。因为ADMET性质和分子结构之间,存在高度非线性的关系,预训练模型恰好擅长捕捉这种关系。
我举个例子。用SMILES字符串做输入的ChemBERTa,在预训练阶段学会了SMILES的语法、分子片段组合规律、官能团的关系。等你要预测hERG抑制活性时,这些知识就能帮上大忙——模型已经知道“芳环+碱性氨基”这种结构很危险,微调只是让它在具体数值上更精确而已。
反过来讲,如果从零开始训练一个hERG预测模型,几万条数据学到的特征非常片面——它可能只记住了某些特定片段,而忽略了更广泛的化学空间规律。
总结一下,预训练模型迁移到ADMET预测的优势:
- 解决了ADMET数据量少的瓶颈
- 利用了化学空间的先验知识
- 降低了训练成本和时间
- 提升了模型的泛化能力和鲁棒性
1.5 一个小Demo:感受一下差距
为了让你更直观地感受,我简单展示一段代码。这只是个示意,别纠结细节。后面章节会逐行讲透。
# 伪代码示意:从零训练 vs 迁移学习
from sklearn.metrics import r2_score
# 数据:假设只有1000个hERG样本
X_train, y_train = load_herg_data(n_samples=1000)
# 方案A:从零训练GNN
model_scratch = GNN()
model_scratch.fit(X_train, y_train)
r2_scratch = r2_score(y_test, model_scratch.predict(X_test))
print(f"从零训练 R2: {r2_scratch:.3f}")
# 方案B:加载预训练模型 + 微调
pretrained = load_pretrained_chemberta()
model_finetune = FineTunedTask(pretrained, task='herg')
model_finetune.fit(X_train, y_train)
r2_finetune = r2_score(y_test, model_finetune.predict(X_test))
print(f"迁移学习 R2: {r2_finetune:.3f}")
说实话,在我自己测试过的一个项目里,从零训练的R²只有0.45,迁移学习直接干到了0.71。这个差距,干过实际项目的同学应该懂——在ADMET预测里,0.1的R²提升可能就意味着你筛掉了几个后期会剧毒的候选分子。
避坑提示: 预训练模型不是万能的。我曾经试过把在ZINC15上预训练的模型直接迁移到肽类ADMET预测上,效果奇差。原因是ZINC15里大部分是小分子药物,和肽类分子的特征空间差异太大。迁移学习有个前提——源域和目标域要有一定的相似性。这个问题我们会在“领域自适应”那章重点讨论。
1.6 本章要点一览
好,咱们把第1章的核心内容梳理一下:
| 知识点 | 要点 |
|---|---|
| 预训练模型定义 | 在大规模数据上学习通用特征,再迁移到小样本任务 |
| ADMET任务 | 吸收、分布、代谢、排泄、毒性——药物成败的关键 |
| 迁移策略 | 特征提取、微调、多任务学习、领域自适应 |
| 核心优势 | 缓解数据稀缺,提升泛化能力,降低训练成本 |
| 常见陷阱 | 源域和目标域不匹配、微调学习率过高、输出层设计不合理 |