外观
过拟合与正则化
概念定义:背答案 ≠ 学会了
过拟合(overfitting)是机器学习里最经典也最普遍的问题:模型在训练数据上表现极好,但对新数据表现差。原因只有一个——模型把训练数据里的噪声也当成了规律记下来。就像学生把练习题的答案背得滚瓜烂熟,换个出题方式就不会了。
理解过拟合的两个关键认知:
- 训练集上表现好是必然的——模型有足够容量时,总能拟合训练数据(甚至记住每个样本);
- 泛化(对新数据表现好)才是唯一目标——记住训练集不等于学会规律。
过拟合的极端形式是"记住所有训练样本"(如 1 近邻把每个点当中心)。正则化(regularization)就是一系列"阻止模型把噪声学进去"的技术总称。
一、过拟合的成因与识别
三大成因
| 成因 | 机制 | 典型场景 |
|---|---|---|
| 模型太复杂 | 容量超过数据提供的信息量 | 样本 100 条却上 10 层神经网络 |
| 数据太少/太单一 | 信息量不足,模型只能靠背 | 小样本 + 高维特征 |
| 特征噪声大 | 无意义特征给了模型"发挥空间" | 高维稀疏特征、异常值 |
识别信号
训练误差与验证误差的剪刀差是黄金信号:
- 训练 loss 持续下降,验证 loss 掉头上升 → 过拟合开始;
- 训练准确率 99%,验证 85%,差距越拉越大 → 过拟合。
很多框架(PyTorch、TF)的训练曲线里,验证集 loss 的"V 型拐点"就是模型从"学习规律"切换到"背诵噪声"的临界点。
二、偏差-方差视角
过拟合 = 高方差,欠拟合 = 高偏差(详见模型评估与验证)。正则化不是消灭方差,而是在偏差与方差之间选择——它引入一点偏差(约束模型表达力),换大幅方差下降:
误差 = 偏差² + 方差 + 噪声
正则化强 → 偏差↑ 方差↓ (过约束:欠拟合)
正则化弱 → 偏差↓ 方差↑ (欠约束:过拟合)
最优点在中间这个权衡是理解所有正则化技术的统一框架——每种正则化本质都是"给模型的复杂度加税"。
三、正则化武器库
1. L1 / L2 正则化(权重惩罚)
在损失函数里加模型权重的惩罚项,让模型"不敢"用大权重:
L2: L = 原始损失 + λ·Σwᵢ² (岭回归 Ridge)
L1: L = 原始损失 + λ·Σ|wᵢ| (Lasso)| L2(岭) | L1(Lasso) | |
|---|---|---|
| 惩罚 | 权重平方和 | 权重绝对值之和 |
| 效果 | 权重整体变小(但几乎不归零) | 权重稀疏化(很多归零) |
| 用途 | 默认的正则化(平滑) | 特征选择(自动挑特征) |
| 几何 | 圆形约束边界 | 菱形约束边界(顶点在轴上→稀疏) |
为什么 L1 产生稀疏解:L1 的约束域是"菱形",最优点容易落在坐标轴上(某个权重正好为 0);L2 的约束域是"圆形",最优点一般在圆上而非轴上。稀疏性的实用价值:特征多时 L1 自动挑出有用特征,模型更简单、更可解释。
λ(正则化强度)怎么定:用验证集搜索(见调参与超参数优化)。λ 太小没效果,太大把所有权重压到 0(欠拟合)。
2. 早停(Early Stopping)
训练中监控验证 loss,一旦验证 loss 不再下降(开始上升)就停止训练,取验证最优时的模型。实现上配合"保存最优模型 + patience 容忍几次波动":
python
# 伪代码:早停逻辑
best_val_loss, patience_counter = float('inf'), 0
for epoch in range(max_epochs):
train_one_epoch()
val_loss = evaluate(valid_set)
if val_loss < best_val_loss:
best_val_loss = val_loss
patience_counter = 0
save_checkpoint() # 保存最优权重
else:
patience_counter += 1
if patience_counter >= patience: # 连续 N 轮没进步
break早停是"免费午餐":不改变模型结构,不增加计算,直接斩断过拟合。深度学习的默认选项,几乎总是该开。
3. Dropout(深度学习专用)
训练时随机丢弃一部分神经元的输出(以概率 p 置零),迫使网络学会"没有哪个神经元能单独依赖"的冗余表征。本质是在单个模型内部模拟了集成学习(ensemble)——每次前向都是一个不同的子网络,训练结束后取平均。
- 经典用法:全连接层 p=0.5,卷积层 p≈0.1;
- 只在训练时启用,推理时要关闭(或按 p 缩放);
- 现代替代:Dropout 的新版本(DropBlock、Variational Dropout),以及归一化层的正则化效果(BatchNorm 自带轻微正则化)。
4. 数据增强(Data Augmentation)
用先验知识制造更多训练样本,直接扩大数据量——最"治本"的正则化。图像:随机裁剪、翻转、旋转、颜色抖动;文本:同义词替换、回译;表格:SMOTE(合成少数类样本)、噪声注入。
数据增强的本质假设:这些变换不改变语义标签(翻转的猫还是猫)。变换越符合真实数据分布,增强越有效。它的威力在大模型时代依旧:Vision Transformer 系列论文反复证明数据增强对数据效率的决定性作用。
5. 模型简化与剪枝
- 结构化简化:减少层数/神经元数/树深度、降低多项式阶数——最直接但损失表达力;
- 剪枝(pruning):训练后砍掉不重要的权重/神经元,模型变小还能微调恢复精度;
- 集成方法的"暗度陈仓":随机森林/GBDT 通过 bagging/boosting 天然抗过拟合(见树模型与集成学习)。
6. 交叉验证与模型选择
正则化强度本身也是超参数——用交叉验证选 λ/早停点,而不是拍脑袋定。交叉验证同时防止"选超参时的二次过拟合",见模型评估与验证。
四、深度学习中"过拟合 vs 欠拟合"的实战排查
深度学习场景的典型组合拳:
| 症状 | 先检查 | 再行动 |
|---|---|---|
| 训练 loss 不降 | 欠拟合 | 模型太小/学习率不对/数据问题 |
| 训练好、验证差 | 过拟合 | 数据增强 → Dropout → 早停 → L2 → 减模型 |
| 训练验证都不好 | 数据/特征问题 | 回数据环节 |
| 训练也差验证也差且波动 | 学习率/归一化问题 | 调学习率、加归一化 |
原则:先确保训练集能拟合(模型有容量),再谈防止过拟合(加正则化)——顺序反了会一头雾水。
正则化不是越多越好
正则化本质是"用偏差换方差"。过度正则化会让模型欠拟合——训练集都学不会,更别说泛化。正确流程:先让模型在训练集上能过拟合(证明容量足够),再逐步加正则化到验证集最优。
五、权衡与取舍
- L1 vs L2:要特征选择(特征多、想要稀疏解释)用 L1;默认防过拟合用 L2;两者也能混合(Elastic Net)。
- 早停 vs 强正则化:早停几乎免费,先上;L2/Dropout 增加超参数搜索空间,后上。
- 数据增强 vs 正则化:增强不损失信息(制造真实样本),正则化损失表达力——能增强先增强。
- 模型复杂度 vs 效果:简单模型(线性+正则化)在干净小数据上经常吊打复杂模型;复杂模型的价值在数据量大、结构复杂时。
延伸阅读
- 模型评估与验证——偏差-方差权衡的理论框架
- 监督学习——评估对象是这些模型
- 优化与梯度下降——训练过程与正则化的交互
- 调参与超参数优化——λ、p、patience 怎么搜
- 树模型与集成学习——集成天然抗过拟合的机制
- 深度学习基础——Dropout/早停在网络中的位置
- 常见陷阱与反模式——过拟合误判的翻车案例
参考资料
- James et al. An Introduction to Statistical Learning, Chapter 6(岭回归/Lasso)
- Tibshirani. Regression Shrinkage and Selection via the Lasso(JRSS-B, 1996) —— L1 稀疏性原始论文
- Srivastava et al. Dropout: A Simple Way to Prevent Neural Networks from Overfitting(JMLR, 2014) —— Dropout 原始论文
- Prechelt. Early Stopping - But When?(1998) —— 早停经典文献
- Shorten & Khoshgoftaar. A survey on Image Data Augmentation for Deep Learning(2019) —— 数据增强综述