Warmup预热学习率「建议收藏」

Warmup预热学习率「建议收藏」学习率是神经网络训练中最重要的超参数之一,针对学习率的优化方式很多,Warmup是其中的一种(一)什么是Warmup?Warmup是在ResNet论文中提到的一种学习率预热的方法,它在训练开始的时候先选择使用一个较小的学习率,训练了一些epoches或者steps(比如4个epoches,10000steps),再修改为预先设置的学习率来进行训练.(二)为什么使用Warmup?由于刚开始…

大家好,又见面了,我是你们的朋友全栈君。

学习率是神经网络训练中最重要的超参数之一,针对学习率的优化方式很多,Warmup是其中的一种
(一)、什么是Warmup?
Warmup是在ResNet论文中提到的一种学习率预热的方法,它在训练开始的时候先选择使用一个较小的学习率,训练了一些epoches或者steps(比如4个epoches,10000steps),再修改为预先设置的学习来进行训练。

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

E x a m p l e Example Example:Resnet论文中使用一个110层的ResNet在cifar10上训练时,先用0.01的学习率训练直到训练误差低于80%(大概训练了400个steps),然后使用0.1的学习率进行训练。

(三)、Warmup的改进
(二)所述的Warmup是constant warmup,它的不足之处在于从一个很小的学习率一下变为比较大的学习率可能会导致训练误差突然增大。于是18年Facebook提出了gradual warmup来解决这个问题,即从最初的小学习率开始,每个step增大一点点,直到达到最初设置的比较大的学习率时,采用最初设置的学习率进行训练。

1.gradual warmup的实现模拟代码如下:

"""
Implements gradual warmup, if train_steps < warmup_steps, the
learning rate will be `train_steps/warmup_steps * init_lr`.
Args:
    warmup_steps:warmup步长阈值,即train_steps<warmup_steps,使用预热学习率,否则使用预设值学习率
    train_steps:训练了的步长数
    init_lr:预设置学习率
"""
import numpy as np
warmup_steps = 2500
init_lr = 0.1  
# 模拟训练15000步
max_steps = 15000
for train_steps in range(max_steps):
    if warmup_steps and train_steps < warmup_steps:
        warmup_percent_done = train_steps / warmup_steps
        warmup_learning_rate = init_lr * warmup_percent_done  #gradual warmup_lr
        learning_rate = warmup_learning_rate
    else:
        #learning_rate = np.sin(learning_rate)  #预热学习率结束后,学习率呈sin衰减
        learning_rate = learning_rate**1.0001 #预热学习率结束后,学习率呈指数衰减(近似模拟指数衰减)
    if (train_steps+1) % 100 == 0:
             print("train_steps:%.3f--warmup_steps:%.3f--learning_rate:%.3f" % (
                 train_steps+1,warmup_steps,learning_rate))

2.上述代码实现的Warmup预热学习率以及学习率预热完成后衰减(sin or exp decay)的曲线图如下:
sin decay and exp decay

(四)总结
使用Warmup预热学习率的方式,即先用最初的小学习率训练,然后每个step增大一点点,直到达到最初设置的比较大的学习率时(注:此时预热学习率完成),采用最初设置的学习率进行训练(注:预热学习率完成后的训练过程,学习率是衰减的),有助于使模型收敛速度变快,效果更佳。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/132203.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • Linux 镜像文件下载「建议收藏」

    Linux 镜像文件下载「建议收藏」CENTOS简介和镜像下载一、CENTOS下载各国镜像地址http://www.centos.org/modules/tinycontent/index.php?id=32二、中国大陆镜像部分ChinaCMCCTaianBranch(泰安移动)http://mirrors.ta139.com/centos/ChinaNetEase(163网

    2022年6月28日
  • 1024,一封写给CSDN家园Python初学者的信 | Python初级、中级、高级学习路线

    1024,一封写给CSDN家园Python初学者的信 | Python初级、中级、高级学习路线又是一年1024,祝所有程序员节日快乐,健康开心,祝CSDN越来越好。转眼,已经在CSDN分享了十多年博客,感谢大家的陪伴和祝福,在这里我与许多人成为了朋友,感恩。非常遗憾,这次没能去长沙岳麓书院见很多大佬和博友,下次有机会一定去。我也会继续加油,分享更好更系统的文章,帮助更多初学者。总之,感恩大家能一起在CSDN相遇,相见,相知,我们相约在这里分享一辈子,感恩同行!

    2022年4月29日
  • java遍历list对象集合_java遍历List集合的方法有哪些[通俗易懂]

    本文为大家分享了有序集合List中的四种遍历方式,希望能对大家有所帮助。(学习视频分享:java课程)先创建一个Student类,用来创建对象,并提供有参和无参构造方法。packagelesson1;publicclassStudent{Stringname;intage;publicStringgetName(){returnname;}publicvoidsetName…

    2022年4月13日
  • 工具说明书格式_lastingfor什么药

    工具说明书格式_lastingfor什么药下载安装:Downloads-DBBrowserforSQLitehttps://sqlitebrowser.org/dl/下载64位安装版:DB.Browser.for.SQLite-3.12.2-win64.msiZip文件是免安装解压缩版,PortableApp是一个exe文件打包版。安装完,打开后是这个样子:点击上面红框处,新建一个database,选择路径,输入文件名,保存即可。在SQLite里,一个database就是一个后缀db的文…

    2022年9月8日
  • 《Java编程思想》笔记05——多态

    《Java编程思想》笔记05——多态

    2022年3月12日
  • c语言中static关键字用法详解

    c语言中static关键字用法详解概述static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护。但是对于c语言初学者,static由于使用灵活,并不容易掌握。本文就static在c语言中的应用进行总结,供参考使用。错漏之处,请不吝指正。在程序中使用static变量1.局部变量普通局部变量是再熟悉不过的变量了,在任何一个函数内部定义的变量(不加static修饰…

    2022年4月30日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号