聊一聊学习率预热linear warmup

什么是warmup

warmup是针对学习率learning rate优化的一种策略,主要过程是,在预热期间,学习率从0线性(也可非线性)增加到优化器中的初始预设lr,之后使其学习率从优化器中的初始lr线性降低到0。如下图所示:

warmup的作用

由于刚开始训练时,模型的权重(weights)是随机初始化的,此时若选择一个较大的学习率,可能带来模型的不稳定(振荡),选择Warmup预热学习率的方式,可以使得开始训练的几个epoch或者一些step内学习率较小,在预热的小学习率下,模型可以慢慢趋于稳定,等模型相对稳定后再选择预先设置的学习率进行训练,使得模型收敛速度变得更快,模型效果更佳。

为什么warmup有效

这个问题目前还没有被充分证明,下面是来自知乎的回答解释:

https://www.zhihu.com/question/338066667
从理论层面上可以解释为:

  • 有助于减缓模型在初始阶段对mini-batch的提前过拟合现象,保持分布的平稳
  • 有助于保持模型深层的稳定性

从训练效果可以体现为:

  • 一开始神经网络输出比较random,loss比较大,容易不收敛,因此用小点的学习率, 学一丢丢,慢慢涨上去。
  • 梯度偏离真正较优的方向可能性比较大,那就走短一点错了还可以掰回来。

如何使用warmup

  • 实例1:warm_up_ratio 设置预热步数
from transformers import AdanW, get_linear_schedule_with_warmup

optimizer = AdamW(model.parameters(), lr=lr, eps=adam_epsilon)
len_dataset = 3821 # 可以根据pytorch中的len(Dataset)计算
epoch = 30
batch_size = 32
total_steps = (len_dataset // batch_size) * epoch if len_dataset % batch_size = 0 else (len_dataset // batch_size + 1) * epoch # 每一个epoch中有多少个step可以根据len(DataLoader)计算:total_steps = len(DataLoader) * epoch

warm_up_ratio = 0.1 # 定义要预热的step
scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps = warm_up_ratio * total_steps, num_training_steps = total_steps)
......
optimizer.step()
scheduler.step()
optimizer.zero_grad()
  • 实例1:num_warmup_steps 设置预热步数
# training steps 的数量: [number of batches] x [number of epochs].
total_steps = len(train_dataloader) * epochs
 
# 设计 learning rate scheduler
scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps = 50, 
                                            num_training_steps = total_steps)

经验参数选择

一般可取训练steps的10%,参考BERT。这里可以根据具体任务进行调整,主要需要通过warmup来使得学习率可以适应不同的训练集合,另外我们也可以通过训练误差观察loss抖动的关键位置,找出合适的学习率

其他非线性warmp策略

def _get_scheduler(optimizer, scheduler: str, warmup_steps: int, t_total: int):
        """
        Returns the correct learning rate scheduler. Available scheduler: constantlr, warmupconstant, warmuplinear, warmupcosine, warmupcosinewithhardrestarts
        """
        scheduler = scheduler.lower()
        if scheduler == 'constantlr':
            return transformers.get_constant_schedule(optimizer)
        elif scheduler == 'warmupconstant':
            return transformers.get_constant_schedule_with_warmup(optimizer, num_warmup_steps=warmup_steps)
        elif scheduler == 'warmuplinear':
            return transformers.get_linear_schedule_with_warmup(optimizer, num_warmup_steps=warmup_steps, num_training_steps=t_total)
        elif scheduler == 'warmupcosine':
            return transformers.get_cosine_schedule_with_warmup(optimizer, num_warmup_steps=warmup_steps, num_training_steps=t_total)
        elif scheduler == 'warmupcosinewithhardrestarts':
            return transformers.get_cosine_with_hard_restarts_schedule_with_warmup(optimizer, num_warmup_steps=warmup_steps, num_training_steps=t_total)
        else:
            raise ValueError("Unknown scheduler {}".format(scheduler))

参考资料

  • sentence-transformers:https://github.com/UKPLab/sentence-transformers
  • https://blog.csdn.net/orangerfun/article/details/120400247
  • https://blog.csdn.net/hustqb/article/details/105741250
  • https://blog.csdn.net/sinat_36618660/article/details/99650804
<think>好的,用户遇到了导入错误“No module named 'torch_warmup_lr'”,需要解决这个问题。首先,我需要确认用户是否正确安装了该模块。常见的安装方法是通过pip安装,可能用户没有安装或者安装的版本不对。 接下来,用户可能使用的是第三方库,比如transformers,里面可能内置了类似的功能,比如get_linear_schedule_with_warmup,这可能不需要额外安装torch_warmup_lr。比如引用[2]和[3]提到的函数可能属于不同的库,比如Hugging Face的transformers库,所以用户可能混淆了模块来源。 然后,检查用户的代码是否正确引用了模块。如果用户尝试直接导入torch_warmup_lr,而实际上该模块不存在于PyTorch官方库中,可能需要安装第三方实现。比如,是否存在个非官方的库提供这个模块,用户需要正确安装它。 另外,用户可能参考了某些教程或文档,这些文档提到了使用torch_warmup_lr,但未正确说明安装步骤。需要建议用户检查文档,确认正确的安装命令,或者是否有替代方案。 最后,如果确实需要该模块,指导用户通过正确的渠道安装,比如从GitHub仓库克隆并安装,或者使用替代的预热学习率方法,如引用[2]提到的get_linear_schedule_with_warmup,这可能属于transformers库,需要安装该库。</think>### 解决Python导入torch_warmup_lr模块报错的方法 #### 步骤1:确认模块来源与安装情况 `torch_warmup_lr`并非PyTorch官方库的组成部分[^1]。首先需要判断该模块的来源: 1. **检查代码引用**:确认代码中是否通过`import torch_warmup_lr`直接调用 2. **验证安装命令**:尝试通过以下命令安装第三方实现: ```bash pip install torch-warmup-lr ``` 或从GitHub仓库安装: ```bash pip install git+https://github.com/用户名/仓库名.git ``` #### 步骤2:使用替代方案(推荐) PyTorch社区中广泛使用的预热学习率实现通常通过以下方式: 1. **Hugging Face Transformers库的集成方案**: ```python from transformers import get_linear_schedule_with_warmup scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps=50, num_training_steps=total_steps) ``` 需先安装库: ```bash pip install transformers ``` 2. **自定义Lambda函数**: ```python warmup_steps = 50 scheduler = torch.optim.lr_scheduler.LambdaLR( optimizer, lr_lambda=lambda step: min(1.0, step / warmup_steps) ) ``` #### 步骤3:检查环境配置 若仍需使用`torch_warmup_lr`: 1. 确认Python环境是否激活正确 2. 检查是否在虚拟环境中遗漏安装 3. 使用`pip list`命令查看已安装的包列表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值