本节摘要:数据不够时,可以在原始样本上制造"受控的变化"来扩充训练集。本节讲解图像与文本两类主流的增强手法、为什么要"与任务语义匹配",以及增强过头/方向错误可能引入的偏差。
阅读完本节,你应当能够:
我们手里常有一份偏小的数据集,泛化差。第一条反应是去多采样本,但现实中采集、清洗、标注都贵。数据增强打开另一扇门:用不改变语义的受控变换,把现有样本"复制成多个变体",让模型看到更多样貌,变得对真实世界的变化更免疫。
需要先建立一个心态:数据增强不是"造假"。它是在利用你已有的先验——"旋转了几度的猫还是猫""换个说法的同一句话还是同一个意思"。只要这些不变量在真实预测场景里也成立,把变换后的样本喂给模型,就等于在告诉它"别被这些无关的表层变化带偏"。
图像增强的哲学:现实里同一个物体在不同光照、角度、遮挡下都是同一张脸——我们希望模型学会这一点。于是有这些宝贵中的操作:旋转、翻转、裁剪、缩放、改变亮度/对比/颜色抖动。
# 示意:常见图像增强组合(概念性) from torchvision import transforms train_tfm = transforms.Compose([ transforms.RandomRotation(10), # 小角度旋转,别转成倒着的 transforms.RandomHorizontalFlip(), # 水平翻转 transforms.RandomResizedCrop(224, scale=(0.8, 1.0)), transforms.ColorJitter(brightness=0.2, contrast=0.2), ])
关键在"匹配语义"。手写数字识别可以旋转、缩放;但胸片/x 光里"水平翻转"会改变左右肺的解剖语义,可能错误地制造反例。OCR 里的角度翻转、人脸识别里的垂直翻转,几乎都是错误增强。所以增强绝不是"越多越好",而是**"哪些变换在真实预测场景里会发生且不换标签"**。
顺带说一种进阶用法叫测试时增强(TTA):不仅训练时加,预测时把同一张图做几种变换分别推理再平均结果。它和训练增强逻辑一致,都是在利用"旋转过的猫还是猫"这个不变量来稳信号,类似一个小型集成。但和训练一样,TTA 也要遵守匹配语义——你测试时用的变换,一定得是真实场景里可能出现的,否则就是在自欺。
文本增强同样以"不换语义"为底线。常用手段:同义词替换(把"高兴"换成"开心")、随机插入/删除/交换若干词、回译(先译成另一语种再译回来,说明是原对象的变体)。这些能提高模型的鲁棒性,但对语义敏感的语料要小心——同义词替换如果踩到术语/歧义,反而引入噪声。
| 模态 | 常用增强 | 主要目的 | 语义红线 |
|---|---|---|---|
| 图像 | 旋转/翻转/裁剪/颜色抖动 | 对视角光照鲁棒 | 翻转改变解剖语义 |
| 文本 | 同义替换/回译/增删 | 对句式措辞鲁棒 | 术语/反义误替换 |
| 时间序列 | 加噪声/裁剪/时移 | 对扰动鲁棒 | 破坏因果关系 |
设计一套增强,也可以按实验舱的节奏走:先做一张"候选变换表",逐个在真实预测场景里过一遍"它会不会发生、会不会换标签",再分批往训练里加。不要一上来就把所有变换堆在一个数据管线里——那样你根本说不清是哪一条帮了忙、哪一条拖了后腿。正确的做法是单因子式地验证:先只加旋转,看验证变化;再加翻转,再看;每一步留下对比,你才清楚每条增强的真实贡献。这和第六章"每次只动一个旋钮"是同一套纪律,只不过把"旋钮"换成了"变换"。顺着这个套路,你还能顺手给每条增强标上"成本与收益",下次遇到相似任务直接照抄现成的增强配方,而不是每次重新拍脑袋。
时间序列类数据有特别的注意点:因果与时序边界不能被破坏。比如用"整段平移/裁剪/加噪声"做增强通常是安全的,但若你把一个含因果依赖的序列随机重排、或把不同时间段的片段错位拼接,就会造出真实世界里不可能出现的样本。所以时间序列的语义红线往往是"因果关系与时序先后",比图像的"翻转不改标签"更隐晦,也更值得在动手前先写下来。
过度增强(比如把图像转得过头、把文本改得面目全非)会让训练分布和真实分布越拉越远,反而伤及泛化。另一个隐蔽问题:若增强实现里无心地污染了验证/测试(例如你给整份数据统一做了翻转没分开),验证分数就虚高——这和第二章的泄漏纪律是一件事。
一个真实的翻车案例很能说明"匹配语义"的分量:某团队在手写数字识别里顺手加了垂直翻转,模型训练集分数一路逼近满分、看起来很不错。可真实场景里根本不会有"倒着写的数字",这个增强不仅没带来泛化收益,反而因为给模型喂了一堆现实中不存在的"倒立样本",干扰了它对正立数字的判断。教训就是:先想清楚"预测时这个变化会不会发生、会不会换标签",再决定要不要加。强度也一样,先加温和的一档(比如小角旋转 10° 而不是 45°),看验证集反应再逐步加大,而不是一上来就重手。
⚠️ 常见坑:把增强当作"调参失败时的万能药"。若模型是欠拟合(训练损失都下不去),增强不会救它;它主要缓解的是"数据多样性不足导致的过拟合/脆弱"。先看训练曲线,再决定。
💡 关键直觉:增强的价值可以用一个小实验验证——对比"不加增强"与"加Mild增强"在同一验证上的差距。若差距明显,说明模型确实依赖了不该依赖的像素/措辞细节;若几乎无差,则增强对当前问题帮助有限,别空烧算力。
五章的四件泛化武器摆齐了。接下来进入全书的重头戏——超参数到底怎么调。