1. warmup的必要性

原理这部分转载自:
神经网络中 warmup 策略为什么有效;有什么理论解释么?

那么在什么时候可能不成立呢?论文[3]告诉我们有两种情况:

  • 在训练的开始阶段,模型权重迅速改变
  • mini-batch size较小,样本方差较大

第一种情况很好理解,可以认为,刚开始模型对数据的“分布”理解为零,或者是说“均匀分布”(当然这取决于你的初始化);在第一轮训练的时候,每个数据点对模型来说都是新的,模型会很快地进行数据分布修正,如果这时候学习率就很大,极有可能导致开始的时候就对该数据“过拟合”,后面要通过多轮训练才能拉回来,浪费时间。当训练了一段时间(比如两轮、三轮)后,模型已经对每个数据点看过几遍了,或者说对当前的batch而言有了一些正确的先验,较大的学习率就不那么容易会使模型学偏,所以可以适当调大学习率。这个过程就可以看做是warmup。那么为什么之后还要decay呢?当模型训到一定阶段后(比如十个epoch),模型的分布就已经比较固定了,或者说能学到的新东西就比较少了。如果还沿用较大的学习率,就会破坏这种稳定性,用我们通常的话说,就是已经接近loss的local optimal了,为了靠近这个point,我们就要慢慢来。

第二种情况其实和第一种情况是紧密联系的。在训练的过程中,如果有mini-batch内的数据分布方差特别大,这就会导致模型学习剧烈波动,使其学得的权重很不稳定,这在训练初期最为明显,最后期较为缓解(所以我们要对数据进行scale也是这个道理)。

这说明,在上面两种情况下,我们并不能单纯地成倍增长lr 。要么改变学习率增长方法,要么设法解决上面两个问题。

前面的两个问题都不是很好解决,于是更多的方法用在了学习率的调整上。

有趣的是,warmup在ResNet[4]中就已经提到了,原文说的是:

We further explore n = 18 that leads to a 110-layer ResNet. In this case, we find that the initial learning rate of 0.1 is slightly too large to start converging . So we use 0.01 to warm up the training until the training error is below 80% (about 400 iterations), and then go back to 0.1 and continue training.

在注释中说的是:

With an initial learning rate of 0.1, it starts converging (<90% error) after several epochs, but still reaches similar accuracy.

这两句话是说,如果一开始就用0.1,虽然最终会收敛,但之后acc还是不会提高(使用了pateaus schedule);如果用了warmup,在收敛后还能有所提高。也就是说,用warmup和不用warmup达到的收敛点,对之后模型能够达到的suboptimal有影响。这说明什么?这说明不用warmup收敛到的点比用warmup收敛到的点更差。这可以从侧面说明,一开始学偏了的权重后面拉都拉不回来……

从上图(b,c)可以看到,加了warmup增加了模型最后几层的相似性,这表明warmup可以避免FC层的不稳定的剧烈改变。从图一中可以看到,在有了warmup之后,模型能够学得更稳定。综上所述,如果来总结一下现在大batch size和大learning rate下的学习率变化和规律的话,可以认为,学习率是呈现“上升——平稳——下降”的规律,这尤其在深层模型和具有多层MLP层的模型中比较显著。如果从模型学习的角度来说,学习率的这种变化对应了模型“平稳——探索——平稳”的学习阶段。

2. Warmup可视化

说一百道一千直接上代码,可视化一下warmup中学习率随epoch变化的情况。这里直接上代码
Code:

import numpy as np
import matplotlib.pyplot as pltdef Warmup_poly():warm_start_lr = 1e-5warm_steps = 1000lr0 = 1e-2nsteps = 2000power = 0.9lrs = []# warmupwarm_factor = (lr0 / warm_start_lr) ** (1 / warm_steps)for i in range(warm_steps):warm_lr = warm_start_lr * warm_factor ** ilrs.append(warm_lr)# poly lrfor j in range(warm_steps, nsteps):lr = lr0 * (1 - (j - warm_steps) / (nsteps - warm_steps)) ** powerlrs.append(lr)lrs = np.array(lrs)plt.plot(lrs)plt.xlabel("Iters")plt.ylabel("lr")plt.show()if __name__ == "__main__":Warmup_poly()


可以看到学习率lr的变化就如前面所说:开始的时候小,而且变换缓慢,后续增大。

2. poly 学习率调整
我们画出整个训练过程中学习率lr的变化,warmup后,我们采用poly学习率的调整方案。学习率的变化公式为:

3. cosine学习率调整
学习率先从很小的数值线性增加到预设学习率,然后按照cos函数值进行衰减,学习率变化在中间比较快,两端变化缓慢。其学习率系数如下图所示。
Code:

def Warmup_cosine():warmup_start_lr = 1e-5warmup_factor = 1.0069316688warmup_steps = 1000nsteps = 4000base_lr = 0.01power = 0.9lrs = []for i in range(warmup_steps):lr = warmup_start_lr * (warmup_factor ** i)             # warm_factor = (base_lr / warmup_start_lr) ** (1 / warmup_steps)lrs.append(lr)for i in range(warmup_steps, nsteps):lr = base_lr * 0.5 * ( math.cos((i - warmup_steps) /(nsteps - warmup_steps) * math.pi) + 1)lrs.append(lr)lrs = np.array(lrs)# plotplt.plot(lrs)plt.xlabel("Iters")plt.ylabel("lr")plt.show()

reference

  1. https://www.zhihu.com/search?type=content&q=warmup
  2. https://blog.csdn.net/weixin_42990464/article/details/104640641
  3. https://blog.csdn.net/guzhao9901/article/details/114373603

【DL】——Warmup学习率调整策略相关推荐

  1. YOLOv5-优化器和学习率调整策略

    优化器和学习率调整策略 pytorch-优化器和学习率调整 这个链接关于优化器和学习率的一些基础讲得很细,还有相关实现代码 优化器 前向传播的过程,会得到模型输出与真实标签的差,我们称之为损失, 有了 ...

  2. PyTorch学习之六个学习率调整策略

    PyTorch学习率调整策略通过torch.optim.lr_scheduler接口实现.PyTorch提供的学习率调整策略分为三大类,分别是 a. 有序调整:等间隔调整(Step),按需调整学习率( ...

  3. 【深度学习】图解 9 种PyTorch中常用的学习率调整策略

    learning rate scheduling 学习率调整策略 01 LAMBDA LR 将每个参数组的学习率设置为初始lr乘以给定函数.当last_epoch=-1时,将初始lr设置为初始值. t ...

  4. PyTorch框架学习十四——学习率调整策略

    PyTorch框架学习十四--学习率调整策略 一._LRScheduler类 二.六种常见的学习率调整策略 1.StepLR 2.MultiStepLR 3.ExponentialLR 4.Cosin ...

  5. Pytorch —— 学习率调整策略

    1.为什么要调整学习率 学习率控制梯度更新的快慢,在训练中,开始时的学习率比较大,梯度更新步伐比较大,后期时学习率比较小,梯度更新步伐比较小. 梯度下降:wi+1=wi−g(wi)w_{i+1}=w_ ...

  6. pytorch优化器学习率调整策略以及正确用法

    优化器 optimzier优化器的作用:优化器就是需要根据网络反向传播的梯度信息来更新网络的参数,以起到降低loss函数计算值的作用. 从优化器的作用出发,要使得优化器能够起作用,需要主要两个东西: ...

  7. keras train_on_batch详解(train_on_batch的输出输入详解,train_on_batch多GPU训练详解,自定义学习率调整策略)

    利用 train_on_batch 精细管理训练过程 大部分使用 keras 的同学使用 fit() 或者 fit_generator() 进行模型训练, 这两个 api 对于刚接触深度学习的同学非常 ...

  8. 【PyTorch】crnn-finetune模型学习率调整策略

    1. 网络模型 2.不同层设置不同学习率 这里以adam优化器为例 #不同层设置不同的学习率 train_params = list(map(id,crnn.rnn.parameters())) #2 ...

  9. 系统学习Pytorch笔记七:优化器和学习率调整策略

    Pytorch官方英文文档:https://pytorch.org/docs/stable/torch.html? Pytorch中文文档:https://pytorch-cn.readthedocs ...

最新文章

  1. 远看像乱序执行,近看是内存屏障的 BUG 是如何解决的?
  2. php打印从1到1000,输入一个链表的头节点,从尾到头打印每个节点的值,利用PHP如何实现?...
  3. Spark2.1.0分布式集群安装
  4. 【深度学习】常见优化器的PyTorch实现
  5. php SqlServer 中文汉字乱码
  6. poj 1064 Cable master
  7. BZOJ4428 : [Nwerc2015]Debugging调试
  8. 关于Go语言,你不得不知的并发模式
  9. 解决清除浮动的最佳办法
  10. 淘宝类目 API数据接口
  11. 使用Tushare进行公司数据分析
  12. theano 全连接代码
  13. python爬虫-京东商品详情爬取
  14. Java中的注解(Annotation)处理器解析
  15. LSMW 批量更改BOM 成本核算标识相关标识 特殊处理
  16. 软碟通 (UltraISO)制作启动盘
  17. 鸟哥的Linux私房菜(基础班)第八章学习笔记
  18. 【漏洞复现】永恒之蓝 MS17-010 远程溢出漏洞(CVE-2017-0143)
  19. HTML知识点总结还涉及一些subline的基本操作(有很多不足,现为初学者,以后补充)
  20. 001初学java笔记20211005

热门文章

  1. Spring Boot+Vue项目打包部署
  2. 学网络安全需要什么基础?
  3. Java中boolean型变量的默认值问题
  4. luoguP1888 【三角函数】
  5. windows查看进程及杀死进程
  6. latex怎样让题号顶格_latex proof顶格
  7. 比ping更强大的fping
  8. 前后端微信小程序开发
  9. mysql 日期group_MySql 使用GROUP BY 按照日期分组统计
  10. 服务降级(服务回退)