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) 的思路——先用海量无标签分子学一个通用的“分子语言模型”,再在少量有标签的数据上微调。

我举个例子,就像你教一个孩子认动物。你没时间每天带他看遍全世界所有动物,但可以先给他看一大堆动物的照片(无监督),让他自己学会区分“毛茸茸的”、“四条腿的”、“会飞的”这些概念。然后再告诉他“这个叫猫,这个叫狗”(有监督微调)。

在分子领域,这种思路特别有效。我们把分子表示学习分为两阶段:

  1. 预训练阶段 (Pretraining): 在海量无标签分子数据上进行任务设计(比如掩码原子预测、键角预测、对比学习),让模型学到通用的化学知识。
  2. 微调阶段 (Fine-tuning): 在特定 ADMET 任务的小样本数据上更新模型参数。

我曾经踩过的坑:一开始做自监督预训练时,用的Mask策略不对,导致模型只学会了噪声模式而不是化学规则。后来我改用上下文预测 (Context Prediction) 的方式,效果才上来。这个细节我们在后面的Transformer章节会深入讲。

1.4 为什么选 Transformer?

可能有人会问:“图神经网络 (GNN) 不是天然适配分子图吗?为什么还要上 Transformer?”

答案是长程依赖和可扩展性。GNN 通过消息传递机制做信息聚合,层数堆多了容易过平滑(所有节点特征都变得差不多)。但药物分子往往有非局域相互作用——比如一个远端取代基通过空间效应影响另一个原子上的毒性。Transformer 的自注意力机制,天然就能捕捉这种全局依赖,而且在大数据量下效果更优。

这张图展示了本章讨论的核心关系:

ADMET 分子表示学习知识体系 ADMET 任务 传统分子表示 深度分子表示学习 数据不足 表达力受限 Transformer 自注意力机制 自监督预训练 + 微调 分子图 & SMILES 序列编码 💡 核心矛盾:有限标签 vs 无限分子 解决方案: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、分子表示、自监督学习。后面的所有技术点,都是围绕这三个词展开的。