PyTorch优化器与动态学习率调整的核心方法包括优化器定义、学习率调度器配置及训练循环中的动态更新机制。以下从优化器基础方法、学习率调度器类型及使用场景展开说明,并附完整代码示例与配图。
一、优化器(Optimizer)基础方法优化器用于更新模型参数,核心方法包括:
- step():执行梯度下降,更新参数(公式:参数 = 参数 - 学习率 * 梯度)。
- zero_grad():清零梯度,避免累加。
- add_param_group():动态添加参数组(如迁移学习中微调预训练模型)。
- state_dict() / load_state_dict():保存或加载优化器状态(如训练中断后恢复)。
示例代码:
import torchfrom torch.optim import SGDmodel = [torch.Parameter(torch.randn(2, 2, requires_grad=True))]optimizer = SGD(model, lr=0.1) # 定义优化器optimizer.zero_grad() # 清零梯度output = model[0] * 2 # 前向计算(模拟)loss = (output - 1).pow(2).sum() # 计算损失loss.backward() # 反向传播optimizer.step() # 更新参数二、学习率调度器(lr_scheduler)类型与场景PyTorch提供多种动态调整学习率的策略,适用于不同训练需求:
1. LambdaLR:自定义函数调整- 公式:lr = initial_lr * lambda(last_epoch)
- 场景:需要灵活控制学习率变化的场景(如预热、衰减)。
- 示例:scheduler = torch.optim.lr_scheduler.LambdaLR( optimizer, lr_lambda=lambda e: (e-100)2 / 1002 if e >= 100 else 1)
2. StepLR:固定步长衰减- 公式:lr = initial_lr * gamma^floor(epoch/step_size)
- 场景:每训练一定步数后降低学习率(如每10个epoch乘以0.7)。
- 示例:scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.7)
3. MultiStepLR:多里程碑衰减- 公式:lr = initial_lr * gamma(当epoch在milestones中时)
- 场景:在特定训练阶段(如第10、30、50个epoch)降低学习率。
- 示例:scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=[10,30,50], gamma=0.5)
4. ExponentialLR:指数衰减- 公式:lr = initial_lr * gamma^epoch
- 场景:学习率随epoch指数下降(如gamma=0.9)。
- 示例:scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.9)
5. CosineAnnealingLR:余弦退火- 公式:lr = eta_min + 0.5*(initial_lr - eta_min)*(1 + cos(T_cur/T_max * π))
- 场景:模拟余弦周期变化,避免陷入局部最优(如T_max=10,eta_min=1e-5)。
- 示例:scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=10, eta_min=1e-5)
6. ReduceLROnPlateau:基于指标动态调整三、完整训练流程示例结合优化器与学习率调度器的训练循环:
model = [torch.Parameter(torch.randn(2, 2, requires_grad=True))]optimizer = SGD(model, lr=0.1)scheduler = ExponentialLR(optimizer, gamma=0.9)for epoch in range(20): for input, target in dataset: optimizer.zero_grad() output = model[0] * input # 模拟前向传播 loss = (output - target).pow(2).sum() loss.backward() optimizer.step() scheduler.step() # 更新学习率四、关键注意事项- 调度器调用顺序:scheduler.step()通常在每个epoch结束后调用(ReduceLROnPlateau需传入监控指标)。
- 多参数组学习率:可通过字典形式为不同层设置不同学习率:optimizer = SGD([ {'params': model.base.parameters(), 'lr': 1e-3}, {'params': model.classifier.parameters(), 'lr': 1e-4}], lr=1e-2)
- 学习率预热:结合LambdaLR实现线性预热(如前5个epoch逐步增加学习率)。
通过合理选择优化器与学习率调度策略,可显著提升模型收敛速度与最终性能。