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

PyTorch AdamW优化器学习率数百轮未衰减及参数组疑问

问题原因及解决方案

1. 学习率未衰减的核心原因

你当前代码仅初始化了AdamW优化器,但没有配置任何学习率调度器(Learning Rate Scheduler)。AdamW本身只负责参数更新逻辑,不会自动对学习率进行衰减——默认的weight_decay是权重衰减(L2正则的变种,用于防止过拟合),和学习率衰减完全是两个独立概念。

2. 参数组仅显示一个的原因

你直接将self.model.parameters()传入AdamW,PyTorch会把所有模型参数打包成单个参数组,因此optimizer.param_groups自然只有1个元素。如果需要给不同层设置不同学习率/权重衰减,需手动分组传入,示例:

optimizer = AdamW([
    {'params': self.model.backbone.parameters(), 'lr': 5e-5},
    {'params': self.model.head.parameters(), 'lr': 1e-4}
])

3. 实现学习率衰减的具体方案

要让学习率随训练轮数衰减,需搭配PyTorch的学习率调度器,以下是几种常用方案:

方式一:固定步长衰减(StepLR)

每隔指定轮数将学习率乘以衰减系数:

# 初始化优化器后定义调度器
from torch.optim.lr_scheduler import StepLR
scheduler = StepLR(self.optimizer, step_size=50, gamma=0.5)

# 训练循环中,每轮结束后更新学习率
for epoch in range(200):
    # ...执行训练逻辑...
    scheduler.step()
    # 记录学习率到wandb
    lrs = {f'lr_group_{i}': param_group['lr'] for i, param_group in enumerate(self.optimizer.param_groups)}
    wandb.log({"train_loss": avg_train_loss, "val_loss": val_loss, **lrs})

方式二:基于验证损失衰减(ReduceLROnPlateau)

当验证集损失不再下降时,自动衰减学习率:

from torch.optim.lr_scheduler import ReduceLROnPlateau
scheduler = ReduceLROnPlateau(self.optimizer, mode='min', factor=0.5, patience=10)

# 训练循环中,传入验证损失更新调度器
for epoch in range(200):
    # ...执行训练、计算val_loss...
    scheduler.step(val_loss)
    # 记录学习率到wandb
    lrs = {f'lr_group_{i}': param_group['lr'] for i, param_group in enumerate(self.optimizer.param_groups)}
    wandb.log({"train_loss": avg_train_loss, "val_loss": val_loss, **lrs})

方式三:余弦退火衰减(CosineAnnealingLR)

学习率按余弦曲线周期性变化,适合多数深度学习任务:

from torch.optim.lr_scheduler import CosineAnnealingLR
scheduler = CosineAnnealingLR(self.optimizer, T_max=200)

# 训练循环中每轮调用step更新
for epoch in range(200):
    # ...执行训练逻辑...
    scheduler.step()
    # 记录学习率到wandb
    lrs = {f'lr_group_{i}': param_group['lr'] for i, param_group in enumerate(self.optimizer.param_groups)}
    wandb.log({"train_loss": avg_train_loss, "val_loss": val_loss, **lrs})

注意事项

  • 需确保在每轮训练结束后调用scheduler.step(),使用ReduceLROnPlateau时要传入验证损失
  • 权重衰减(weight_decay)和学习率衰减是独立配置,可同时启用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 01:30:07