专栏首页程序生活聊一聊学习率预热linear warmup

聊一聊学习率预热linear warmup

什么是warmup

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

image

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

参考资料

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://www.jianshu.com/u/261e23a40f71复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • warmup 预热学习率

    学习率是神经网络训练中最重要的超参数之一,针对学习率的优化方式很多,Warmup是其中的一种。

    狼啸风云
  • Warmup预热学习率「建议收藏」

    学习率是神经网络训练中最重要的超参数之一,针对学习率的优化方式很多,Warmup是其中的一种 (一)、什么是Warmup? Warmup是在ResNet论文...

    全栈程序员站长
  • 聊一聊大火的对比学习

    在之前的博客里,笔者介绍了在有监督任务(文本匹配)上,增加对比学习来提高模型性能的实验,而当时尝试后却发现,在新增了对比学习的任务后,模型的性能并没有得到对应的...

    NewBeeNLP
  • 聊一聊深度学习分布式训练

    在深度学习时代,训练数据特别大的时候想要单卡完成训练基本是不可能的。所以就需要进行分布式深度学习。在此总结下个人近期的研究成果,欢迎大佬指正。

    NewBeeNLP
  • 浅聊对比学习 (一)

    每天给你送来NLP技术干货! ---- ©作者 | 吴桐 研究方向 | 推荐系统 来自 | PaperWeekly 什么是对比学习? Metrics le...

    zenRRan
  • 谷歌工程师:聊一聊深度学习的weight initialization

    编者按:本文作者夏飞,清华大学计算机软件学士,卡内基梅隆大学人工智能硕士。现为谷歌软件工程师。作者授权雷锋网 AI 研习社发布。 ? █ TLDR (or th...

    AI研习社
  • 频率学派还是贝叶斯学派?聊一聊机器学习中的MLE和MAP

    作者:夏飞 Google | 软件工程师 量子位 已获授权编辑发布 转载请联系原作者 本文作者夏飞,清华大学计算机软件学士,卡内基梅隆大学人工智能硕士,现为谷歌...

    量子位
  • 经验分享 | 聊一聊我是如何学习网络安全的(入门阶段)~

    文字和视频具体哪个好,也是各说各有道理,但是我想说的是,你需要找到一个适合你自己的方法,这样可以让你成长的道路上少走一些弯路,找到适合自己的方法可以让你在学习的...

    Ms08067安全实验室
  • 学界 | Facebook 新研究:大批量SGD准确训练ImageNet仅需1小时

    选自arXiv 机器之心编译 参与:蒋思源 由于近来互联网数据越来越大,深度学习模型越来越复杂,执行训练的时间也越来长。因此近日 Facebook 提出了一种将...

    机器之心
  • Kaggle实战目标检测奇淫技巧合集

    本文来自52CV群友Spytensor参加Kaggle目标检测比赛的总结,作者是位数据竞赛爱好者,文章非常具有实战意义。欢迎收藏~

    OpenCV学堂
  • 深度学习优化器中的变形金刚:Ranger21

    论文题目:RANGER21: A SYNERGISTIC DEEP LEARNING OPTIMIZER 论文链接:https://arxiv.org/pdf...

    致Great
  • 关于warm up(transformers.get_linear_schedule_with_warmup)

    这里就不使用pytorch中的dataset和dataloader了,简单的模拟下:

    西西嘛呦
  • AI 黑玉断续膏: 自底向上的二维人体姿态估计

    大家好!此前我们介绍了二维人体姿态估计(2D Human Pose Estimation,以下简称2D HPE)的基本概念、常用数据集,以及自顶向下的2D HP...

    OpenMMLab 官方账号
  • MMPose | 关于自顶向下 2D HPE 算法的,全都在这里啦!

    2D Human Pose Estimation (以下简称 2D HPE )旨在从图像或者视频中预测人体关节点(或称关键点,比如头,左手,右脚等)的二维空间位...

    OpenMMLab 官方账号
  • 一张图聊聊监督学习流程 | 股神的故事 | 山人聊算法 | 1st

    山人今天开始将围绕机器智能的算法方面讲讲故事,主要涉及了建模的三要素:模型、策略、算法。这个坑很大,我尽自己最大的努力来填一填,争取用浅显易懂、...

    用户7623498
  • JMH 简单入门

    JMH 是 Java Microbenchmark Harness 的缩写。中文意思大致是 “JAVA 微基准测试套件”。首先先明白什么是“基准测试”。百度百科...

    KIWI
  • YOLO相关

    The size of tensor a (19) must match the size of tensor b (76) at non-singleton ...

    小锋学长
  • 这个缓存更新的套路你都知道吗?

    在上一篇文章中[常见面试题之缓存雪崩、缓存穿透、缓存击穿],忘记讲了一个概念——缓存预热,所以在这篇文章补充一下,开一个好头,预热嘛~~~。

    Golang梦工厂

扫码关注腾讯云开发者

领取腾讯云代金券