【深度学习】学习率调度策略

什么是学习率

可以理解为模型在每一次迭代中的模型更新调整的幅度,“学习”新信息的速度。学习率定义了模型权重(参数)在梯度下降或其他优化算法中的更新步伐。较大的学习率意味着在每次参数更新时,模型会进行更大幅度的调整,而较小的学习率则意味着细致的、渐进的调整。适当的学习率可以帮助模型跳出局部最优解。当使用较大的学习率时,模型有可能跨越一些小的局部最优,从而找到全局最优解,但也有可能错过全局最优。因此,在模型训练中适当调整学习率是提高模型能力的有效手段。

学习率调度

调整学习率的策略的学名应该叫做学习率调度。在机器学习和深度学习的文献中,学习率调度有多个具体的方法和技术,以下是一些常见的调度方式:

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()
  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值