理解训练曲线图(loss/accuracy 随 epoch 变化的曲线)是评估和诊断模型训练质量的 核心能力。煮啵从以下四方面详细讲解这类图怎么看、怎么判断模型状态、问题有哪些、该如何处理。
这个是煮啵之前写的一个小体量的网络模型的训练曲线
✅ 一、训练曲线怎么看?
1. Loss Curve(损失曲线)
左图是:
- 蓝线(Train Loss):训练集上的损失
- 橙线(Val Loss):验证集上的损失
损失越小越好。
理想状态(Loss):
- Train Loss 和 Val Loss 同时下降;
- 最终都趋于平稳;
- 两者数值接近(差距不大) ➜ 泛化性好。
2. Accuracy Curve(准确率曲线)
右图是:
- 蓝线(Train Acc):训练集上的准确率
- 橙线(Val Acc):验证集上的准确率
准确率越高越好。
理想状态(Accuracy):
- 两者 同步上升;
- 最终都趋于饱和或稳定;
- 验证准确率与训练准确率 差距小 ➜ 模型没有过拟合。
❌ 二、常见“非理想”曲线和原因分析
❗️情况 1:验证损失下降后开始上升(过拟合)

- 加数据增强
- 减小模型容量
- 加 EarlyStopping
❗️情况 2:验证损失波动很大(训练不稳定)
比如酱紫(煮啵这里用了0.001的学习率,对于煮啵写的小网络而言过大)
表现:
- Val Loss 曲线上下抖动剧烈
- Val Accuracy 跳来跳去
原因:
- 学习率太大(比如 0.001 在小模型中可能不稳定)
- 小批量样本不均衡
- 模型太小难以学到有效表示
应对:
- 减小学习率
- 增加 batch size
- 使用更稳定的优化器(Adam、AdamW)
- 添加 BatchNorm 层
❗️情况 3:训练准确率高但验证准确率低(过拟合)
表现:
- Train Acc → 很高(>90%)
- Val Acc → 停留在某个值(<70%)
原因:
- 模型复杂,学习了训练集的细节但不能泛化
- 数据集太小/不平衡
应对:
- Dropout 或 L2 正则
- 增加训练数据或数据增强
- 降低模型复杂度
❗️情况 4:训练和验证都不收敛(欠拟合)
表现:
- Train Loss 不下降或下降极慢
- Acc 都停在低值
原因:
- 模型太简单
- 学习率太小
- 输入数据未标准化
应对:
- 用更深的模型
- 增大学习率(但别太大)
- 检查特征是否规范化(标准化输入特征)
🔍 三、快速判断策略(小总结表)
曲线表现 | 可能问题 | 解决方向 |
---|---|---|
Val Loss 上升 | 过拟合 | 正则、早停、减复杂度 |
Val Loss 抖动大 | 学习率高、数据不稳 | 降学习率、BatchNorm |
Val Acc 远低于 Train Acc | 泛化差 | 加 Dropout、数据增强 |
两条 Loss 都不下降 | 欠拟合或错误 | 检查模型、特征、学习率 |
✨ 四、煮啵的图像评价(lr=0.0005)
最新训练图表现属于非常理想的情况:
- 损失曲线稳定下降;
- 准确率曲线平滑上升;
- 验证表现和训练表现接近;
- 没有明显的过拟合、欠拟合或不稳定现象。
🎯 说明:模型结构合理、优化器和学习率配置得当。
最后补充一点关于学习率的东西
学习率(learning rate)是神经网络训练中最重要的超参数之一,它控制着模型每次参数更新的幅度。如果学习率选得不好,训练可能会非常慢、陷入局部最优,甚至完全失败。
🧠 一、学习率到底是什么?
在基于梯度下降的优化中,模型的参数 $\theta$ 会这样更新:
θ = θ − η ⋅ ∇ θ L \theta = \theta - \eta \cdot \nabla_{\theta} L θ=θ−η⋅∇θL
其中:
- θ \theta θ:模型参数
- η \eta η:学习率(learning rate)
- ∇ θ L \nabla_{\theta} L ∇θL:损失函数对参数的梯度
⚠️ 二、学习率选得不好的后果
学习率太小:
- 收敛非常慢(训练时间长)
- 可能停在局部最优
- 很难跳出鞍点或平坦区域
学习率太大:
- 参数更新剧烈,可能直接跳过最优点
- Loss 震荡甚至发散
- 训练结果不稳定、无法收敛
📏 三、学习率选取的 依据和原则
✅ 1. 经验法则(初始设置)
-
对于大多数情况(特别是使用 Adam 优化器):
- 初始学习率:
0.001
是常用的初始值
- 初始学习率:
-
对于 SGD:
- 初始值可以设为
0.1
或0.01
- 初始值可以设为
✅ 2. 看 loss 曲线调整(最常见的方法)
- 如果 loss 曲线下降缓慢或停滞 → 学习率太小
- 如果 loss 不断波动甚至变大 → 学习率太大
图示理解:
Loss 曲线形态 | 原因 | 建议 |
---|---|---|
平稳下降 | 学习率合适 | 保持不变 |
缓慢下降 | 学习率太小 | 提高学习率 |
上上下下震荡 | 学习率太大 | 减小学习率 |
loss 突然爆炸 | 学习率极大或 NaN 梯度 | 显著减小学习率 |
📉 四、常见学习率策略
1. 固定学习率(最简单)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
适合:简单模型、小数据集、调试用。
2. 学习率衰减(推荐)
随着训练进行,适当降低学习率,让模型更细致地搜索最优解。
a. StepLR
每隔几轮将学习率乘以一个因子
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1)
b. ExponentialLR
指数式衰减
scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.95)
c. ReduceLROnPlateau(非常实用)
监控验证集 loss,停止下降则降低学习率
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.5, patience=5)
3. Warmup + CosineDecay(SOTA 推荐)
- 一开始用较小学习率“预热”,避免初期震荡
- 然后用余弦衰减控制训练后期收敛
适合:大型模型、大数据集、transformer 网络
from transformers import get_cosine_schedule_with_warmup
scheduler = get_cosine_schedule_with_warmup(optimizer,
num_warmup_steps=1000,
num_training_steps=10000)
🧪 五、实战建议(超具体)
场景 | 优化器 | 学习率推荐范围 |
---|---|---|
小模型(MLP, LeNet) | Adam | 0.001 – 0.005 |
中型模型(ResNet18) | SGD | 0.01 – 0.1 + 衰减 |
大型模型(ViT, Transformer) | AdamW | Warmup + CosineDecay |
微调预训练模型 | AdamW | 1e-5 – 1e-4 |
🔍 六、怎么调学习率?(非常详细)
步骤 1️⃣:先用大概学习率开始训练(如 0.001)
步骤 2️⃣:观察 loss 曲线
- 稳步下降:很好
- loss 上下跳:减小一位(0.0001)
- loss 降得慢:增加一位(0.01)
步骤 3️⃣:用调度器调控(如 StepLR 或 ReduceLROnPlateau)
步骤 4️⃣(进阶):使用学习率 finder 工具
✅ 总结一句话
学习率控制了你每次训练“走多远”——太小走不动,太大走错路,选好学习率比网络结构还关键。