Skip to content

过拟合与正则化

本页速览 过拟合是机器学习第一大坑:模型把训练集的噪声当成了规律。本文讲透过拟合的成因与识别信号,以及六大正则化武器——L1/L2、Dropout、早停、数据增强、剪枝、集成——各自的原理、适用场景与权衡。

过拟合与正则化 ​

概念定义:背答案 ≠ 学会了 ​

过拟合(overfitting)是机器学习里最经典也最普遍的问题:模型在训练数据上表现极好,但对新数据表现差。原因只有一个——模型把训练数据里的噪声也当成了规律记下来。就像学生把练习题的答案背得滚瓜烂熟,换个出题方式就不会了。

理解过拟合的两个关键认知:

  1. 训练集上表现好是必然的——模型有足够容量时,总能拟合训练数据(甚至记住每个样本);
  2. 泛化(对新数据表现好)才是唯一目标——记住训练集不等于学会规律。

过拟合的极端形式是"记住所有训练样本"(如 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 效果:简单模型(线性+正则化)在干净小数据上经常吊打复杂模型;复杂模型的价值在数据量大、结构复杂时。

延伸阅读 ​

参考资料 ​