过拟合(Overfitting) 是最常见也是最让人头疼的问题。模型在训练集上表现很好,但在验证集或测试集上效果却明显下降,这说明模型"记住了训练集",而没有学到可泛化的规律。本文从原理到实操,为你总结一套完整的过拟合解决方案。
一、什么是真正的过拟合
典型信号:
| 指标 | 现象 |
|---|---|
| 训练 loss | 持续下降 |
| 验证 / 测试 loss | 先降后升 |
| 训练准确率 | 很高 |
| 验证准确率 | 明显偏低 |
⚠️ 先排除伪问题:
- 训练集和验证集分布是否一致?
- 是否有数据泄露(同一条样本出现在 train/val)?
- 验证集是否太小?
二、解决过拟合的 8 大类方法
- 数据层:扩量与增强
增加数据量 是最根本也是最有效的手段。
如果手头数据少,可以尝试数据增强(Data Augmentation):
- 图像:翻转、裁剪、颜色抖动、MixUp、CutMix
- 文本:同义词替换、回译、Prompt 扩写
- 时序数据:加噪、滑动窗口
数据永远比模型重要!
- 降低模型容量
- 减少层数或隐藏单元数量
- 减少可训练参数
- 冻结部分层(LLM 微调常用)
Full Fine-tune → 冻结 backbone → LoRA 微调
模型越大,越容易在小数据上过拟合。
- 正则化
- L2 正则 / Weight Decay
optimizer = AdamW(model.parameters(), lr=3e-5, weight_decay=0.01) - Dropout:常用 0.1~0.3,CNN、Transformer 都适用
- 提前停止(Early Stopping)
监控验证集 loss,如果连续 N 个 epoch 不下降,就停止训练。
patience = 3 ~ 5
性价比最高的工程手段。
- 调整训练策略
- 降低训练轮数:不要训到 loss 归零
- 控制学习率:使用 Cosine decay、Warmup + decay 等策略
学习率过大可能导致模型"记住噪声"
- 标签与损失函数层面
- Label Smoothing:防止模型过度自信
- 鲁棒损失函数:Focal Loss(分类不平衡)、Smooth L1(回归)
- 集成与模型平均(进阶)
- 多模型 Ensemble
- EMA(Exponential Moving Average)
成本高,但效果稳定。
- 重新设计任务
- 标签是否有噪声?
- 是否将复杂任务拆得过简单?
- 样本本身是否可区分?
很多过拟合,本质是"问题定义错了"。
三、不同模型的重点方法
| 模型类型 | 重点解决手段 |
|---|---|
| 传统 ML(XGBoost / RF / SVM) | 限制树深、增大 min_samples_leaf、减少特征 |
| CNN / Transformer | 数据增强 + Dropout + Weight Decay + Early Stopping |
| LLM 微调(LoRA / QLoRA) | 小数据 → 冻结 backbone + LoRA + 小 lr + Early Stop |
注意:在几百条数据上对 70B LLM 进行 full fine-tune 极易过拟合!
四、工程化排查清单
- 画训练集 / 验证集 loss 曲线
- 检查数据是否泄露
- 减少训练轮数,启用 Early Stopping
- 加 Weight Decay + Dropout
- 减少可训练参数(LoRA / Freeze)
- 扩数据 / 做增强
- 必要时优化任务定义
五、总结
过拟合的根因是模型容量大于有效数据量。
解决思路分三层:数据层(扩数据、增强) → 模型层(降容量、正则化) → 训练层(early stop、lr 控制)
