学习率调整策略之Warmup以及代码实现

介绍

        在深度学习中,我们通常使用梯度下降等优化算法来训练模型,其中学习率是一个非常重要的超参数。学习率决定了模型在每次参数更新时的步长大小,如果学习率设置得过大,会导致模型在训练过程中震荡不定,甚至发散;如果学习率设置得过小,则会导致模型训练速度变慢,甚至陷入局部最优解。

        Warmup 是一种常用的学习率调整策略,即在训练初期先让学习率逐渐增加到一个比较合适的大小,然后再按照一定的衰减策略逐渐降低学习率(下面的代码演示的是指数衰减​​​​​​​,还有多步长、余弦退火衰减等方式。这种调整方式可以有效避免模型在训练初期出现不稳定的情况,并且有助于加速模型的收敛速度。通常情况下,warmup 的 epoch 数目设置在总 epoch 数的 5% 到 20% 之间比较合适。

    

代码实现 

在 PyTorch 中,可以通过自定义一个学习率调度器类(LR Scheduler)来实现学习率 warmup 的功能。下面是一个简单的 LR Scheduler 实现(衰减方式为指数衰减),其中包括一个 warmup 参数来控制 warmup 的迭代次数:

import math
import torch.optim as optim

class WarmupLR(optim.lr_scheduler._LRScheduler):
    def __init__(self, optimizer, warmup_steps, gamma, last_epoch=-1):
        """
        optimizer: 优化器对象
        warmup_steps: 学习率线性增加的步数
        gamma: 学习率下降系数
        last_epoch: 当前训练轮数
        """
        self.warmup_steps = warmup_steps
        self.gamma = gamma
        super().__init__(optimizer, last_epoch)

    def get_lr(self):
        if self.last_epoch < self.warmup_steps:
            # 学习率线性增加
            return [base_lr * (self.last_epoch + 1) / self.warmup_steps for base_lr in self.base_lrs]
        else:
            # 学习率按指数衰减
            return [base_lr * math.exp(-(self.last_epoch - self.warmup_steps + 1) * self.gamma) for base_lr in self.base_lrs]

在这个 LR Scheduler 中,optim.lr_scheduler._LRScheduler 是 PyTorch 内置的学习率调度器类的基类,我们继承它并在 get_lr() 方法中实现了 warmup 的逻辑。具体来说,当 last_epoch 小于 warmup_steps 时,我们将学习率线性逐步增加到原始学习率的最大值,否则按照指数方式衰减学习率。这个 LR Scheduler 可以作为一个参数传入 PyTorch 中的优化器中,如下所示: 

optimizer = optim.Adam(model.parameters(), lr=1e-4)
lr_scheduler = WarmupLR(optimizer, warmup_steps=1000)
for epoch in range(num_epochs):
    for batch_idx, (data, target) in enumerate(train_loader):
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()
        lr_scheduler.step()

以上代码可以按需修改。

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值