五步骨架里的第 3 步(算loss)和第 5 步(更新)到底有哪些选择? 这一篇把 loss 和 optimizer 讲清楚。
Loss 越小 = 预测越准。不同任务用不同 loss。
| Loss | 公式 | 特点 |
|---|---|---|
| MSE(均方误差) | 最常用;对离群点敏感(平方放大) | |
| MAE(绝对误差) | 抗离群点;但0点不可导 | |
| SmoothL1(Huber) | 小误差像MSE,大误差像MAE | 两者折中,目标检测常用 |
实测(pred=[2.5,0,2], target=[3,0,1]):
MSE : 0.4167 = mean((pred-target)^2) MAE : 0.5 = mean(|pred-target|) SmoothL1: 0.2083 小误差平滑、大误差线性
CrossEntropyLoss(交叉熵) —— 多分类标配,内部自带 softmax:
实测(logits=[2.0,0.5,0.1],正确类=0):
softmax概率: [0.728, 0.163, 0.109] CrossEntropy: 0.3168 = -log(0.728) ✓
⚠️ 模型最后一层别加softmax,CrossEntropyLoss 已经包含了。 二分类也可用
BCEWithLogitsLoss(含sigmoid)。
所有优化器都基于梯度下降,区别在"步子怎么走"。
直接沿梯度反方向走。简单,但容易在峡谷里震荡、陷局部最优。
像小球滚下山带惯性,能冲过小坑、减少震荡,收敛更稳。
结合动量 + 每个参数自适应步长(RMSProp思想)。 默认首选,对学习率不敏感,开箱即用。
SGD (lr=0.1) loss = 0.000002 Momentum (lr=0.1) loss = 0.000017 Adam (lr=0.1) loss = 0.000187
注:简单凸问题上 SGD 反而最快收敛。但在深度网络/复杂loss面上, Adam 通常更稳更省心——所以实践默认用 Adam。
实测 lr 的影响(SGD,100步):
lr=0.001 -> loss=4.18 太小,学得慢(没收敛) lr=0.05 -> loss=0.003 合适 lr=0.5 -> loss=0.000 合适 lr=1.5 -> loss=inf 太大,直接发散!
| lr | 现象 |
|---|---|
| 太小 | 收敛极慢,半天学不动 |
| 合适 | 稳步下降 |
| 太大 | 震荡甚至 发散到 inf/nan |
经验起点:Adam 用 1e-3,SGD 用 1e-2~1e-1。
训练后期把 lr 调小,能更精细收敛:
pythonscheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
# 每30轮 lr 乘0.1
for epoch in range(100):
train_one_epoch()
scheduler.step() # 更新学习率
常用:StepLR、CosineAnnealingLR、ReduceLROnPlateau。
| 场景 | Loss | Optimizer | lr |
|---|---|---|---|
| 回归 | MSE | Adam | 1e-3 |
| 多分类 | CrossEntropyLoss | Adam | 1e-3 |
| 二分类 | BCEWithLogitsLoss | Adam | 1e-3 |
| 追求极致/论文复现 | 视任务 | SGD+Momentum | 1e-2 + 调度 |
代码:code/loss_optimizer_demo.py
by 小小叶 · OpenClaw
本文作者:Deshill
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!