深度学习学习率

news2024/11/18 7:43:32

目录

1 什么是学习率

2 学习率对网络的影响

3 学习率的设置 

3.1 分段常数衰减(Piecewise Decay)

3.2 指数衰减(Exponential Decay) 

3.3 自然指数衰减(Natural Exponential Decay)

3.4 多项式衰减(Polynomial Decay)

3.5 间隔衰减 (Step Decay) 

3.6 多间隔衰减(Multi Step Decay)

3.7 逆时间衰减(Inverse Time Decay)

3.8 Lambda衰减(Lambda Decay)

3.9 余弦衰减(Cosine Annealing Decay)

3.10 诺姆衰减(Noam Decay) 

3.11 loss自适应衰减(Reduce On Plateau)

3.12 线性学习率热身(Linear Warm Up)

4 pytorch优化器与学习率设置

5 Transformers之自定义学习率动态调整


        在我们刚刚接触深度学习时,对学习率只有一个很基础的认知,当学习率过大的时候会导致模型难以收敛,过小的时候会收敛速度过慢,其实学习率是一个十分重要的参数,合理的学习率才能让模型收敛到最小点而非局部最优点或鞍点。

1 什么是学习率

        学习率是训练神经网络的重要超参数之一,它代表在每一次迭代中梯度向损失函数最优解移动的步长,通常用 η 表示。它的大小决定网络学习速度的快慢。在网络训练过程中,模型通过样本数据给出预测值,计算代价函数并通过反向传播来调整参数。重复上述过程,使得模型参数逐步趋于最优解从而获得最优模型。在这个过程中,学习率负责控制每一步参数更新的步长。合适的学习率可以使代价函数以合适的速度收敛到最小值。

2 学习率对网络的影响

        梯度更新公式:

        根据上述公式我们可以看到,如果学习率 η 较大,那么参数的更新速度就会很快,可以加快网络的收敛速度,但如果学习率过大,可能会导致参数在最优解附近震荡,代价函数难以收敛,甚至可能会错过最优解,导致参数向错误的方向更新,代价函数不仅不收敛反而可能爆炸(如图1a所示)。

        如果学习率 η 较小,网络可能不会错过最优点,但是网络学习速度会变慢。同时,如果学习率过小,则很可能会陷入局部最优点(如图1b所示)。

        因此,只有找到合适的学习率,才能保证代价函数以较快的速度逼近全局最优解。

                  

        对于深度学习模型训练时,在梯度下降法中,固定学习率时,当到达收敛状态时,会在最优值附近一个较大的区域内摆动;而当随着迭代轮次的增加而减小学习率,会使得在收敛时,在最优值附近一个更小的区域内摆动。(之所以曲线震荡朝向最优值收敛,是因为在每一个mini-batch中都存在噪音)。如下图所示。

        

3 学习率的设置 

        设置学习率这个超参数总体上可以分为两种:人工调整和策略调整

        人工调整学习率一般是根据我们的经验值进行尝试,通常我们会尝试性的将初始学习率设为:0.1,0.01,0.001,0.0001等来观察网络初始阶段epoch的loss情况:

        如果训练初期loss出现梯度爆炸或NaN这样的情况(暂时排除其他原因引起的loss异常),说明初始学习率偏大,可以将初始学习率降低10倍再次尝试;
        如果训练初期loss下降缓慢,说明初始学习率偏小,可以将初始学习率增加5倍或10倍再次尝试;
        如果训练一段时间后loss下降缓慢或者出现震荡现象,可能训练进入到一个局部最小值或者鞍点附近。如果在局部最小值附近,需要降低学习率使训练朝更精细的位置移动;如果处于鞍点附件,需要适当增加学习率使步长更大跳出鞍点。
        如果网络权重采用随机初始化方式从头学习,有时会因为任务复杂,初始学习率需要设置的比较小,否则很容易梯度飞掉带来模型的不稳定(振荡)。这种思想也叫做Warmup,在预热的小学习率下,模型可以慢慢趋于稳定,等模型相对稳定后再选择预先设置的学习率进行训练,使得模型收敛速度变得更快,模型效果更佳。
        如果网络基于预训练权重做的微调(finetune),由于模型在原数据集上已经收敛,有一个较好的起点,可以将初始学习率设置的小一些进行微调,比如0.0001。
        策略调整学习率包括固定策略的学习率衰减和自适应学习率衰减,由于学习率如果连续衰减,不同的训练数据就会有不同的学习率。当学习率衰减时,在相似的训练数据下参数更新的速度也会放慢,就相当于减小了训练数据对模型训练结果的影响。为了使训练数据集中的所有数据对模型训练有相等的作用,通常是以epoch为单位衰减学习率。

        在模型优化中,常用到的几种学习率衰减方法有:分段常数衰减、多项式衰减、指数衰减、自然指数衰减、余弦衰减、线性余弦衰减、噪声线性余弦衰减。

3.1 分段常数衰减(Piecewise Decay)

        分段常数衰减需要事先定义好的训练次数区间,在对应区间置不同的学习率的常数值,一般情况刚开始的学习率要大一些,之后要越来越小,要根据样本量的大小设置区间的间隔大小,样本量越大,区间间隔要小一点。下图即为分段常数衰减的学习率变化图,横坐标代表训练次数,纵坐标代表学习率。

        在不同的学习阶段指定不同的学习率,在每段内学习率相同。该过程可以举例说明为:

boundaries = [100, 200]  # 指定学习率改变的边界点为100和200
values = [1.0, 0.5, 0.1] # 指定不同区间下的学习率大小

learning_rate = 1.0  if epoch < 100 
learning_rate = 0.5  if 100 <= epoch < 200
learning_rate = 0.1  if epoch >= 200

3.2 指数衰减(Exponential Decay) 

        ​学习率随训练轮数成指数衰减,每次将当前学习率乘以给定的衰减率得到下一个学习率。指数衰减的公式可表示为:

       

         其中,𝑔𝑎𝑚𝑚𝑎为衰减率。

        这种衰减方式简单直接,收敛速度快,是最常用的学习率衰减方式,如下图所示,绿色的为学习率随训练次数的指数衰减方式,红色的即为分段常数衰减,它在一定的训练区间内保持学习率不变。

 3.3 自然指数衰减(Natural Exponential Decay)

        每次将当前学习率乘以给定的衰减率的自然指数得到下一个学习率,故而其收敛的速度更快,一般用于相对比较容易训练的网络,便于较快的收敛。其公式表达为:

 其中,𝑙𝑒𝑎𝑟𝑛𝑖𝑛𝑔_𝑟𝑎𝑡𝑒 为初始学习率,𝑔𝑎𝑚𝑚𝑎为衰减率,𝑒𝑝𝑜𝑐ℎ为训练轮数。

        下图为为分段常数衰减、指数衰减、自然指数衰减三种方式的对比图,红色的即为分段常数衰减图,阶梯型曲线。蓝色线为指数衰减图,绿色即为自然指数衰减图,很明可以看到自然指数衰减方式下的学习率衰减程度要大于一般指数衰减方式,有助于更快的收敛。

3.4 多项式衰减(Polynomial Decay)

        通过多项式衰减函数,学习率从初始值逐渐衰减至最低学习率。其中,参数 𝑐𝑦𝑐𝑙𝑒 代表学习率下降后是否重新上升。若 𝑐𝑦𝑐𝑙𝑒=𝑇𝑟𝑢𝑒,则学习率衰减至最低后会重新上升到一定值,再降低至最低学习率并进行循环。若 𝑐𝑦𝑐𝑙𝑒=𝐹𝑎𝑙𝑠𝑒,则学习率从初始值单调递减至最低值。

若 𝑐𝑦𝑐𝑙𝑒=𝑇𝑟𝑢𝑒,其计算公式为:

若 𝑐𝑦𝑐𝑙𝑒=𝐹𝑎𝑙𝑠𝑒,其计算公式为:

        其中,𝑙𝑒𝑎𝑟𝑛𝑖𝑛𝑔_𝑟𝑎𝑡𝑒 为初始学习率,𝑑𝑒𝑐𝑎𝑦_𝑠𝑡𝑒𝑝 为进行衰减的步长,𝑒𝑛𝑑_𝑙𝑟为最低学习率,𝑝𝑜𝑤𝑒𝑟为多项式的幂。

        如下图所示,红色线代表学习率降低至最低后,一直保持学习率不变进行更新,绿色线代表学习率衰减到最低后,又会再次循环往复的升高降低。

 

3.5 间隔衰减 (Step Decay) 

学习率按照指定的轮数间隔进行衰减,该过程可举例说明为:

learning_rate = 0.5 # 学习率初始值
step_size = 30      # 每训练30个epoch进行一次衰减
gamma = 0.1         # 衰减率


learning_rate = 0.5    if epoch < 30 
learning_rate = 0.05   if 30 <= epoch < 60
learning_rate = 0.005  if 60 <= epoch < 90
...

3.6 多间隔衰减(Multi Step Decay)

        学习率按特定间隔进行衰减,与间隔衰减的区别在于:间隔衰减的epoch间隔是单一且固定的,而多间隔衰减中的epoch间隔是预先指定的多间隔。该过程可举例说明为:

learning_rate = 0.5    # 学习率初始值
milestones = [30, 50]  # 指定轮数间隔
gamma = 0.1            # 衰减率

learning_rate = 0.5    if epoch < 30
learning_rate = 0.05   if 30 <= epoch < 50
learning_rate = 0.005  if 50 <= epoch
...

3.7 逆时间衰减(Inverse Time Decay)

        学习率大小与当前衰减次数成反比。其计算公式如下:

     

        其中,𝑙𝑒𝑎𝑟𝑛𝑖𝑛𝑔_𝑟𝑎𝑡𝑒为初始学习率,𝑔𝑎𝑚𝑚𝑎为衰减率,𝑒𝑝𝑜𝑐ℎ 为训练轮数。 

3.8 Lambda衰减(Lambda Decay)

        使用lambda函数来设置学习率,其中lambda函数通过epoch计算出一个因子,使用该因子乘以初始学习率。该衰减过程可参考如下例子:

learning_rate = 0.5                      # 学习率初始值
lr_lambda = lambda epoch: 0.95 ** epoch  # 定义lambda函数

learning_rate = 0.5              # 当epoch = 0时,0.5 * 0.95 ** 0 = 0.5
learning_rate = 0.475            # 当epoch = 1时,0.5 * 0.95 ** 1 = 0.475
learning_rate = 0.45125          # 当epoch = 2时,0.5 * 0.95 ** 2 = 0.45125
...

3.9 余弦衰减(Cosine Annealing Decay)

        使用 cosine annealing 的策略来动态调整学习率,学习率随step数变化成余弦函数周期变化。该方法为论文 SGDR:Stochastic Gradient Descent with Warm Restarts 中cosine annealing动态学习率。学习率调整公式为:

        其中,𝜂𝑚𝑎𝑥的初始值为学习率的初始值,𝑇𝑐𝑢𝑟是SGDR训练过程中的当前训练轮数。 

         如下图所示,红色即为标准的余弦衰减曲线,学习率从初始值下降到最低学习率后保持不变。蓝色的线是线性余弦衰减方式曲线,它是学习率从初始学习率以线性的方式下降到最低学习率值。绿色噪声线性余弦衰减方式。

3.10 诺姆衰减(Noam Decay) 

        诺姆衰减的计算方式如下:

        其中,𝑑𝑚𝑜𝑑𝑒𝑙 代表模型的输入、输出向量特征维度,𝑤𝑎𝑟𝑚𝑢𝑝_𝑠𝑡𝑒𝑝𝑠 为预热步数,𝑙𝑒𝑎𝑟𝑛𝑖𝑛𝑔_𝑟𝑎𝑡𝑒 为初始学习率。更多细节请参考 attention is all you need。

3.11 loss自适应衰减(Reduce On Plateau)

        当loss停止下降时,降低学习率。其思想是:一旦模型表现不再提升,将学习率降低 2-10 倍对模型的训练往往有益。此外,每降低一次学习率后,将会进入一个冷静期。在冷静期内不会监控loss变化也不会进行衰减。当冷静期结束后,会继续监控loss的上升或下降。

3.12 线性学习率热身(Linear Warm Up)

        线性学习率热身是一种学习率优化策略,在正常调整学习率前,先逐步增大学习率。

        当训练步数小于热身步数(warmup_steps)时,学习率 𝑙𝑟 按如下方式更新:

         

         当训练步数大于等于热身步数(warmup_steps)时,学习率 𝑙𝑟为:

        

        其中,𝑙𝑟为热身之后的学习率,𝑠𝑡𝑎𝑟𝑡_𝑙𝑟为学习率初始值,𝑒𝑛𝑑_𝑙𝑟为最终学习率,𝑒𝑝𝑜𝑐ℎ 为训练轮数。

4 pytorch优化器与学习率设置

pytorch优化器与学习率设置详解 - 知乎

torch.optim — PyTorch 2.0 documentation

torch.optim.lr_scheduler — PyTorch 2.0 documentation

5 Transformers之自定义学习率动态调整

Transformers之自定义学习率动态调整 - 知乎

参考

  • 学习率:https://paddlepedia.readthedocs.io/en/latest/tutorials/deep_learning/model_tuning/learning_rate.html
  • 图解 9 种Torch中常用的学习率调整策略:https://mp.weixin.qq.com/s/A-BkpToAr2ubhTnz_bvkpQ
  • 如何配置神经网络的学习率:https://blog.csdn.net/weixin_39653948/article/details/105962154
  • 炼丹手册——学习率设置:https://zhuanlan.zhihu.com/p/332766013
  • PyTorch优化器与学习率设置详解:https://zhuanlan.zhihu.com/p/435669796
  • Transformers之自定义学习率动态调整:https://zhuanlan.zhihu.com/p/466992867

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/563370.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年度鄂州中级工程师职称首次举行水测哟,甘建二告诉你

2023年鄂州中级工程师职称首次开始举行水测&#xff0c;以前都不是这个样子&#xff0c;鄂州算是职称评审也是有一个改革吧&#xff0c;关于鄂州中级职称申报有一些需要大家注意的东西&#xff0c;今天甘建二这边给大家讲解一下&#xff0c;希望对今年想要评职称的小伙伴有帮助…

新手如何学习挖漏洞?看这篇就够了【网络安全】

前言 有不少阅读过我文章的伙伴都知道&#xff0c;我从事网络安全行业已经好几年&#xff0c;积累了丰富的经验和技能。在这段时间里&#xff0c;我参与了多个实际项目的规划和实施&#xff0c;成功防范了各种网络攻击和漏洞利用&#xff0c;提高了安全防护水平。 也有很多小伙…

使用go语言构建区块链 Part2.工作量证明

英文源地址 简介 在上一篇文章中, 我们构建了一个非常简单的数据结构, 这是区块链数据库的本质.并且我们可以通过它们之间的链式关系来添加区块: 每个区块都链接到前一个区块.哎, 我们的区块链实现有一个重大缺陷: 向链中添加区块既容易又便捷. 区块链和比特币的关键之一是增…

pix2pixHD代码---readme

1&#xff1a;基础配置 要求大于等于11G的显卡&#xff0c;安装pytorch&#xff0c;下载代码。 2&#xff1a;测试 dataset文件中放的是一些例子&#xff0c;下载cityscape的预训练权重&#xff0c;放入到checkpoints文件夹下&#xff0c;测试模型。测试结果放在results文件夹…

【正点原子STM32连载】 第十八章 独立看门狗(IWDG)实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十八…

【Netty】Netty 架构设计(二)

文章目录 前言一、Selector 模型1.1 SelectableChannel1.2 Channel 注册到 Selector1.3 SelectionKey1.4 遍历 SelectionKey 二、事件驱动2.1 Channel2.2 回调2.3 Future2.4 事件及处理器 三、责任链模式3.1 责任链模式的优缺点3.2 ChannelPipeline3.3 将事件传递给下一个处理器…

从事软件测试2年跳槽4次,不给你涨薪真不怪老板……

前几天和朋友们聚餐&#xff0c;发现了一个有意思的现象。 所谓的聚餐其实就是大家对于工作生活的一个大型倒苦水现场。 最近工作太TM烦心了&#xff0c;越来越觉得没有意思了&#xff0c;感觉没啥前途&#xff0c;也不给人涨薪。 我也是&#xff0c;不仅工作压力大&#xff0…

华为云网站备案操作流程

目录 一、官方指引二、操作步骤1.操作场景2.前提条件3.操作步骤&#xff08;1&#xff09;下载华为云 APP&#xff08;2&#xff09;登录华为云 APP&#xff0c;在 “控制台” 中单击 “网站备案”&#xff0c;进入 APP 备案操作入口&#xff08;3&#xff09;验证备案类型&…

HarmonyOS低代码开发-在已有工程中添加Visual

使用低代码开发应用或服务有以下两种开发方式&#xff1a;创建一个支持低代码开发的新工程&#xff0c;开发应用或服务的UI界面。在已有工程中&#xff0c;创建Visual文件来开发应用或服务的UI界面。ArkTS工程和JS工程使用低代码的步骤相同&#xff0c;接下来以JS工程为例分别讲…

【LCD应用编程】练习一 —— 绘制点、线、矩形框

之前获取LCD屏幕参数信息时了解到&#xff0c;LCD屏是 FrameBuffer 设备&#xff0c;操作 FrameBuffer 设备 其实就是在读写 /dev/fb0 文件。除此之外&#xff0c;LCD屏上包含多个像素点&#xff0c;绘制点、线、矩形框本质是在修改这些像素点的颜色。 目录 1、定义 lcd_color…

Vulkan Tutorial 4

11 framebuffer 我们已经将渲染传递设置为期望一个与交换链图像格式相同的单一帧缓冲&#xff0c;但我们还没有实际创建任何图像。 在渲染过程创建期间指定的附件通过将它们包装到一个VkFramebuffer对象中来绑定。帧缓冲区对象引用 VkImageView代表附件的所有对象。 std::ve…

SSH和SFTP是否相同

SSH和SFTP是否相同&#xff1f;SSH和SFTP是经典的对。在确保通信安全方面&#xff0c;它们交织在一起&#xff0c;尽管它们具有类似的功能&#xff0c;但它们并不是一回事。那么&#xff0c;它们之间有什么区别&#xff1f;请仔细阅读&#xff0c;找出答案。 什么是SSH&#x…

Java使用xlsx-streamer和EasyExcel解决读取超大excel数据时OutOfMemoryError的问题

解决读取超大excel数据时OutOfMemoryError的问题 前言关于Excel相关技术场景复现与问题定位问题代码读取50MB40万行数据读取84MB100万行数据 解决方案一&#xff1a;xlsx-streamer引入依赖&#xff1a;示例代码&#xff1a;加载数据效果耗费资源对比 解决方案二&#xff1a;Eas…

静态时序分析-时序检查

时序检查 一旦在触发器的时钟引脚上定义了时钟,便会自动推断出该触发器的建立时间和保持时间检查。时序检查通常会在多个条件下执行,通常,最差情况的慢速条件对于建立时间检查很关键,而最佳情况的快速条件对于保持时间检查很关键。 1.建立时间检查 在时钟的有效沿到达触…

9:02面试,9:08就出来了,这问的我毫无还手之力····

就离谱了&#xff0c;现在面试都这么难的了嘛 从外包出来&#xff0c;没想到算法死在另一家厂子 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到8月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直降30%&#x…

C语言代码封装MQTT协议报文,了解MQTT协议通信过程

【1】MQTT协议介绍 MQTT是一种轻量级的通信协议&#xff0c;适用于物联网&#xff08;IoT&#xff09;和低带宽网络环境。它基于一种“发布/订阅”模式&#xff0c;其中设备发送数据&#xff08;也称为 “发布”&#xff09;到经纪人&#xff08;称为MQTT代理&#xff09;&…

实现一个域名对应多个IP地址和DNS优缺点

DNS定义 DNS&#xff08;Domain Name System&#xff09;是因特网的一项服务&#xff0c;它作为域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便的访问互联网。 DNS作用 解析域名 人们在通过浏览器访问网站时只需要记住网站的域名即可&#xff0c;而不需…

清晰易懂IoC

1.IoC的目的在于让服务端的代码不需要改动 这段代码的问题在于&#xff0c;如果想要调用不同的dao层&#xff0c;就需要在服务端的代码Service层中进行改动 比如要调用dao1&#xff0c;Service层代码就是Dao dao1new Dao1() 比如要调用dao2&#xff0c;Service层代码就是Dao …

【JavaScript 递归】判断两个对象的键值是否完全一致,支持深层次查询,教你玩转JavaScript脚本语言

博主&#xff1a;東方幻想郷 Or _LJaXi 专栏分类&#xff1a;JavaScript | 脚本语言 JavaScript 递归 - 判断两个对象的键值 &#x1f315; 起因&#x1f313; 代码流程⭐ 第一步 判断两个对象的长度是否一致⭐ 第二步 循环 obj 进行判断两个对象⭐ 第三步 递归条件判断两个对象…

ChatGPT:你真的了解网络安全吗?浅谈攻击防御进行时之网络攻击新威胁

ChatGPT&#xff1a;你真的了解网络安全吗&#xff1f;浅谈网络安全攻击防御进行时 网络攻击新威胁1) 人工智能的应用2) 5G和物联网的崛起3) 云安全4) 社交工程的威胁 总结 ChatGPT&#xff08;全名&#xff1a;Chat Generative Pre-trained Transformer&#xff09;&#xff0…