课程导论:蛋白-配体相互作用预测背景、过拟合问题概述、数据增强作用
一、为什么我们非要预测蛋白-配体相互作用?
做药物发现的人都知道,找到一把合适的“钥匙”去开一个疾病相关的“锁”到底有多难。这个“锁”就是蛋白质靶点,而“钥匙”就是候选药物分子,也就是配体。蛋白-配体相互作用预测,说白了就是通过计算的方法去判断这个分子能不能结合到靶点上,结合得有多紧。
我刚开始入行那会儿,主要还是靠分子对接和分子动力学模拟。但这两类方法有个通病——计算量太大。一个中等规模的虚拟筛选,几百个分子跑一遍,服务器风扇转得跟直升机似的。后来深度学习杀进了这个领域,尤其是一些基于图神经网络和Transformer的方法,推理速度快了不止一个数量级。但问题也随之而来:模型越来越深,参数量越来越大,训练数据就那么几万条公共库,你不做点特殊处理,过拟合几乎是必然的。
目前主流的预测方法可以分为三类:
| 方法类别 | 核心思路 | 典型代表 | 我的项目里踩过的坑 |
|---|---|---|---|
| 基于结构的方法 | 利用靶点的三维结构信息进行对接打分或能量计算 | AutoDock Vina, Glide | 蛋白质柔性处理不好,对接结果很不稳定 |
| 基于配体的方法 | 只依赖已知活性分子的化学结构,构建定量构效关系 | 随机森林, SVM | 活性悬崖问题严重,稍微改个基团活性就翻车 |
| 基于深度学习的方法 | 端到端学习蛋白质和配体的特征表征 | DeepDTA, GraphDTA, MolTrans | 不刻意加正则化,测试集指标能跑出99%,换批数据直接拉胯 |
二、过拟合——深度学习做虚拟筛选的“阿喀琉斯之踵”
你想想看,一个几千万参数的模型,训练集只有几万个样本。这种“小数据、大模型”的组合,过拟合几乎是刻在骨子里的宿命。我记得有一次训练一个激酶靶点的模型,验证集明明已经收敛到AUC 0.92,换了几个新化合物一测,直接掉到0.65。嗯,那种感觉就像你精心准备了一周的考试,结果拿到卷子发现全是没见过的题。
过拟合在蛋白-配体预测领域有几种典型的表现形式:
- 记忆化过拟合:模型记住了训练集中每个样本的“答案”,而不是学到了真正起作用的分子特征。具体表现是训练集损失趋近于零,但验证集损失反弹。
- 结构偏好过拟合:训练集中的分子骨架分布不均衡,模型对特定骨架过度敏感。比如你用大量含苯环的分子训练,模型见到脂肪族分子就容易判错。
- 分布外泛化失败:训练集和测试集来自不同化学空间,或者靶点的序列差异较大。这是最头疼的一种,因为真实场景下你测的化合物往往不在训练集的分布范围内。
为什么会这样?我个人的理解是,蛋白质和配体的相互作用空间本身是高度非线性和稀疏的。一个氨基酸残基的改变,或者配体上某个取代基的位置方差,都可能引起结合亲和力的剧烈变化。而我们的训练数据根本覆盖不了这么大的化学空间。模型不得不在稀疏的数据点上做高维插值,结果就是——在训练数据点附近,模型表现极好;一旦离开这些点,预测值就变得毫无意义。
关键指标对比: 我习惯用以下几个指标来早期预警过拟合。如果训练集和测试集之间的差距超过一定阈值,就要立即启动数据增强或者更强的正则化策略。
| 指标 | 正常范围 | 过拟合预警阈值 |
|---|---|---|
| 训练集 vs 验证集 AUC 差距 | < 0.05 | > 0.10 |
| 训练集损失 vs 验证集损失差距 | < 0.2 | > 0.5 |
| 训练集 top-1 还原率 | < 80% | > 95% |
三、数据增强:给模型的“伙食”加点料
说白了,数据增强就是在不改变样本真实标签的前提下,对输入数据进行各种合法的变换,从而合成出更多、更多样的训练样本。这在CV和NLP领域早就玩得很熟了——图像可以旋转、裁剪、加噪声;文本可以做同义词替换、回译。但在药物发现领域,数据增强做起来要小心翼翼,因为分子的“身份”完全是由它的化学结构决定的,你不能随便改一个原子就指望结合活性不变。
我去年在做一个激酶抑制剂活性预测项目,训练集只有4200条数据。模型是标准的图神经网络+注意力机制,跑了不到20个epoch就开始明显过拟合。后来我试了三种数据增强策略:
- 高斯噪声注入:在原子特征和键特征上添加服从 N(0, 0.01) 的噪声。这个最简单,但效果也最有限,只能提供微小的扰动。
- 图边扰动:随机断开再闭合一些化学键,但保证分子整体结构合理。这个方法风险较高,需要配合化学规则检查。
- 分子子图掩码:随机遮蔽配体分子上的局部子结构,迫使模型根据保留的部分去预测互作。这个方法是我觉得最有效的。
我的经验: 对于蛋白-配体相互作用预测来说,我最推荐的是分子子图掩码和SMILES随机枚举的组合。SMILES枚举虽然只是改变了分子的线性表示方式,但能让图神经网络学到更鲁棒的拓扑表征。我曾经把SMILES枚举数量从1增加到10,验证集AUC直接提升了0.06个百分点。别小看这0.06,在药物筛选的早期阶段,这相当于少筛掉15%的潜在活性分子。
需要注意: 数据增强不是万能的。如果你训练集本身的噪声就很大——比如实验测定的IC50值在不同实验室间能差两个数量级——那么强行做增强只会把噪声传播得更广。我建议先做一轮数据清洗和标准化,再考虑增强策略。增强前后最好留一部分数据做人工校验,确保生成的分子结构在化学上是合理的。
下面这张图是我自己总结的数据增强缓解过拟合的核心逻辑框架。我习惯在每次建模前都按照这个流程走一遍:
从上面的框架可以看出,数据增强的本质是在不改变标签的前提下,将原始样本变换到合理的邻域空间。这样,模型在训练时就能看到更多样的“模样”,不至于死记硬背住某个特定的分子姿势。我个人的经验是,一个好的数据增强策略可以让欠采样的小数据集”膨胀“3到5倍,而且提升主要集中在分布外样本上的泛化能力。
不过,这里有个细节——数据增强带来的样本不能无限制地叠加。我曾经试过把每个样本增强到50倍,结果模型反而又开始退化。为什么?因为大量的增强样本都集中在原始样本附近的局部空间,反而让模型对这个局部空间产生了新的过拟合。你看,过拟合这事就像治水,光堵不行,得疏导——增强过头了,就变成了另一种形式的过拟合。