正则化技术:从 Dropout 到数据增强的过拟合对策
训练神经网络时,模型几乎总能记住训练集,却未必能在没见过的数据上表现良好。正则化(regularization)就是一组用来抑制过拟合、提升泛化能力的技术统称。本文按「从理论到工程」的顺序,系统讲解 L1/L2 权重衰减、Dropout、早停、数据增强与批归一化,并给出它们的对比与组合建议。
什么是过拟合与泛化
在监督学习中,我们用训练集拟合参数,目标是让模型在分布一致的未知数据(测试集)上也保持较低的误差。泛化误差(generalization error)指模型在总体分布上的期望误差,它由三部分构成:
- 偏差(bias):模型假设过强约束导致的系统性误差。
- 方差(variance):模型对训练样本噪声过度敏感导致的波动。
- 不可约误差(irreducible error):数据本身带有的噪声下界。
过拟合本质是方差过大:模型在训练集上损失很低,但验证集损失先降后升,两者差距不断扩大。正则化的核心思想,是在不显著牺牲偏差的前提下,约束模型的有效容量(effective capacity),从而降低方差、缩小训练误差与泛化误差之间的差距。
衡量是否过拟合,最直观的做法是同时观察训练损失与验证损失曲线:当训练损失持续下降而验证损失开始回升时,说明模型正在「记住」训练样本中的偶然噪声,此时应当引入或加强正则化。
L1/L2 权重衰减(数学形式)
权重衰减(weight decay)通过在损失函数中加入与参数大小相关的惩罚项,迫使模型偏好更小的权重,从而得到更平滑、更简单的函数。
记原始损失为 L(θ),L1 与 L2 正则化分别定义如下:
L1 正则化(Lasso):
L_total(θ) = L(θ) + λ · Σ_i |θ_i|
L2 正则化(Ridge,也称权重衰减):
L_total(θ) = L(θ) + λ · Σ_i θ_i^2
其中 λ 为正则化系数,控制惩罚强度。λ 越大,权重被压得越小,模型越简单。
从梯度角度理解,L2 的惩罚项对参数 θ_i 的梯度贡献为 2λθ_i,于是带动量的随机梯度下降更新可写成:
θ = (1 - ηλ) · θ - η · ∇L(θ)
可见 L2 等价于每次更新前对权重做一次比例为 ηλ 的衰减,这也是「权重衰减」名称的由来。L1 的梯度贡献为 λ·sign(θ_i),由于绝对值函数在零点不可导,它倾向于把不重要的权重直接压缩到零,因此兼具特征选择效果。
工程实践中有两点需要注意:
- 偏置项通常不做正则化,因为偏置不参与特征交互,惩罚它收益很小。
- 在 Adam 优化器中,标准的 L2 惩罚会混入动量估计,效果不如预期。正确做法是使用解耦权重衰减(AdamW),它将权重衰减项从梯度中分离出来单独施加。
下面是一个在 PyTorch 中按参数组设置权重衰减的示例,偏置项不施加惩罚:
import torch
import torch.nn as nn
model = nn.Sequential(
nn.Linear(784, 256),
nn.ReLU(),
nn.Linear(256, 10),
)
# 把偏置与权重分开,偏置项 weight_decay 设为 0
bias_params = [p for name, p in model.named_parameters() if "bias" in name]
weight_params = [p for name, p in model.named_parameters() if "bias" not in name]
optimizer = torch.optim.SGD(
[
{"params": weight_params, "weight_decay": 1e-4},
{"params": bias_params, "weight_decay": 0.0},
],
lr=1e-2,
momentum=0.9,
)
Dropout(原理与推理期缩放)
Dropout 由 Hinton 等人在 2012 年提出(arXiv:1207.0580)。它的做法是在训练时,以概率 p 随机「丢弃」一部分神经元(将其输出置零),使网络在每次前向传播时都表现为不同的子网络。这样做破坏了神经元之间的复杂共适应(co-adaptation):某个特征检测器不能再依赖少数几个特定伙伴,而必须学会在多种随机上下文中都普遍有用的特征。
从集成视角看,Dropout 近似训练了 2^N 个子网络的几何平均集成,推理时则用一个完整网络来近似这一集成的结果。
关键问题在于推理期如何缩放。存在两种等价的处理视角:
-
原始论文视角(推理期缩放):训练时以保留概率 p 保留神经元,推理时把每一层输出乘以 p,以此匹配训练时被丢弃带来的期望缩放。
-
反装在训练期的视角(Inverted Dropout,现代框架默认):训练时对保留下来的激活除以 (1-p) 做无偏缩放,推理期则直接恒等传递、不需要额外缩放。PyTorch 的
nn.Dropout(p)就采用这种方式。
下面的代码演示了两种情况,帮助理解其等价性:
import torch
import torch.nn as nn
# PyTorch 默认使用 inverted dropout:训练期除以 (1-p),推理期恒等
dropout = nn.Dropout(p=0.5)
x = torch.ones(1000)
dropout.train()
out_train = dropout(x) # 约一半为 0,保留的约为 2.0
print(out_train.mean().item()) # 期望接近 1.0
dropout.eval()
out_eval = dropout(x) # 推理期不做任何缩放,全部为 1.0
print(out_eval.mean().item()) # 等于 1.0
需要特别强调的是,一旦把 Dropout 切换到 eval() 模式,就不再有随机丢弃,输出与输入一致。这也是为什么部署模型前务必调用 model.eval()。
早停(Early Stopping)
早停在验证集性能不再提升时即终止训练,是深度学习里最常用、成本最低的正则化手段之一。
从数学上看,对二次损失用梯度下降训练线性模型,早停与 L2 正则化存在等价关系:训练的迭代步数 τ 与学习率 η 的乘积,近似等于 L2 系数 α 的倒数,即 1/α ≈ τη。迭代越少(τ 越小),等价于施加了越强的 L2 惩罚,因此早期停止点对应一个更简单、更受约束的解。
早停的工程实现通常依赖一个验证集与「耐心值(patience)」:
- 每个 epoch 结束后在验证集上计算监控指标(常用验证损失)。
- 若指标在连续 patience 个 epoch 内都没有改善超过阈值 min_delta,则停止训练。
- 停止后恢复(restore)到验证指标最佳那一轮保存的权重。
best_val_loss = float("inf")
patience = 10
wait = 0
best_state = None
for epoch in range(max_epochs):
train_one_epoch(model, loader, optimizer)
val_loss = evaluate(model, val_loader)
if val_loss < best_val_loss - 1e-4:
best_val_loss = val_loss
best_state = {k: v.detach().clone() for k, v in model.state_dict().items()}
wait = 0
else:
wait += 1
if wait >= patience:
print(f"早停在 epoch {epoch},恢复最佳权重")
model.load_state_dict(best_state)
break
早停几乎不需要改动模型结构,代价是必须额外划分验证集,并保存最佳检查点。
数据增强
数据增强(data augmentation)通过对训练样本施加随机变换来「凭空」扩充数据多样性,让模型见到更多样的外观,从而降低过拟合。它相当于隐式地约束了模型对输入微小扰动的不变性。
在计算机视觉中常见的增强手段包括:
- 几何变换:随机水平翻转、随机裁剪、旋转、缩放。
- 颜色变换:亮度、对比度、饱和度抖动。
- 高级混合策略:Mixup(对两张样本及其标签做线性插值)、CutMix(将一块区域替换为另一张图并相应混合标签)。
Mixup 的核心公式为:
x' = λ · x_a + (1 - λ) · x_b
y' = λ · y_a + (1 - λ) · y_b
其中 λ 从 Beta 分布采样,x_a、x_b 为两张训练图,y_a、y_b 为对应标签。模型因此被鼓励在样本之间进行平滑插值,泛化更稳健。
文本与音频领域也有各自的增强方法,例如同义词替换、随机遮盖、时域加噪等,思路一脉相承。
下面是使用 torchvision 构建一个图像增强流水线的示例:
from torchvision import transforms
train_augment = transforms.Compose([
transforms.RandomResizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]),
])
数据增强的优势在于不增加任何参数,却往往能带来显著的泛化提升,是实践中性价比最高的正则化手段之一。
批归一化的正则效应
批归一化(Batch Normalization,arXiv:1502.03167)最初是为加速训练而提出:它对每一层的小批量输入做标准化,缓解「内部协变量偏移」,从而允许更大的学习率、减少对初始化的依赖。
但论文作者也明确发现,批归一化具备正则化效应,在某些情况下甚至可以取代 Dropout。原因在于:每个小批量的均值与方差是从当前批次随机采样得到的,这个估计本身带有噪声,相当于给隐藏层的激活注入了随机扰动,起到了与 Dropout 类似的微正则化作用。
批归一化的前向计算为:
μ_B = mean(x_B)
σ_B^2 = var(x_B)
x_hat = (x - μ_B) / sqrt(σ_B^2 + ε)
y = γ · x_hat + β
其中 γ、β 为可学习缩放与平移参数,ε 为防止除零的小常数。训练时 μ_B、σ_B^2 随批次变化而带来噪声;推理时则改用训练阶段滑动平均得到的全局统计量,因此 BN 同样需要在部署前切换到 eval() 模式,以固定统计量。
理解这一点对组合策略很重要:当网络已经大量使用批归一化时,再叠加 Dropout 的边际收益可能变小,甚至会拖慢收敛,因此两者不必同时强用。
各方法对比与组合建议
下表从多个维度对比了本文介绍的几种正则化手段:
| 方法 | 是否引入随机性 | 是否增加参数 | 主要作用阶段 | 典型超参数 |
|---|---|---|---|---|
| L1/L2 权重衰减 | 否 | 否 | 训练全程 | λ |
| Dropout | 是 | 否 | 训练期随机丢弃 | p |
| 早停 | 否 | 否 | 训练终止控制 | patience |
| 数据增强 | 是 | 否 | 数据输入层 | 增强强度 |
| 批归一化 | 是(批次噪声) | 是(γ、β) | 每层激活 | momentum、ε |
组合建议如下:
- 数据增强通常应作为第一道防线,几乎对所有视觉任务都建议开启,成本最低、收益最稳。
- 权重衰减是通用基线,配合 AdamW 使用更稳妥;λ 一般从 1e-4 到 1e-2 之间网格搜索。
- Dropout 适合全连接层与较大的网络,卷积层可视情况减半或省略,p 常取 0.5(全连接)或 0.2(卷积)。
- 批归一化与 Dropout 同时存在时,把 Dropout 放在 BN 之后,或适度降低 Dropout 比例,避免双重正则化过强。
- 早停建议始终开启,因为它几乎是「免费」的:只要保存最佳检查点,就能在不增加任何风险的前提下取得最优验证模型。
需要提醒的是,正则化之间并非越多越好。过强的组合会把模型推向欠拟合,表现为训练损失与验证损失都居高不下,此时应逐步放松约束。
小结
本文依次介绍了五种常用正则化技术:
- 过拟合的本质是高方差,正则化的目标是约束模型有效容量、缩小泛化差距。
- L1/L2 权重衰减通过惩罚参数大小得到更简单的函数,L1 还能做特征选择;在 Adam 中应优先使用 AdamW。
- Dropout 用随机丢弃破坏神经元共适应,现代框架采用 inverted dropout,推理期无需手动缩放,但务必切换 eval 模式。
- 早停在数学上等价于 L2 惩罚,是成本最低的正则化,应配合最佳检查点保存使用。
- 数据增强与批归一化分别从输入层与激活层引入多样性或噪声,前者几乎无代价,后者兼具加速训练与轻微正则化双重作用。
合理组合上述手段,往往比单独堆叠某一种更能取得稳健的泛化表现。
参考与延伸阅读
- Hinton, G. E., Srivastava, N., Krizhevsky, A., Sutskever, I., Salakhutdinov, R. R. (2012). Improving neural networks by preventing co-adaptation of feature detectors. arXiv:1207.0580. 已核验。
- Ioffe, S., Szegedy, C. (2015). Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift. arXiv:1502.03167. 已核验。
- Prechelt, L. (1998). Early Stopping — But When? In: Neural Networks: Tricks of the Trade, Lecture Notes in Computer Science 1524, Springer, pp. 55-69. 早停领域的经典文献,已核验。
- PyTorch 官方文档:torch.optim(优化器与 weight_decay 权重衰减说明)。已核验页面包含权重衰减相关选项与按参数组设置的示例。
- Goodfellow, I., Bengio, Y., Courville, A. (2016). Deep Learning. MIT Press,第 7 章对早停与 L2 等价关系的论述。该书为公开可查的权威教材。