其他分享
首页 > 其他分享> > 学习率预热linear warmup【转载以学习、回忆】

学习率预热linear warmup【转载以学习、回忆】

作者:互联网

来源链接:https://mp.weixin.qq.com/s?__biz=MzAxOTU5NTU4MQ==&mid=2247488715&idx=1&sn=2acedd3705b27e5b9e259485f2dd9653&chksm=9bc5fc99acb2758f82b638d03ace8993b5b7374c0162020032e61e144ed86dc5a72082078a91&scene=178&cur_album_id=1783545951672958984#rd

来源公众号:ChallengeHub  

1什么是warmup

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

 

 

 2 Warmup的作用

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

3 为什么warmup有效

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

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

从训练效果可以体现为:

4 如何使用

from transformers import AdamW, 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()

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

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

6 其他策略

标签:预热,linear,warmup,len,学习,num,steps
来源: https://www.cnblogs.com/nlpers/p/16095131.html