深度学习---常用优化器

发布于:2025-05-13 ⋅ 阅读:(19) ⋅ 点赞:(0)

 优化器一: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 或更小 防止破坏已有特征表示
调整学习率 StepLRCosineAnnealingLR 调度器 调整学习率以适应不同阶段收敛需求

学习率调度器示例:

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-4weight_decay = 0.01 官方推荐设置
微调 BERT、Swin 等预训练模型 lr = 2e-5 或更小;weight_decay = 0.01 防止破坏已有参数
防止训练不稳定 使用 warmup + 调度器 transformer 很依赖 warmup 技术(见下)

📉 搭配调度器(transformer常用):

from transformers import get_linear_schedule_with_warmup

scheduler = 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 不再下降 MultiStepLRCosineAnnealingLR 非自适应优化器必须调度 lr!


📉 推荐调度器设置(图像任务中常见)

from torch.optim.lr_scheduler import MultiStepLR

scheduler = MultiStepLR(
    optimizer, 
    milestones=[30, 60, 90],   # 在这些 epoch 处学习率减半
    gamma=0.1
)
from torch.optim.lr_scheduler import CosineAnnealingLR

scheduler = 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任务 ❌ 不推荐

网站公告

今日签到

点亮在社区的每一天
去签到