DevCN
菜单
讨论动态发现圈子我关注的我的收藏
# Python

模型训练 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. 每次只改一个变量。

REPLIES

回复

0 条回复
暂无回复。