【深度学习】学习率预热和学习率衰减 (learning rate warmup & decay)

这篇具有很好参考价值的文章主要介绍了【深度学习】学习率预热和学习率衰减 (learning rate warmup & decay)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

在深度学习中学习率这个超参数,在选取和调整都是有一定策略的,俗称炼丹。有时我们遇到 loss 变成 NaN 的情况大多数是由于学习率选择不当引起的。

神经网络在刚开始训练的时候模型的权重(weights)是随机初始化的,选择一个较大的学习率,可能带来模型的不稳定(振荡),因此刚训练时的学习率应当设置一个比较小的值,进而确保网络能够具有良好的收敛性。但较小的学习率会使得训练过程变得非常缓慢,于是learning rate warmup这个概念应运而生。

warmup采用以较低学习率逐渐增大至较高学习率的方式实现网络训练的“热身”阶段,随着训练的进行学习率慢慢变大,到一定程度后就可以设置的预设的学习率进行训练了,随着模型的拟合,需要的学习率也会越来越小,这时也会需要将学习率调小。学习率的warmup和学习率衰减可如下图走势:
【深度学习】学习率预热和学习率衰减 (learning rate warmup & decay)

warmup

Resnet论文中使用一个110层的ResNet在cifar10上训练时,先用0.01的学习率训练直到训练误差低于80%(大概训练了400个steps),然后使用0.1的学习率进行训练。其不足之处在于从一个很小的学习率一下变为比较大的学习率可能会导致训练误差突然增大。18年Facebook提出了gradual warmup来解决这个问题,即从最初的小学习率开始,每个step增大一点点,直到达到最初设置的比较大的学习率时,采用最初设置的学习率进行训练。有了这种思想后,也逐渐衍生了多种warmup方式。

在transformers有对应的warmup,如下:

  • get_constant_schedule_with_warmup,
  • get_cosine_schedule_with_warmup,
  • get_cosine_with_hard_restarts_schedule_with_warmup,
  • get_linear_schedule_with_warmup,
  • get_polynomial_decay_schedule_with_warmup

可通过from transformers import get_constant_schedule_with_warmup 方式导入。其中get_cosine_schedule_with_warmup在transformers官网中的学习率变化曲线如下:
【深度学习】学习率预热和学习率衰减 (learning rate warmup & decay)

pytorch中adjust learning rate

这部分内容参考了:pytorch之warm-up预热学习策略。pytorch官方文档:https://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate也介绍了几种根据训练epoch调整学习率的方法:torch.optim.lr_scheduler,如果想自定义warmup和decay的话,可以使用torch.optim.lr_scheduler.LambdaLR,书写方法可以参考transformers中的写法如下:

def get_cosine_schedule_with_warmup(
    optimizer: Optimizer, num_warmup_steps: int, num_training_steps: int, num_cycles: float = 0.5, last_epoch: int = -1
):
    """
    Create a schedule with a learning rate that decreases following the values of the cosine function between the
    initial lr set in the optimizer to 0, after a warmup period during which it increases linearly between 0 and the
    initial lr set in the optimizer.
    Args:
        optimizer ([`~torch.optim.Optimizer`]):
            The optimizer for which to schedule the learning rate.
        num_warmup_steps (`int`):
            The number of steps for the warmup phase.
        num_training_steps (`int`):
            The total number of training steps.
        num_cycles (`float`, *optional*, defaults to 0.5):
            The number of waves in the cosine schedule (the defaults is to just decrease from the max value to 0
            following a half-cosine).
        last_epoch (`int`, *optional*, defaults to -1):
            The index of the last epoch when resuming training.
    Return:
        `torch.optim.lr_scheduler.LambdaLR` with the appropriate schedule.
    """

    def lr_lambda(current_step):
        if current_step < num_warmup_steps:
            return float(current_step) / float(max(1, num_warmup_steps))
        progress = float(current_step - num_warmup_steps) / float(max(1, num_training_steps - num_warmup_steps))
        return max(0.0, 0.5 * (1.0 + math.cos(math.pi * float(num_cycles) * 2.0 * progress)))

    return LambdaLR(optimizer, lr_lambda, last_epoch)

源码链接:https://github.com/huggingface/transformers/blob/v4.25.1/src/transformers/optimization.py#L50

常用的有基于余弦退火的lr_scheduler:lr_scheduler.CosineAnnealingLR,

torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1)

以初始学习率为最大学习率,以 2 ∗ T _ m a x 2 ∗ T\_ {m a x} 2T_max 为周期,在一个周期内先下降,后上升。其中:

  • T_max(int):学习率下降到最小值时的epoch数,即当epoch=T_max时,学习率下降到余弦函数最小值,当epoch>T_max时,学习率将增大
  • eta_min(float):学习率的最小值,即在一个周期中,学习率最小会下降到 eta_min,默认值为 0
  • 上一个epoch数,这个变量用来指示学习率是否需要调整。当last_epoch符合设定的间隔时,就会对学习率进行调整;当为-1时,学习率设置为初始值。

更多的lr_schedule 可参考pytorch官方文档。

总结

当然,这种使用warmup和decay的learning rate schedule大多是在bert这种预训练的大模型的微调应用中遇见的。如果是做自然语言处理相关任务的,transformers已经封装了好几个带有warmup 和 decay的lr schedule。如果不是做研究的话,这些已经封装的lr schedule直接拿来用即可。当然也可以使用pytorch中的相关模块自定义。文章来源地址https://www.toymoban.com/news/detail-424547.html

到了这里,关于【深度学习】学习率预热和学习率衰减 (learning rate warmup & decay)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【机器学习】Feature scaling and Learning Rate (Multi-variable)

    导入所需的库 Size (sqft) Number of Bedrooms Number of floors Age of Home Price (1000s dollars) 952 2 1 65 271.5 1244 3 2 64 232 1947 3 2 17 509.8 … … … … … 利用以上表格中的数据构建一个线性模型,这样我们可以预测房屋的价格(1200 sqft, 3 bedrooms, 1 floor, 40 years old) 绘制每个房子特征与房屋价格之间

    2024年02月14日
    浏览(40)
  • 深度学习学习笔记——解决过拟合问题的方法:权重衰减和暂退法,与正则化之间的关系

    解决过拟合问题是机器学习和深度学习中关键的任务之一,因为它会导致模型在训练数据上表现良好,但在未见数据上表现不佳。以下是一些解决过拟合问题的常见方法: 增加训练数据 : 增加更多的训练数据可以帮助模型更好地捕捉数据的真实分布,减少过拟合的可能性。

    2024年02月09日
    浏览(49)
  • 深度学习|9.7迁移学习transfer learning

    迁移学习是指将针对某项任务学习到的知识应用到其他任务的问题解决中去。 可以下载别人训练好的网络,保留网络中训练好的参数(参数分两种,一种是人为设置好的超参数,另外一种是在训练过程中学习/调整到的参数) 注意的是,原先训练好的网络可能会有多个输出结

    2024年01月20日
    浏览(41)
  • 深度学习3. 强化学习-Reinforcement learning | RL

    强化学习是机器学习的一种学习方式,它跟监督学习、无监督学习是对应的。本文将详细介绍强化学习的基本概念、应用场景和主流的强化学习算法及分类。 目录 什么是强化学习? 强化学习的应用场景 强化学习的主流算法 强化学习(reinforcement learning) 强化学习并不是某一种

    2024年02月11日
    浏览(37)
  • 机器学习 深度学习资料 资源machine learning

    Kaggle入门,看这一篇就够了 - 知乎 (zhihu.com) https://zhuanlan.zhihu.com/p/25686876 day1-1.什么是机器学习_哔哩哔哩_bilibili day1-1.什么是机器学习是10天学会机器学习从入门到深度学习的第1集视频,该合集共计62集,视频收藏或关注UP主,及时了解更多相关视频内容。 https://www.bilibili.com

    2024年02月21日
    浏览(52)
  • 【深度学习】自监督学习详解(self-supervised learning)

    深度学习被分为:监督学习,无监督学习和自监督学习。 监督学习近些年获得了巨大的成功,但是有如下的缺点: 1.人工标签相对数据来说本身是稀疏的,蕴含的信息不如数据内容丰富; 2.监督学习只能学到特定任务的知识,不是通用知识,一般难以直接迁移到其他任务中。

    2024年02月07日
    浏览(48)
  • 可信深度学习Trustworthy Deep Learning相关论文

    Survey An Overview of Catastrophic AI Risks. [paper] Connecting the Dots in Trustworthy Artificial Intelligence: From AI Principles, Ethics, and Key Requirements to Responsible AI Systems and Regulation. [paper] A Survey of Trustworthy Federated Learning with Perspectives on Security, Robustness, and Privacy. [paper] Adversarial Machine Learning: A Systemati

    2024年02月13日
    浏览(37)
  • Scikit-Learn 和深度学习怎么选择

    大家好,今天我们要聊聊一个机器学习的话题:Scikit-Learn 和深度学习,到底哪一个更适合解决你的问题?我们先来看看这两种技术的异同点,然后再讲讲如何在实际问题中做出选择。 1.1 Scikit-Learn:传统机器学习的优秀代表 Scikit-Learn 是一个使用 Python 语言编写的开源机器学习

    2024年02月10日
    浏览(37)
  • AIGC实战——深度学习 (Deep Learning, DL)

    深度学习 ( Deep Learning , DL ) 是贯穿所有生成模型 ( Generative Model ) 的共同特征,几乎所有复杂的生成模型都以深度神经网络为核心,深度神经网络能够学习数据结构中的复杂关系,而不需要预先提取数据特征。在本节中,我们将介绍深度学习基本概念,并利用 Keras 构建深度神

    2024年02月08日
    浏览(41)
  • 深度剖析缓存相关问题:雪崩、穿透、预热、更新、降级

    目录 引言 1. 缓存雪崩 1.1 问题描述 1.2 解决方案 1.2.1 加锁防止并发重建缓存 2. 缓存穿透 2.1 问题描述 2.2 解决方案 2.2.1 布隆过滤器防止无效请求 3. 缓存预热 3.1 问题描述 3.2 分析与解决方案 3.2.1 定时任务预热缓存 4. 缓存更新 4.1 问题描述 4.2 分析与解决方案 4.2.1 主动更新缓存

    2024年01月23日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包