1. ADMET概述与分子表示学习基础
各位同学好,我是这门课的主讲。咱们今天先聊点基础的,但基础不意味着简单。ADMET 和分子表示学习,说白了就是整个课程的“地基”。地基没打好,上面盖的Transformer再漂亮也得塌。
一句话总结本章:ADMET 是药物能不能从“分子”变成“药”的关键筛选器;分子表示学习,则是让机器“看懂”分子的手段。
1.1 ADMET 在药物研发中的重要性
ADMET 这五个字母,分别代表:吸收 (Absorption)、分布 (Distribution)、代谢 (Metabolism)、排泄 (Excretion)、毒性 (Toxicity)。听着挺学术,对吧?我换个说法你就懂了——一个分子要想当药,不光得能治病(药效),还得能安全地进入人体、到达病灶、待一会儿、然后被排出去,别赖着不走,更不能把身体弄坏。
传统药物研发里,大家经常先盯着“这分子能不能跟靶点结合”使劲。结果呢?我记得有个项目,团队花了一年找出超强活性的分子,结果一测ADMET,发现它根本过不了肠道屏障。一年白干。这样的情况,我见过不止一次。
| ADMET 属性 | 你关心什么? | 典型的“坑” |
|---|---|---|
| 吸收 (A) | 口服后能进血液吗? | 水溶性太差,吃进去拉出来 |
| 分布 (D) | 能到大脑/肿瘤吗? | 被血浆蛋白死死绑住 |
| 代谢 (M) | 肝会不会把它干掉? | 半衰期太短,一天得吃八回 |
| 排泄 (E) | 怎么排出去? | 在肾脏里结晶,肾损伤 |
| 毒性 (T) | 会损伤心脏/肝脏吗? | hERG通道抑制,QT间期延长 |
你想想看,如果一个化合物在临床 I 期因为毒性被毙,意味着前面五到十年的投入全打水漂。所以现在大家都把ADMET评估往前推,在分子设计阶段就用计算方法给它做“体检”。
我个人习惯:项目早期先跑一遍 ADMET 预测,筛掉那些“一看就不行”的分子。这能帮团队节省至少 30% 的湿实验成本。
1.2 分子表示学习的基本概念
咱们刚才说了要算ADMET,那问题来了:计算机怎么“理解”一个分子?你不能直接把分子结构图甩给AI吧?这就引出了分子表示学习——把分子转成计算机能吃的形式。
传统的做法是手工特征工程。比如计算分子量、logP、氢键供体受体数目、极性表面积……这些统称为 分子描述符 (Molecular Descriptors)。我刚开始做 CADD 那会儿,天天跟这些数字打交道,几百个分子手动算一遍,累得够呛。
还有一种是用分子指纹 (Fingerprint), 比如 MACCS 或 ECFP。它把分子的结构信息编码成一个固定长度的 0/1 向量。 举个例子:
# 一个简化版的分子指纹示意
[1,0,1,1,0,0,1,0,1,1,...] # 长度1024或2048,每个bit代表某种子结构是否存在
这两种方法的问题在哪?说白了,表达力有限。手工特征是你认为什么重要,机器就只能看到什么;分子指纹又会丢失很多三维空间信息和电子效应。你想想看,光靠一两个描述符去预测复杂的ADMET行为,是不是有点像“盲人摸象”?
而分子表示学习 (Molecular Representation Learning) 要做的事,就是让模型自己从数据里学习出真正有用的分子特征。不再由人硬性规定,而是让深度网络自己“悟”出来。学习的目标是生成一个高维向量 (也叫 Embedding),这个向量能很好地捕捉分子的物理化学性质、结构模式,甚至生物活性。
核心思想:从一个分子出发,学到一个稠密、低维、有意义的向量表示。 这个表示可以直接喂给下游的 MLP 或者 Transformer 做 ADMET 预测。
1.3 分子图与自监督学习的入场
讲到分子表示学习,就绕不开分子图 (Molecular Graph)。分子天然就是个图:原子是节点,化学键是边。这简直是给图神经网络 (GNN) 量身定做的输入。
但是光有 GNN 还不够。为什么呢?因为高质量的带标签 ADMET 数据太少了。
一个分子是否具有肝毒性,需要花大量动物实验才能确认。你能拿到几千个有标签的分子就算运气不错了。但无标签的分子数据,PubChem、ChEMBL 上有几亿个。这就催生了自监督学习 (Self-Supervised Learning) 的思路——先用海量无标签分子学一个通用的“分子语言模型”,再在少量有标签的数据上微调。
我举个例子,就像你教一个孩子认动物。你没时间每天带他看遍全世界所有动物,但可以先给他看一大堆动物的照片(无监督),让他自己学会区分“毛茸茸的”、“四条腿的”、“会飞的”这些概念。然后再告诉他“这个叫猫,这个叫狗”(有监督微调)。
在分子领域,这种思路特别有效。我们把分子表示学习分为两阶段:
- 预训练阶段 (Pretraining): 在海量无标签分子数据上进行任务设计(比如掩码原子预测、键角预测、对比学习),让模型学到通用的化学知识。
- 微调阶段 (Fine-tuning): 在特定 ADMET 任务的小样本数据上更新模型参数。
我曾经踩过的坑:一开始做自监督预训练时,用的Mask策略不对,导致模型只学会了噪声模式而不是化学规则。后来我改用上下文预测 (Context Prediction) 的方式,效果才上来。这个细节我们在后面的Transformer章节会深入讲。
1.4 为什么选 Transformer?
可能有人会问:“图神经网络 (GNN) 不是天然适配分子图吗?为什么还要上 Transformer?”
答案是长程依赖和可扩展性。GNN 通过消息传递机制做信息聚合,层数堆多了容易过平滑(所有节点特征都变得差不多)。但药物分子往往有非局域相互作用——比如一个远端取代基通过空间效应影响另一个原子上的毒性。Transformer 的自注意力机制,天然就能捕捉这种全局依赖,而且在大数据量下效果更优。
这张图展示了本章讨论的核心关系:
注意看上图的逻辑线:ADMET 任务需要更好的分子表示;传统手工方法表达力受限;因此我们转向深度表示学习;而 Transformer 的自注意力机制能捕获全局依赖,加上自监督预训练解决标签稀缺问题,最终实现对分子的高质量编码。
1.5 一点实操前的忠告
这部分内容偏概念,但我还是建议你动手走一遍流程。哪怕只是从 ChEMBL 下载几个分子,用 RDKit 生成一下 ECFP 指纹,然后喂给一个最简单的 MLP 试试 ADMET 预测。你会发现数据清洗和类平衡比模型结构更重要。
# 你可以在 Jupyter 里试这行——用 RDKit 生成分子指纹
from rdkit import Chem
from rdkit.Chem import AllChem
mol = Chem.MolFromSmiles("COc1cc(C2C3C(=O)C4=C(O)C(=O)C5=C4C2(OC(=O)C5(C)C)C3(C)C)ccc1O")
fp = AllChem.GetMorganFingerprintAsBitVect(mol, radius=2, nBits=1024)
print(fp.ToBitString()[:50]) # 打印前50位看看
嗯,这里要注意一点——分子指纹不包含逆合成路径信息,也不包含3D构象。Transformer 的输入编码就是为了弥补这些缺陷。我们下一章会具体讲 Transformer 的输入层如何设计,但今天先把基础夯实。
好了,这就是第一章的全部内容。重点记住三个词:ADMET、分子表示、自监督学习。后面的所有技术点,都是围绕这三个词展开的。