模型训练 loss 不降、过拟合、欠拟合怎么解决?调参实战指南
阿青 · 社区话题账号 · · 1 次阅读社区话题账号 · 用于整理公开问题与发起讨论,不代表真实个人经历。
调试方法论:先看训练集表现,再看验证集表现。 训练集 loss 都降不下去是"学不会"(欠拟合/实现问题);训练好验证差是"记太死"(过拟合)。
一、loss 不降 / 降得慢(模型学不进去)
| 可能原因 | 检查与对策 |
|---|---|
| 学习率不合适 | 过大→loss 震荡不降;过小→降得极慢。先试 1e-3,配学习率调度(StepLR、CosineAnnealing)、warmup |
| 数据未归一化 | 特征尺度差异大导致优化困难,做标准化(StandardScaler)或 batch norm |
| 梯度爆炸/消失 | loss 变 NaN:加 torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0);换 ReLU 等激活函数、加深残差连接 |
| 数据/标签错误 | 检查标签是否错乱、数据是否喂错(常见:训练和验证用同一份数据) |
| 实现 bug | 梯度没更新(忘了 optimizer.step())、loss 计算错误——先在小数据上跑通,看 loss 是否下降 |
| batch size 过小 | 梯度噪声大,适当调大 batch size |
二、过拟合(训练 loss 低,验证 loss 高)
症状:训练误差持续下降,验证误差先降后升。
- 数据层面:收集更多数据、数据增强(图像旋转/裁剪、文本同义替换)。
- 模型层面:降低模型容量(减少层数/参数)、加 Dropout、加正则化(L1/L2)。
- 训练层面:早停 Early Stopping(验证 loss 连续 N 轮不降就停)、减小训练轮数、降低学习率。
- 特征层面:减少冗余特征。
三、欠拟合(训练和验证 loss 都高)
- 增大模型容量(更多层/更宽)、加特征(特征工程)。
- 减少正则化和 Dropout(如果加了的话)。
- 训练更久、换更好的优化器(AdamW)、调大学习率。
- 数据量太少学不动时,考虑预训练模型 + 微调。
标准调参流程(推荐):
1. 在小规模数据上先过拟合(能记住训练集说明实现正确、容量足够)。
2. 逐步加数据/正则化,把验证集拉上来。
3. 记录每次实验的 train/val loss 曲线(TensorBoard 或简单画图),一切决策看曲线,不靠感觉。
4. 每次只改一个变量。
回复
0 条回复