什么是学习率
可以理解为模型在每一次迭代中的模型更新调整的幅度,“学习”新信息的速度。学习率定义了模型权重(参数)在梯度下降或其他优化算法中的更新步伐。较大的学习率意味着在每次参数更新时,模型会进行更大幅度的调整,而较小的学习率则意味着细致的、渐进的调整。适当的学习率可以帮助模型跳出局部最优解。当使用较大的学习率时,模型有可能跨越一些小的局部最优,从而找到全局最优解,但也有可能错过全局最优。因此,在模型训练中适当调整学习率是提高模型能力的有效手段。
学习率调度
调整学习率的策略的学名应该叫做学习率调度。在机器学习和深度学习的文献中,学习率调度有多个具体的方法和技术,以下是一些常见的调度方式:
1. 学习率衰减 (Learning Rate Decay)
这是最广泛使用的术语,指的是随着训练过程的进行,逐渐降低学习率的策略。可以进一步细分为以下几种:
- 阶梯衰减 (Step Decay): 每隔固定的 epoch 或步数将学习率降低一个固定比例(例如 StepLR)。
- 指数衰减 (Exponential Decay): 学习率以指数形式逐渐减小(例如 ExponentialLR)。
- 多项式衰减 (Polynomial Decay): 根据多项式函数调整学习率。
- 余弦衰减 (Cosine Decay): 学习率随着训练时间的推移按照 cosine 函数变化。
2. 自适应学习率 (Adaptive Learning Rate)
这类方法根据参数更新的历史信息动态调整学习率,典型的算法包括:
- Adam: 一种自适应学习率优化算法,能够自动调整每个参数的学习率。
- AdaGrad: 通过对过去梯度的平方和进行累加来调整学习率。
- RMSProp: 类似于 AdaGrad,但针对学习率的衰减进行了改进。
3. 循环学习率 (Cyclical Learning Rate)
这种策略允许学习率在一定范围内循环变化,而不是单调下降。它通过周期性增加和减少学习率来加速训练,并有助于避免局部最优解。
4. 暂停学习率衰减 (Learning Rate Warm-up)
在训练初期,以较低的学习率开始,然后逐渐增大到预定值,再开始应用学习率衰减。这种方法可以帮助模型稳定训练。
调度策略组合
学习率调度策略通常可以与其他优化技巧和策略结合使用,以提高模型训练的效果和稳定性。以下是一些常见的组合方式:
1. 学习率衰减 + 自适应学习率
组合方式:使用自适应学习率算法(如 Adam、RMSProp)时,可以在其基础上应用学习率衰减策略。
目的:自适应学习率算法可以根据梯度信息动态调整每个参数的学习率,而后续的学习率衰减则有助于在训练后期进一步微调模型。
2. 暂停学习率衰减 + 学习率调度
组合方式:在训练初期使用较小的学习率(warm-up),然后逐渐增大到预设值,再应用学习率衰减策略。
目的:这种方法可以避免模型在一开始学习率过高导致的不稳定,同时确保模型在训练后期能以较小的学习率进行精细调整。
3. 循环学习率 + 学习率调度
组合方式:可以在训练过程中使用循环学习率策略,使学习率在一个范围内波动,同时结合衰减策略。在某些 epoch 后,降低学习率的最大值。
目的:这种方式有助于探索更广泛的参数空间,并防止陷入局部最优解,同时又能在训练后期通过衰减来稳定学习过程。
4. 早停法 (Early Stopping) + 学习率调度
组合方式:在监控验证集性能时,结合学习率调度策略,根据模型的表现决定是否提前停止训练。
目的:避免过拟合,同时在性能稳定或下降时自动降低学习率,帮助模型继续改进。
5. 数据增强 + 学习率调度
组合方式:将数据增强技术与学习率调度结合使用。
目的:数据增强可以提高模型的鲁棒性,而学习率调度则确保网络在不同训练阶段都能以适当的速度学习。
示例
以学习率衰减的例子展示学习率调整的方式:
StepLR学习调度器
功能:
每隔固定的步数(epoch),将学习率按一个固定的因子降低。
参数:
optimizer:需要调整学习率的优化器。
step_size:每隔多少个 epoch 调整一次学习率。
gamma:学习率衰减的倍数,通常小于 1。
import torch.optim as optim
# 创建优化器
optimizer = optim.Adam(model.parameters(), lr=0.1)
# 创建 StepLR 调度器
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1)
for epoch in range(num_epochs):
train(...)
validate(...)
# 更新学习率
scheduler.step()
ExponentialLR学习调度器
功能:
在每个 epoch 结束时,将学习率按指数衰减。
参数:
optimizer:需要调整学习率的优化器。
gamma:学习率衰减的倍数,通常小于 1,表示每次更新后学习率乘以这个因子。
import torch.optim as optim
# 创建优化器
optimizer = optim.Adam(model.parameters(), lr=0.1)
# 创建 ExponentialLR 调度器
scheduler = optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.96)
for epoch in range(num_epochs):
train(...)
validate(...)
# 更新学习率
scheduler.step()