Skip to content

过拟合与正则化

本页速览 深度学习模型的宿敌不是"能力不足"而是"背得太多"。本文用偏差-方差分解讲清过拟合机制,系统梳理 L1/L2、Dropout、早停、数据增强、标签平滑、EMA、Mixup 等正则化武器,并给出组合与强度选择的工程经验。

过拟合与正则化

一句话定义:过拟合是模型"背下了训练集"而非"学到了规律",正则化是抑制这种行为、提升泛化能力的一切手段的总称。它的反面教材如何被观测与度量,见深度学习评估与实验中的学习曲线;本文聚焦"诊断之后怎么治"。

一、过拟合机制与偏差-方差分解

为什么模型会过拟合?用统计学习的框架看,泛化误差可以分解为三部分:

泛化误差 = 偏差²(bias)+ 方差(variance)+ 不可约噪声
  • 偏差:模型假设与真实函数之间的系统性差距——模型太简单(欠拟合)。
  • 方差:模型对训练集"换一批"有多敏感——模型太复杂,记住噪声(过拟合)。
  • 噪声:数据本身固有的、谁也无法学到的随机性。

过拟合 = 方差过大:训练集换一换,学到的函数就大变样。机器学习的目标不是让训练误差最小,而是让偏差与方差之和最小——这正是深度学习评估与实验里训练/验证曲线分叉的统计本质。

深度网络有个反直觉现象:参数量远多于样本量的模型仍能泛化良好(如 GPT 系列)。对这个谜("double descent"、隐式正则等)的研究仍在进行,但工程上我们依赖一套明确的工具——下面逐个展开。

二、L1/L2 正则与权重衰减

在损失函数上加一个参数大小的惩罚项:

L_total = L_data + λ·R(θ)
  • L2 正则R = Σ θᵢ²。把权重推向 0 但不彻底——大权重被压制,解的"光滑度"提高。在梯度下降里等价于每一步权重乘以 (1−ηλ) 的衰减,因此也叫权重衰减(weight decay)。注意 AdamW 里"解耦权重衰减"的讨论见优化与梯度下降
  • L1 正则R = Σ |θᵢ|。把很多权重精确压到 0,产生稀疏解。

为什么 L1 稀疏而 L2 不稀疏? 几何直觉:L1 的等高面是菱形(在坐标轴上有尖角),L2 是圆球。损失与等高面相切时,菱形倾向于切在轴上(某些维度为 0),圆球则通常切在非轴位置(都是小值但不为 0)。L1 因此常用于特征选择、可解释模型;L2 是通用默认。

三、Dropout 与变体

Dropout(Hinton 等,2012):训练时每个神经元以概率 p 随机置零(输出乘 1/(1−p) 保持期望不变),推理时全部保留。机制解释:

  • 集成效应:每步训练的是不同的"子网络",推理等价于指数多个子网络的近似平均(bagging)。
  • 防共适应:神经元不能依赖特定的"搭档"存在,被迫学到更独立的特征——这就是"co-adaptation"防止的核心问题。

变体家族:

  • SpatialDropout:整通道置零(不是单个像素),CNN/embedding 层常用,破坏的是"通道级"共适应。
  • DropBlock(2018):连续块状置零,比逐点 Dropout 更有效地正则化卷积层。
  • DropConnect:置零权重而非激活,更强但训练更重。
  • Stochastic Depth:训练时随机跳过整个残差块——把"深"变成"浅的集成",效果类似 Dropout 的深度版。

PyTorch:nn.Dropout(p)nn.Dropout2d(Spatial)。注意 model.eval() 下 Dropout 自动关闭——与 BN 一样,这是训练/推理行为差异的又一例(见初始化与归一化)。

四、早停(Early Stopping)

在验证损失停止下降(或开始回升)的点截断训练。它本质上是最小化"参数离起点太远"的隐式正则——参数停留在更接近初始化的小范数区域,对应更光滑的解。实现要点:

  • 验证集上的"最佳"按连续 N 个 epoch 无改善判停(patience),防噪声假象。
  • 保存最佳权重(torch.save(model.state_dict())),训练结束恢复它。
  • 早停相当于"免费的正则化",每个项目都该有。验证集会被早停反复使用,最终成绩照例以测试集为准(三集划分纪律见评估章节)。

五、数据增强

用变换制造更多、更真实的训练样本,是最有效也最"诚实"的正则化——它在教模型不变性(invariance)而不是压制它。

  • 图像:随机裁剪/翻转/旋转、颜色抖动、缩放、平移、模糊。强增强(AutoAugment、RandAugment、Cutout)是 ImageNet SOTA 的标配。
  • 文本:同义词替换、回译(back-translation)、随机删词/乱序、EDA 方法。注意文本增强要保语义,破坏语法会引入噪声。
  • 音频:时间拉伸、音调/音量扰动、SpecAugment(沿时间/频率掩蔽),见语音与音频

增强强度的判断:增强太弱约等于没做,太强会把"类内差异"增强成"跨类混淆"。以验证集性能为准来调节。数据管线的工程化(在线增强、多卡 shuffle)见数据与数据工程

六、标签平滑(Label Smoothing)

把 one-hot 硬标签换成软标签:y' = (1−ε)·y + ε/Kε≈0.1)。它的双重作用:

  1. 抑制过拟合:模型不再被逼着把正确类概率推到 1,logits 不至于无限大。
  2. 改善校准:预测概率更接近真实置信度,见损失函数与输出层

副作用:软标签会让"蒸馏"类方法收益下降(教师模型的预测被抹平)。它是"便宜、几乎无副作用"的正则化,Transformer 家族默认使用。

七、EMA(指数移动平均)

维护参数的一个滑动平均副本:

θ_ema ← β·θ_ema + (1−β)·θ        # β≈0.999

推理时用 θ_ema 而不是当前 θ。为什么有效:训练中参数在高频抖动,EMA 相当于"在参数轨迹上做时间维的平均",消噪后落在更平坦、泛化更好的区域。它在 GAN、扩散模型、自监督学习里几乎必用——比如 VAE 与 GAN 里判别器/生成器训练后,用 EMA 权重生成质量明显更稳。实现上 PyTorch 可用 torch.optim.swa_utils.AveragedModeltorch_ema 库。

八、Mixup 与 CutMix

Mixup(2018):把两个样本及其标签线性插值:

x' = λ·xᵢ + (1−λ)·xⱼ,   y' = λ·yᵢ + (1−λ)·yⱼ

模型学到的是"类别之间的线性插值"——训练边界更平滑、对对抗样本更鲁棒。CutMix(2019):把一个样本的图像块剪切粘贴到另一个样本上,标签按面积比例混合——兼顾了 Mixup 的平滑与局部特征的保留。

这类"混合增强"在 CV 是免费午餐(性能稳定提升),在文本上也有 Manifold Mixup 等变体(在隐层空间插值)。注意与强增强叠加时可能过猛,需要验证集把关。

九、正则化组合策略与强度选择

正则化手段多,但总正则强度才是关键——所有手段都在往一个方向使劲:降低方差。组合经验:

  1. 按"破坏力"从小到大部署:早停 + 数据增强 → L2/权重衰减 → Dropout → 更激进的增强/减容量。先加便宜的先,别一上来就叠满。
  2. 归一化层的存在改变需求:BN 自带轻微正则(见初始化与归一化),用了 BN 的 CNN 往往 Dropout 收益很小。
  3. 强度以验证集为准:正则超参数(λ、p、ε)在验证集上选,别凭感觉。验证集是"可反复使用"的选择集,别拿它当测试集。
  4. 容量先大后收:默认先选偏大的网络 + 足够正则,比"小网络硬训"更容易调出好结果——正则化给了容量犯错的空间。

别过度正则化

正则化本质是"向简单解倾斜的偏见"。模型欠拟合时(训练损失都降不下去)再加正则只会雪上加霜——先确认是过拟合(训练好、验证差)再动手,读学习曲线是第一步。

十、权衡与取舍

权衡与取舍

偏差 vs 方差:这是所有正则化的总纲。数据量充足时正则化收益递减,甚至有害(把本该学到的都压掉了);数据稀缺时正则化是救命稻草。数据量决定正则强度

L1 稀疏可解释 vs L2 光滑稳定:L1 适合特征选择与压缩,L2 通用且优化更顺滑;深度网络默认 L2/权重衰减,L1 多用于稀疏化(如剪枝前置)。

Dropout 的代价 vs 收益:Dropout 需要放大激活(乘 1/(1−p))会损失一些容量,对超大模型影响可忽略,对小模型可能"正则过度"。推理时记得 eval() 模式。

数据增强的收益 vs 计算成本:在线增强增加训练时长;它提升泛化的"性价比"几乎总是最高的——但强增强会扭曲分布(例如医学影像翻转不合法),必须结合任务语义。

正则化不是"花架子",它决定了一个模型能否从"背下训练集"升级为"掌握任务"。它与优化与梯度下降(优化本身也带隐式正则)、归一化层的轻微正则共同构成"泛化三角"。组合调参的完整流程见训练配方与调参,术语见术语表

延伸阅读

参考资料