You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于MONAI WarmupCosineSchedule与AdamW的两个技术疑问

PyTorch分割模型:AdamW与WarmupCosineSchedule用法确认

训练PyTorch分割模型时,采用torch.optim.AdamW优化器搭配monai.optimizers.WarmupCosineSchedule学习率调度器,相关配置如下:

优化器配置

optimizer = torch.optim.AdamW(
    model.parameters(),
    lr=1e-4,
    weight_decay=1e-5,
    betas=(0.9, 0.999),
    eps=1e-8,
)

调度器配置

from monai.optimizers import WarmupCosineSchedule

scheduler = WarmupCosineSchedule(
    optimizer=optimizer,
    warmup_steps=1000,
    t_total=10000,
    end_lr=0.0,
    cycles=0.5,
    warmup_multiplier=0.01,
)

训练循环中每次batch都会调用scheduler.step(),针对用法有以下两个疑问及确认:


疑问1:该基于步数的调度器是否应在每个batch/优化器更新步骤调用scheduler.step(),而非每个epoch?

是的,必须在**每个batch(即每次优化器参数更新后)**调用scheduler.step()。
WarmupCosineSchedule是纯步数驱动的调度器,它的学习率变化逻辑完全依赖训练步数(batch更新次数)。如果改为每个epoch调用一次,会导致学习率更新频率远低于预设,热身阶段的节奏、余弦衰减的周期全部错乱,无法实现预期的学习率调度效果。只有每次优化器更新后调用,才能让学习率严格按照warmup_steps和t_total的设定逐步变化。

疑问2:WarmupCosineSchedule是否将AdamW设置的lr=1e-4作为峰值学习率,即从lr*warmup_multiplier开始热身,逐步升至1e-4后余弦衰减至end_lr?

是的,你的理解完全正确。
AdamW中设置的lr=1e-4就是调度器的峰值学习率,WarmupCosineSchedule的执行逻辑为:

  • 热身阶段(前1000步):学习率从1e-4 * 0.01 = 1e-6线性上升至1e-4;
  • 热身结束后:从1e-4开始按余弦函数衰减,经过剩余的9000步(10000-1000),最终降至end_lr=0.0,cycles=0.5表示仅完成半个余弦周期(从峰值衰减到最低值)。

内容的提问来源于stack exchange,提问作者Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 19:03:11