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
相关产品推荐
相关产品推荐

