QUESTION

Adam、AdamW与StepLR有什么区别,都是自动调整学习率吗?

A

优化器决定怎样利用梯度更新参数,StepLR则按训练轮数修改优化器的基础学习率。

DETAILED ANSWER

直接结论

Adam和AdamW是优化器,负责根据梯度真正更新参数;StepLR是学习率调度器,只负责每隔固定轮数修改优化器的基础学习率。Adam会根据每个参数的历史梯度计算不同的有效更新幅度,StepLR则按预设时间表整体降低基础学习率。

它们不是二选一,可以组合使用。

Adam自动调节的是什么

Adam为每个参数维护mv,更新量可以简化为:

更新量 = 基础学习率 × m_hat / (sqrt(v_hat) + ε)

即使两个参数共享同一个基础学习率,由于它们的历史梯度不同,分子和分母也不同,所以实际移动距离可以不同。

这叫“按参数自适应缩放更新量”。它不表示Adam会根据验证集效果,自动把你配置的lr=0.001改成0.0001

StepLR自动调节的是什么

StepLR按固定训练轮数修改优化器中的基础学习率:

每经过step_size轮
基础学习率 = 原基础学习率 × gamma

例如:

optimizer = torch.optim.AdamW(model.parameters(), lr=0.001)
scheduler = torch.optim.lr_scheduler.StepLR(
    optimizer,
    step_size=10,
    gamma=0.1,
)

学习率变化为:

第0~9轮:0.001
第10~19轮:0.0001
第20~29轮:0.00001

它按轮数执行固定计划,不检查损失或验证指标是否真的改善。

二者一起使用时的完整关系

StepLR
  ↓ 修改优化器的基础学习率η
Adam或AdamW
  ↓ 再结合每个参数自己的m和v
得到本轮每个参数的实际更新量

常见训练顺序是先完成这一轮优化,再让调度器更新下一轮使用的学习率:

for epoch in range(num_epochs):
    for x, y in train_loader:
        optimizer.zero_grad()
        loss = loss_fn(model(x), y)
        loss.backward()
        optimizer.step()

    scheduler.step()

“自动调整学习率”需要说清层级

  • Adam或AdamW:根据梯度历史,自适应调整每个参数的有效更新幅度;
  • StepLR:根据轮数,修改全局或参数组的基础学习率;
  • 基于验证指标的调度器:根据监控指标是否改善再降低基础学习率,这又是另一类策略。

因此不能简单说“Adam会自动学习出最合适的学习率”,也不能说“用了Adam就不需要学习率调度器”。

参考

PyTorch StepLR官方文档