【深度学习】Pytorch:调度器与学习率衰减
在深度学习中,学习率(Learning Rate)控制模型参数更新的步幅。学习率衰减(Learning Rate Decay)是一种动态调整学习率的方法,能够在训练初期提供快速的优化效果,并在后期保证模型的稳定收敛。
实现原理
学习率调度器通过在训练过程中动态调整学习率来优化模型性能。PyTorch 中的调度器基于 torch.optim.lr_scheduler
实现,它们通过每个 epoch 或每个 batch 的变化,利用不同策略来计算新的学习率。
- 初始化调度器:用户通过传入优化器和调度策略的参数来初始化调度器对象。这一过程会将优化器的初始学习率存储在调度器中,以便后续更新时进行基于策略的调整。
- 更新学习率:
- 调度器通过调用
scheduler.step()
或scheduler.step(metric)
(适用于监控指标的策略)更新优化器中的学习率。 - 在
scheduler.step()
内部,调度器会根据当前的 epoch、步长或验证指标计算出新的学习率值,并将其更新到优化器的param_groups
列表中。
- 调度器通过调用
- 策略实现:
- 固定步长衰减:每隔指定步长,将学习率乘以预设的衰减因子。
- 指数衰减:每次更新时,学习率按照指数函数形式递减。
- 余弦退火:根据余弦函数计算新学习率,随着训练进程逐渐降低。
- 性能监控策略:通过监控验证指标,判断是否需要降低学习率,适合于模型性能不稳定的场景。
背后实际发生的核心逻辑是调度器维护一个内部计数器来跟踪训练状态(如 epoch 数或 batch 数),并根据策略公式动态调整优化器的学习率。这种机制保证了训练过程中的灵活性和高效优化。
模型和损失函数
我们将以一个简单的线性回归模型为例,使用均方误差(MSE)作为损失函数进行训练。该模型的目标是根据输入数据预测输出值。
import torch
import torch.nn as nn
import torch.optim as optim
# 定义一个简单的线性模型:输入10维特征,输出1维
model = nn.Linear(10, 1)
# 定义均方误差损失函数
criterion = nn.MSELoss()
# 使用随机梯度下降(SGD)优化器
optimizer = optim.SGD(model.parameters(), lr=0.1)
# 定义调度器示例(以 Step Decay 为例)
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1)
# 训练过程示例
for epoch in range(50):
optimizer.zero_grad() # 梯度清零
inputs = torch.randn(1, 10) # 随机生成输入数据
targets = torch.randn(1, 1) # 随机生成目标数据
outputs = model(inputs) # 模型预测输出
loss = criterion(outputs, targets) # 计算损失
loss.backward() # 反向传播
optimizer.step() # 更新模型参数
# 调度器更新学习率
scheduler.step()
print(f"Epoch {epoch+1}, Loss: {loss.item():.5f}, Learning Rate: {optimizer.param_groups[0]['lr']:.5f}")
Step Decay:定期减小学习率
策略描述:每隔固定步长(如每10个 epoch),将学习率乘以固定因子(如 0.1)。这种策略适用于模型在不同阶段需要不同学习率的场景。
适用场景:
- 阶段性学习过程。
- 模型初期需要较大步长,后期逐步微调。
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1)
Exponential Decay:指数衰减
策略描述:学习率按指数方式递减,每个 epoch 按照 lr = lr * gamma
更新。
适用场景:
- 需要平滑减少学习率的任务。
- 避免学习率剧烈变化。
scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.95)
Cosine Annealing:余弦退火策略
策略描述:逐步将学习率从初始值退火到接近 0,通常用于带有周期性学习率变化的任务。
适用场景:
- 需要周期性调整学习率的任务。
- 适合网络结构复杂、长时间训练的场景。
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=50)
ReduceLROnPlateau:性能监控策略
策略描述:监控验证集损失,当性能在若干 epoch 内未提升时,减少学习率。
适用场景:
- 适用于验证性能波动较大的任务。
- 适合需要根据模型收敛情况调整学习率的场景。
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=5, verbose=True)
调度器的调用位置与使用方法
- Step Decay、Exponential Decay、Cosine Annealing:在每个 epoch 结束后调用
scheduler.step()
。 - ReduceLROnPlateau:需要将
scheduler.step(loss)
放在损失计算之后,以便根据当前的损失值调整学习率。
总结
合理的学习率衰减策略能够显著提升模型性能。在 PyTorch 中,根据任务特点灵活使用调度器有助于模型更快、更稳定地收敛。
原文地址:https://blog.csdn.net/2303_80346267/article/details/145132260
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!