mixup — 把两张图按比例叠成一张,标签也一起叠
是什么
mixup 是一种数据增强方法:把两个训练样本(图片 + 标签)按比例 λ 线性叠加,得到一个虚拟新样本,再喂给模型训练。
日常类比:调鸡尾酒。你有橙汁(猫图)和苹果汁(狗图),按 7:3 倒进同一个杯子,得到一杯混合饮料;标签也按 7:3 写成「0.7 猫 + 0.3 狗」。模型看到的不是非黑即白的「这是猫」「这是狗」,而是连续的过渡带。
公式只有两行:
x_tilde = λ · x_i + (1 - λ) · x_jy_tilde = λ · y_i + (1 - λ) · y_jx_i, x_j 是从 batch 里随机抽两个样本,y_i, y_j 是它们的 one-hot 标签,λ 从 Beta(α, α) 采样。代码实现真的就是几行 PyTorch。
为什么重要
不用 mixup 也能训出 CV 模型,但你会撞到几个老问题:
- 模型记忆训练数据——训练 acc 很高,测试 acc 卡住,过拟合
- 对对抗样本脆弱——加一点点噪声就分类错
- 训练标签有错时,模型会忠实地把错标签也学进去
- GAN 训练不稳定——判别器太强,生成器学不到东西
mixup 用一行代码同时缓解了以上四个问题,而且不增加算力开销(采样 λ 和加法几乎免费)。这就是它从 2018 年至今一直是 CV 训练标配的原因——ImageNet / CIFAR / 各种 backbone 论文里几乎都开它。
核心要点
mixup 的设计可以拆成 三个决定:
-
凸组合而非拼接:选
λx + (1-λ)y而不是「左半边贴右半边」(那叫 CutMix,2019 年的后续工作)。凸组合保证新样本仍在原始数据的凸包内——数学上干净、可分析。 -
标签也要混:
y_tilde = λy_i + (1-λ)y_j是关键。如果只混 x 不混 y,等于硬训「这张半猫半狗的图是猫」,模型会被强制记忆噪声。把标签也变成软标签,损失函数自动变成两个交叉熵的加权和。 -
λ 服从 Beta(α, α):Beta 是对称分布,
α越小越偏 0/1(弱混合,接近原 ERM),α越大越靠 0.5(强混合)。论文推荐α ∈ [0.1, 0.4],意味着大多数时候 λ 接近 0 或 1,只有少数样本是真正深度混合。这是个被低估的细节——它让 mixup 不会完全偏离原数据分布。
理论上 mixup 是 Vicinal Risk Minimization (VRM) 的实例:不是只在训练点上算损失,而是在训练点的「邻域」上算。mixup 把邻域定义成「与其他训练点的线性插值」。
实践案例
案例 1:一行代码版的 PyTorch 实现
def mixup_batch(x, y, alpha=0.2): lam = np.random.beta(alpha, alpha) idx = torch.randperm(x.size(0)) # batch 内随机配对 x_mix = lam * x + (1 - lam) * x[idx] y_a, y_b = y, y[idx] return x_mix, y_a, y_b, lam
# 训练循环x_mix, y_a, y_b, lam = mixup_batch(x, y, alpha=0.2)pred = model(x_mix)loss = lam * criterion(pred, y_a) + (1 - lam) * criterion(pred, y_b)注意第 4 行——不需要真的构造 one-hot,直接对两个 CE loss 加权求和数学上等价。这就是「实现到位的 mixup 真的只多 3 行」。
案例 2:α 怎么选
α = 0:退化为标准训练(ERM),没增强α = 0.2:ImageNet 上常用,λ 大多落在 [0, 0.2] 或 [0.8, 1.0],弱混合α = 1.0:λ 服从均匀分布 U[0,1],强混合,CIFAR 上有时更好α = 100:λ ≈ 0.5,几乎所有样本都对半混,容易欠拟合
经验法则:数据集越大、模型越深,α 越小。ImageNet + ResNet-50 用 0.2,CIFAR-10 + 浅网络可以试 1.0。
案例 3:为什么标签噪声变得不致命
假设训练集里一张猫被错标成狗。在 ERM 下,模型必须把这张图的特征映到「狗」,污染特征空间。
在 mixup 下,这张错标猫每次都被和别的样本混合,模型看到的目标是 0.7 狗 + 0.3 真猫 之类。错误标签被「稀释」了——模型不再被强迫精确拟合错误信号。
案例 4:和 label smoothing 的关系
label smoothing 把 one-hot 标签 [0, 0, 1, 0] 改成 [0.025, 0.025, 0.925, 0.025],让模型不要过分自信。mixup 的标签也是软标签,但软的方向不一样——它不是均匀往周围抹一点,而是精确地指向另一个真实样本的方向。这让 mixup 比 label smoothing 信息量更大,二者通常叠加使用更好。
踩过的坑
-
只混 x 不混 y:直觉上「软目标太奇怪」会让人偷懒不混 y,结果模型表现反而差。y 必须一起混,这是 mixup 的灵魂。原论文消融实验明确验证了这一点。
-
α 设太大:把 α 设到 1.0 以上跑 ImageNet 经常负优化。先从 0.2 起步,再做小搜索。直觉上 α 越大模型见到的「极端混合」越多,但这些样本离真实分布太远,反而误导。
-
batch size 太小时不稳定:mixup 在 batch 内配对,batch 小(比如 16)时多样性不够,方差大。建议 batch ≥ 64 再开。也可以从两个 batch 里采样配对,绕开这个限制。
-
和 BatchNorm 的微妙互动:混合样本的统计量和原样本不同,会扰动 BN 的 running mean/var。一般训练够长会自然平衡,但短训不充分时可能拖慢收敛。换 GroupNorm / LayerNorm 通常更干净。
-
不适合所有任务:检测 / 分割任务里直接对像素混合可能破坏空间结构,需要用 CutMix 之类的变体;NLP 里词嵌入空间不一定是凸的,需要 Manifold Mixup。
-
early epoch loss 看起来很高:因为目标是软的,CE loss 不会降到接近 0,看起来比 ERM 训练「学得慢」,但测试 acc 通常更好。别被训练 loss 吓到。
适用 vs 不适用场景
适用:
- 图像分类(ImageNet / CIFAR / 各种 backbone)
- 标签可能有噪声的真实数据集
- 需要对抗鲁棒性的部署场景
- GAN 训练(论文也展示了这一点)
- 校准(calibration)要求高的场景——mixup 训出的模型置信度更接近真实正确率
不适用:
- 目标检测 / 语义分割(用 CutMix / Mosaic 替代)
- 序列任务(NLP 用 Manifold Mixup 在隐层混合)
- 数据集极小(< 1000 样本)——增强作用不如直接做几何变换
- 标签是结构化输出(分割图 / bounding box)——线性插值无意义
历史小故事
- 2017 年 10 月:Zhang 等人在 arXiv 挂出 1710.09412,第一作者 Hongyi Zhang 当时是 MIT 博士生,合作方是 Facebook AI Research
- 2018 年:ICLR 接收,立刻刷爆 CV 榜单——ImageNet ResNet-50 提升 1.5 个点不是免费午餐而是免费晚宴
- 2018-2019 年:一批扩展涌现——Manifold Mixup(隐层混合)、CutMix(剪贴混合)、PuzzleMix(混最有信息量的区域)、AugMix(多重增强混合)
- 2020 年至今:mixup 类增强成为 CV 训练默认开关,几乎所有新模型都默认启用;timm 库把它做成一行配置
mixup 之所以能立刻流行,三个原因:实现简单到一行、算力开销基本免费、效果跨任务稳定。这是论文圈罕见的「黄金三角」组合。很多顶会论文里有更复杂的方法,但记住的人很少;mixup 这种,研究者读完就能立刻在自己代码里加 5 行用上,传播效率指数级。
学到什么
- 数据增强的本质是约束模型行为——mixup 不只增加样本,它在告诉模型「样本之间应该平滑过渡」。这是从「增加数据量」到「塑造决策边界形状」的视角转换
- 简单 + 数学清晰 + 普适 = 长寿论文。复杂方法可以发顶会,但会被遗忘;mixup 这种 8 年后还在用
- 正则不一定要加在权重上——加在数据上、加在标签上、加在中间层(dropout)都行,框架统一在 VRM
- 超参敏感性是实用性的隐藏门槛——mixup 只有一个 α,且不太敏感(0.2/1.0 都能工作),这是它能流行的工程原因
- 理论与实践的对偶——mixup 既能从「数据增强」角度看(VRM),也能从「正则」角度看(约束模型在样本间线性),还能从「鲁棒性」角度看(对抗样本天然落在两点连线附近)。一个方法多角度自洽,是好方法的特征
延伸阅读
- 论文 PDF:arxiv.org/abs/1710.09412(10 页,公式很少)
- 官方代码(facebookresearch/mixup-cifar10):实现真的就是几十行
- 后续:CutMix 2019 / Manifold Mixup 2018 / AugMix 2020
- 综述:[A Survey of Mixing-based Data Augmentation, 2022]——把 mixup 家族梳理一遍
关联
- adam-2014 —— 同期最常配 mixup 用的优化器
- adamw-2017 —— mixup 训练正则强度变化时,AdamW 比 Adam 更稳
- align-2021 —— 多模态对比学习里也用类似思想做数据扩展
- batchnorm-2015 —— mixup 与 BN 的统计扰动互动是工程上的实操痛点
反向链接
- adam-2014 —— Adam — 让深度学习自己挑步长的优化器
- adamw-2017 —— AdamW — 把 weight decay 从梯度里拆出来
- align-2021 —— ALIGN — 用 18 亿条脏图文对训练,证明数据规模能压住噪声
- batchnorm-2015 —— Batch Normalization — 把每层激活值规整到 0 均值 1 方差,深网训练时间砍成 1/14