目录

  • 一、warmup定义
  • 二、为什么使用warmup
    • 2.1、理性分析
    • 2.2、感性分析
  • 三、常用的warmup
    • 3.1、Constant Warmup
    • 3.2、Linner Warmup
    • 3.3、Cosine Warmup
    • 3.4、Warmup的改进:gradual warmup
  • 四、PyTorch实现
  • 总结
  • Reference

学习率是模型训练中最重要的超参之一,针对学习率的优化有很多种方法,而warmup是其中重要的一种。

一、warmup定义

在模型训练之初选用较小的学习率,训练一段时间之后(如:10epoches或10000steps)使用预设的学习率进行训练。

二、为什么使用warmup

2.1、理性分析

  1. 因为模型的weights是随机初始化的,可以理解为训练之初模型对数据的“理解程度”为0(即:没有任何先验知识),在第一个epoches中,每个batch的数据对模型来说都是新的,模型会根据输入的数据进行快速调参,此时如果采用较大的学习率的话,有很大的可能使模型对于数据“过拟合”(“学偏”),后续需要更多的轮次才能“拉回来”;
  2. 当模型训练一段时间之后(如:10epoches或10000steps),模型对数据具有一定的先验知识,此时使用较大的学习率模型就不容易学“偏”,可以使用较大的学习率加速模型收敛;
  3. 当模型使用较大的学习率训练一段时间之后,模型的分布相对比较稳定,此时不宜从数据中再学到新特点,如果仍使用较大的学习率会破坏模型的稳定性,而使用小学习率更容易获取local optima。

2.2、感性分析

  1. 刚开始模型对数据完全不了解,这个时候步子太大,容易扯着dan,此时需要使用小学习率摸着石头过河;
  2. 对数据了解了一段时间之后,可以使用大学习率朝着目标大步向前;
  3. 快接近目标时,使用小学习率进行探索,此时步子太大,容易错过最近点;

三、常用的warmup

3.1、Constant Warmup

学习率从非常小的数值线性增加到预设值之后保持不变,其学习率的系数如下图所示:

3.2、Linner Warmup

学习率从非常小的数值线性增加到预设值之后,然后再线性减小。其学习率的系数如下图所示:

3.3、Cosine Warmup

学习率先从很小的数值线性增加到预设学习率,然后按照cos函数值进行衰减。其学习率系数如下图所示:

3.4、Warmup的改进:gradual warmup

constant warmup的不足之处在于从一个很小的学习率一下变为比较大的学习率可能会导致训练误差突然增大。于是18年Facebook提出了gradual warmup来解决这个问题,即从最初的小学习率开始,每个step增大一点点,直到达到最初设置的比较大的学习率时,采用最初设置的学习率进行训练。
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_stepswarmup_learning_rate = init_lr * warmup_percent_done  #gradual warmup_lrlearning_rate = warmup_learning_rateelse:#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))

四、PyTorch实现

以下是yolov3的PyTorch实现Constant Warmup的部分代码:

# 模型训练开始第一轮采用warmup训练 慢慢训练
lr_scheduler = None
if epoch == 1 and warmup is True:  # 当训练第一轮(epoch=1)时,启用warmup训练方式,可理解为热身训练warmup_factor = 1.0 / 1000warmup_iters = min(1000, len(data_loader) - 1)lr_scheduler = utils.warmup_lr_scheduler(optimizer, warmup_iters, warmup_factor)accumulate = 1  # 慢慢训练,每个batch都改变img大小,每个batch都改变权重

utils.warmup_lr_scheduler:

def warmup_lr_scheduler(optimizer, warmup_iters, warmup_factor):def f(x):"""根据step数返回一个学习率倍率因子  Constant Warmup"""if x >= warmup_iters:  # 当迭代数大于给定的warmup_iters时,倍率因子为1return 1alpha = float(x) / warmup_iters# 迭代过程中倍率因子从warmup_factor -> 1return warmup_factor * (1 - alpha) + alphareturn torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=f)

总结

很有用的调优方法,可以在yolo4中试试。

Reference

  1. 链接1: 原理.
  2. 链接2: 代码.

【trick 5】warmup —— 一种学习率调优方法相关推荐

  1. 深度学习技巧应用20-六大学习率调优方案的应用,并根据实际情况选出最优策略

    大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用20-六大学习率调优方案的应用,并根据实际情况选出最优策略.本文将具体介绍六大学习率调优方案的原理与公式,并详细给出可运行的代码,大家根据实际情 ...

  2. JVM内存调优原则及几种JVM内存调优方法

    JVM内存调优原则及几种JVM内存调优方法 1.堆大小设置. 2.回收器选择. 1.在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因 ...

  3. 一文详解超参数调优方法

    ©PaperWeekly 原创 · 作者|王东伟 单位|Cubiz 研究方向|深度学习 本文介绍超参数(hyperparameter)的调优方法. 神经网络模型的参数可以分为两类: 模型参数,在训练中 ...

  4. linux mysql数据库优化_MySQL_Linux下MySQL数据库性能调优方法,以下的环境具备一定的代表性 - phpStudy...

    Linux下MySQL数据库性能调优方法 以下的环境具备一定的代表性,可以说是中小企业一般配置和工作环境.希望通过本文能让大家理解Linux下MySQL数据库性能调优方法. 硬件准备环境: 硬盘: 1 ...

  5. 面向关系数据库的智能索引调优方法

    面向关系数据库的智能索引调优方法 人工智能技术与咨询 来源:<软件学报> ,作者邱 涛等 摘 要:数据库索引是关系数据库系统实现快速查询的有效方式之一.智能索引调优技术可以有效地对数据库实 ...

  6. Python的数据分析中超参数调优方法:网格搜索

    [小白从小学Python.C.Java] [Python全国计算机等级考试] [Python数据分析考试必会题] ● 标题与摘要 Python的数据分析中 超参数调优方法:网格搜索 ● 选择题 以下说 ...

  7. 透明大页相关内核参数_Alibaba Cloud Linux 2系统中与透明大页THP相关的性能调优方法...

    免责声明:本文档可能包含第三方产品信息,该信息仅供参考.阿里云对第三方产品的性能.可靠性以及操作可能带来的潜在影响,不做任何暗示或其他形式的承诺. 概述 本文主要介绍在Alibaba Cloud Li ...

  8. 【名说】DB2查询sql缓慢的调优方法

    [记一次DB2数据库sql调优] 调优方法:依赖DB2自身的命令db2advis 参考大佬的经验:前人经验直达车https://blog.csdn.net/weixin_33834137/articl ...

  9. 【Trick】调优方法warmup

    学习率是模型训练中最重要的超参之一,针对学习率的优化有很多种方法,而warmup是其中重要的一种. 先提供github库链接:https://github.com/ildoonet/pytorch-g ...

最新文章

  1. PyTorch模型的保存加载以及数据的可视化
  2. 思科模拟器。计算机网络实验之四:RIPv2配置
  3. 零基础自学java的难处_零基础自学Java 在学习中要注意哪些问题
  4. dll oem证书导入工具_技术干货 | 恶意代码分析之反射型DLL注入
  5. sklearn.decomposition.FastICA实现FastICA算法
  6. 程序员如何拓展知识面 推荐几个技术公众号
  7. torch.stack作用分析
  8. java 工厂模式的写法_设计模式-Java-简单工厂模式--BitmapFactory
  9. 从零开始学架构5 - 实战篇
  10. CCCC-GPLT L1-038. 新世界 团体程序设计天梯赛
  11. 蓝桥杯 ADV-20 算法提高 交换Easy
  12. SQL Server 网络协议和 TDS 端点
  13. Numpy的广播功能
  14. web安全day29:linux日志异地备份
  15. SilverLight中的基本图形(转)
  16. 18. JSON 操作
  17. 超详细的测试理论基础知识
  18. 体重测试仪软件,一键校准身高体重测量仪
  19. mac mojava 安装php56的正确姿势
  20. (Redis基础教程之八) 如何在Redis中管理Sets

热门文章

  1. 几种mos管驱动电路
  2. css+div实现导航栏
  3. 00012.01抽象类与抽象方法(abstract)
  4. 现代C语言程序设计之C语言概述
  5. 幼师计算机word,幼儿园大班老师教养笔记范文
  6. Django适配达梦数据库
  7. 数据的存储,大端存储和小端小端存储
  8. 在ALLEGRO中添加中文字体
  9. 数学建模算法学习笔记
  10. matlab生成向量和矩阵