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

在深度学习中,学习率是训练模型的重要超参数。Warmup策略通过初期增加然后逐渐降低学习率来稳定训练过程并加速收敛。本文提供了一个PyTorch中实现Warmup和指数衰减的学习率调度器示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

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

        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()

以上代码可以按需修改。

PyTorch的warmup深度学习中是一种常用的优化技巧,用于在训练初期对学习率进行逐渐增加的过程,以帮助模型更好地收敛。 在深度学习中,学习率是一个重要的超参数,它决定了模型在每次参数更新时调整的步长大小。传统的学习率调度方法,如固定学习率或按照一定的策略进行衰减,可能会导致模型在初始阶段收敛缓慢。 而warmup则是通过在训练初期将学习率从较小的值逐渐增加到设定的初始学习率,然后再按照设定的策略进行衰减。这种策略可以帮助模型在训练初期更快地找到一个较好的参数空间,并进一步提高训练效果。 在PyTorch中,可以使用torch.optim.lr_scheduler模块中的LambdaLR或StepLR等调度器来实现warmup。具体操作是通过设置一个warmup_steps参数来指定预热的步数,在每个训练步骤中计算当前的学习率,并将其应用于优化器。 下面是一个示例代码片段,展示了如何使用PyTorch实现warmup: ```python import torch from torch.optim.lr_scheduler import LambdaLR # 定义优化器和模型 optimizer = torch.optim.SGD(model.parameters(), lr=0.1) scheduler = LambdaLR(optimizer, lr_lambda=lambda step: warmup_factor(step, warmup_steps)) def warmup_factor(step, warmup_steps): if step >= warmup_steps: return 1.0 else: return float(step) / float(warmup_steps) # 训练循环 for epoch in range(num_epochs): for step, (inputs, labels) in enumerate(train_loader): # 前向传播和反向传播 optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() # 更新学习率 scheduler.step() ``` 在上述示例中,我们通过定义一个warmup_factor函数来计算当前的学习率缩放因子。在每个训练步骤中,我们使用scheduler.step()来更新学习率,并在优化器中应用新的学习率。 需要注意的是,warmup_steps的具体取值需要根据具体的任务和模型进行调整,通常可以根据实验结果进行调优。 希望这个简单的解释对你有帮助!如果还有其他问题,请随时提问。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值