4. 数据增强概论:定义与分类、在分子建模中的应用概况、增强的通用策略
各位同学好,我是老周。这一章咱们聊聊数据增强——说白了,就是在数据不够、模型容易过拟合的时候,怎么用已有数据“变”出更多样本来。我在做蛋白-配体打分函数项目时,经常碰到训练集只有几百个复合物,加几轮增强后模型泛化能力能提升十几个百分点。嗯,这章咱们就把数据增强的底牌翻一遍。
4.1 数据增强的定义与分类
数据增强,英文叫 Data Augmentation,指的是在不收集新实验数据的前提下,通过对原始数据进行有意义的变换、组合或加噪,生成新训练样本的技术。它的核心目标有两个:一是扩大样本量,二是引入先验知识(比如平移不变性、旋转对称性)。
我习惯把分子领域的增强方法分成三大类,见下表:
| 分类 | 操作对象 | 典型方法 | 保持什么不变 |
|---|---|---|---|
| 几何变换 | 三维坐标 | 随机旋转、平动、振动 | 整体构象(刚体) |
| 扰动/噪声 | 坐标、原子类型、键级 | 坐标加高斯噪声、掩码原子、交换原子种类 | 序列/拓扑大致正确 |
| 混合/插值 | 特征图、图表示 | Mixup(图与图之间插值)、Cutout(随机擦除子图) | 数据的概率分布 |
我个人觉得,几何变换是分子领域最“安全”的增强手段,因为物理规律保证平移旋转不会改变结合自由能。但扰动和混合就得小心——加噪太多可能产生不存在的化学结构,模型学到的反而是假关联。
4.2 在分子建模中的应用概况
数据增强在图像、语音领域已经烂大街了,但在分子建模里还算是“半年轻”技术。为什么?因为你想想看,分子的物理化学约束比图像像素严格得多——像素可以随便翻转,但苯环的六个碳你不能随便换成一个氧,否则分子就变味了。
不过近三年,随着图神经网络(GNN)和几何深度学习火起来,数据增强在以下几个场景里特别有用:
- 蛋白-配体亲和力预测: 训练集通常只有几百到几千个复合物,直接训练容易过拟合到晶体数据里的非通用模式。加随机旋转+平移能学到旋转不变性。
- 分子性质预测(溶解度、毒性): 往往只有几百个标签,用SMILES随机线性变换(SMILES enumeration)可以生成多种不同序列表示同一分子。
- 结合位点检测: 口袋点云数据量少,采用随机致密化(在原始点间插值)能提高检测鲁棒性。
- 生成模型(扩散模型、VAE): 训练时加入噪声增强有助于学习更平滑的流形。
我记得2021年有个工作,在EquiDock上用随机鬼动量(random ghost momentum)做增强,把预测成功率从53%提到68%。虽然鬼动量不是严格意义上的数据增强,但思路相通:让模型见识更多“合理但不常见”的构象。
4.3 增强的通用策略
不管用什么方法,有一条铁律:增强后的样本必须仍然属于同一个任务分布。比如你做亲和力预测,不能增强出一个电子布局完全错误的分子,然后让模型去学习它的结合能——这就像拿一张PS过的照片去训练人脸识别,人眼都认不出,模型怎么能学对?
我总结了一套四步走的通用策略,直接用 Python 伪代码展示吧:
def augment_complex(complex_data, aug_method='rotation', aug_params=None):
# 第一步:合法性校验
if not validate_structure(complex_data):
raise ValueError('原始结构不合法,不能增强')
# 第二步:选择增强操作
if aug_method == 'rotation':
angle = random.uniform(-aug_params['max_angle'], aug_params['max_angle'])
new_coords = rotate_rigid_body(complex_data.coords, angle)
elif aug_method == 'noise':
std = aug_params.get('coord_noise_std', 0.1) # 单位Å
noise = np.random.normal(0, std, size=complex_data.coords.shape)
new_coords = complex_data.coords + noise
elif aug_method == 'mixup':
lambda_ = np.random.beta(a=2.0, b=2.0)
new_coords = lambda_ * complex_data.coords + (1-lambda_) * other.coords
else:
raise NotImplementedError
# 第三步:后处理(去除原子重叠、重新成键)
new_complex = rebuild_bonds(new_coords, complex_data.topology)
if not chemical_sanity_check(new_complex):
return augment_complex(complex_data, aug_method, aug_params) # 重新生成
return new_complex
你看,我故意加了个递归重试机制——如果后处理检查不通过(比如两个原子挨得太近),就再抽一次随机数重新增强。这样做虽然慢一点,但能保证输出样本都是化学上合理的。
4.4 本章知识体系总览
下面这张SVG图把数据增强在分子建模里的整体脉络画出来了,你可以存着当思维导图。
核心要点总结:
- 数据增强不是乱造数据,而是用已知物理先验扩大训练分布。
- 几何变换(旋转、平移)是最安全的增强方式,因为它保持结合自由能不变。
- 混合/插值类方法在图神经网络中效果好,但必须做化学合理性检查。
- 通用策略四步曲:校验→操作→后处理→化学检查,缺一不可。