优化器一:Adam(Adaptive Moment Estimation)
一、适用场景总结(实践导向)
场景 | 是否推荐用 Adam | 说明 |
---|---|---|
小模型训练(如 MLP、CNN) | ✅✅✅ | 稳定、无需复杂调参,适合快速实验 |
初学者使用或结构新颖 | ✅✅ | 容错率高,容易收敛 |
医学图像初步建模 | ✅✅ | 常用于 baseline 训练 |
复杂大模型(如 Transformer) | ❌ 不推荐 | 替代方案为 AdamW,更稳定 |
二、PyTorch代码与推荐参数设置
import torch
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3, # 学习率betas=(0.9, 0.999), # 一阶和二阶动量系数eps=1e-8, # 数值稳定项weight_decay=0.0 # L2正则化强度
)
-
lr=1e-3
:标准初始值,大部分任务适用;若 loss 波动剧烈可调小至1e-4
-
betas=(0.9, 0.999)
:默认设置几乎不需要改 -
eps=1e-8
:保证数值稳定,基本不改 -
weight_decay=0.0
:Adam 本身不建议加 L2 正则(详见后面误区)
三、实战调参技巧
目的 | 推荐设置 | 说明 |
---|---|---|
想加快训练收敛 | lr = 1e-3 (初始) | 可在训练初期较快降低 loss |
loss 波动大 / 不下降 | lr = 1e-4 ~ 5e-5 | 小学习率更稳,适合细调 |
防过拟合 | weight_decay = 1e-5 (慎用) | Adam 的 weight_decay 实际为梯度正则,不太有效,建议改用 AdamW |
微调已有模型 | lr = 5e-5 或更小 | 防止破坏已有特征表示 |
调整学习率 | 加 StepLR 或 CosineAnnealingLR 调度器 | 调整学习率以适应不同阶段收敛需求 |
学习率调度器示例:
from torch.optim.lr_scheduler import StepLR
scheduler = StepLR(optimizer, step_size=20, gamma=0.5) # 每20轮将lr减半
四、常见误区与建议
-
误用 weight_decay:在 Adam 中加入
weight_decay
相当于错用 L2 正则,实际对参数更新方向产生影响,不是标准正则方式
推荐使用 AdamW 替代 -
学习率调度器常被忽视:Adam 虽然自适应,但仍推荐使用调度器,否则后期收敛慢
-
适合作为 baseline 起点优化器,特别是结构不熟时、或做 ablation 实验时
优化器二:AdamW(Adam with decoupled Weight Decay)
一、适用场景总结(实践导向)
场景 | 是否推荐用 AdamW | 说明 |
---|---|---|
Transformer 模型训练(如 BERT、Swin Transformer) | ✅✅✅ | 论文标准优化器,收敛稳定 |
微调预训练模型(如 BERT fine-tune) | ✅✅✅ | 默认使用 AdamW,效果好且安全 |
图像分割任务(如 UNETR、TransUNet) | ✅✅ | 权重正则更合理 |
小模型实验 | ✅ | 也可以用,但优势不如 Adam 明显 |
核心优点:解决了 Adam 中正则化不标准的问题!
二、PyTorch代码与推荐参数设置
import torch
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-4, # 通常比 Adam 略小betas=(0.9, 0.999), eps=1e-8,weight_decay=0.01 # 推荐加上!默认值一般 0.01
)
-
lr=1e-4
:起始建议略小于 Adam;若是预训练模型微调,用1e-5 ~ 3e-5
-
weight_decay=0.01
:这个值是有效的 L2 正则项,推荐设置! -
其他参数基本保留默认
🧪 三、实战调参技巧
目的 | 推荐做法 | 说明 |
---|---|---|
Transformer 预训练 | lr = 1e-4 ,weight_decay = 0.01 | 官方推荐设置 |
微调 BERT、Swin 等预训练模型 | lr = 2e-5 或更小;weight_decay = 0.01 | 防止破坏已有参数 |
防止训练不稳定 | 使用 warmup + 调度器 | transformer 很依赖 warmup 技术(见下) |
📉 搭配调度器(transformer常用):
from transformers import get_linear_schedule_with_warmupscheduler = get_linear_schedule_with_warmup(optimizer,num_warmup_steps=500, # 前500步线性升温num_training_steps=10000 # 总训练步数
)
或者直接在pytorch中创建
from torch.optim.lr_scheduler import CosineAnnealingLR
scheduler = CosineAnnealingLR(optimizer, T_max=50)
四、常见误区与建议
-
不要用普通 Adam 加 weight_decay:请务必用 AdamW
-
Transformer 必须用调度器(特别是 warmup),否则很容易训练失败
-
直接使用 Adam 调高 weight_decay 会使收敛变差,原因为其 weight_decay 与标准 L2 不等价
实战总结:什么时候用 AdamW?
应用 | 推荐 |
---|---|
微调 BERT、Swin Transformer 等预训练模型 | ✅✅✅ |
医学图像分割中使用 Transformer 网络 | ✅✅ |
需要正则效果(防止过拟合) | ✅ |
新任务上做 baseline,想加入合理正则项 | ✅ |
优化器三:SGD + Momentum(随机梯度下降 + 动量)
一、适用场景总结(实践导向)
场景 | 是否推荐用 SGD+Momentum | 说明 |
---|---|---|
图像分类(如 ResNet、VGG、DenseNet) | ✅✅✅ | 默认优化器,经典高效 |
大规模数据训练 | ✅✅ | 表现稳定,泛化强 |
医学图像(图像分割 / 分类)传统CNN模型 | ✅✅ | 与 AdamW 表现相当甚至更好 |
小数据集、快速测试 | ❌ 不推荐 | 收敛慢、对学习率更敏感 |
二、PyTorch代码与推荐参数设置
import torch
optimizer = torch.optim.SGD(model.parameters(),lr=0.1, # 高起始学习率momentum=0.9, # 动量系数weight_decay=5e-4, # 标准 L2 正则nesterov=True # 推荐开启
)
-
lr=0.1
:SGD 起始学习率高!但需配合学习率调度器 -
momentum=0.9
:常用设定,加快收敛,减少振荡 -
nesterov=True
:一般推荐打开,提升稳定性 -
weight_decay=5e-4
:这是传统 ImageNet 设置的标准正则
三、实战调参技巧
目标 | 推荐设置 | 说明 |
---|---|---|
CNN训练(ResNet、VGG) | lr = 0.1 ,调度器减半 | 不要一开始就设置太低 |
训练早期不收敛 | 检查 batch size 和 lr 配合 | batch size 变大时 lr 要增大(线性关系) |
想更快稳定收敛 | 开启 nesterov=True ,调大 momentum | 对震荡敏感任务更有效 |
中后期 loss 不再下降 | 加 MultiStepLR 、CosineAnnealingLR | 非自适应优化器必须调度 lr! |
📉 推荐调度器设置(图像任务中常见)
from torch.optim.lr_scheduler import MultiStepLRscheduler = MultiStepLR(optimizer, milestones=[30, 60, 90], # 在这些 epoch 处学习率减半gamma=0.1
)
from torch.optim.lr_scheduler import CosineAnnealingLRscheduler = CosineAnnealingLR(optimizer, T_max=100)
四、常见误区与建议
-
用默认学习率 0.01 或太小的 lr 会严重阻碍收敛
SGD 通常使用较大的初始 lr(0.1 是经典设置),但需要调度器配合!
-
不使用调度器就用 SGD → 后期训练停滞
学习率下降对于 SGD 是必须的!
-
泛化能力更强:训练慢但往往结果比 Adam 更好,常用于正式比赛、ImageNet 模型、CV base model 训练
实战总结:什么时候用 SGD+Momentum?
应用 | 推荐 |
---|---|
图像分类任务(ResNet 等) | ✅✅✅ |
图像分割中使用 CNN 结构(UNet) | ✅✅ |
模型较浅,想减少过拟合 | ✅✅ |
对训练速度不敏感、追求最终精度 | ✅✅✅ |
transformer 模型或 NLP任务 | ❌ 不推荐 |