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

你看,我故意加了个递归重试机制——如果后处理检查不通过(比如两个原子挨得太近),就再抽一次随机数重新增强。这样做虽然慢一点,但能保证输出样本都是化学上合理的。

实用小技巧: 在训练过程中,我通常把增强概率设置在0.3~0.5之间,即每个batch里30%~50%的样本被增强过。这样模型既能学习到变换不变性,又不至于被过度扰动搞糊涂。

4.4 本章知识体系总览

下面这张SVG图把数据增强在分子建模里的整体脉络画出来了,你可以存着当思维导图。

数据增强总体框架 · 分子建模版 数据增强 几何变换 扰动/噪声 混合/插值 亲和力预测 分子性质预测 结合位点检测 通用策略:合法性校验 → 选择操作 → 后处理 → 化学检查 ⚡ 关键原则:增强后样本必须保持化学合理性, 且不改变训练标签(亲和力、性质等)。

核心要点总结:

  • 数据增强不是乱造数据,而是用已知物理先验扩大训练分布。
  • 几何变换(旋转、平移)是最安全的增强方式,因为它保持结合自由能不变。
  • 混合/插值类方法在图神经网络中效果好,但必须做化学合理性检查。
  • 通用策略四步曲:校验→操作→后处理→化学检查,缺一不可。