一、介绍

warmup顾名思义就是热身,在刚刚开始训练时以很小的学习率进行训练,使得网络熟悉数据,随着训练的进行学习率慢慢变大,到了一定程度,以设置的初始学习率进行训练,接着过了一些inter后,学习率再慢慢变小;学习率变化:上升——平稳——下降;

具体步骤:

启用warm up,设置warm up setp(一般等于epoch*inter_per_epoch),当step小于warm up setp时,学习率等于基础学习率×(当前step/warmup_step),由于后者是一个小于1的数值,因此在整个warm up的过程中,学习率是一个递增的过程!当warm up结束后,学习率以基础学习率进行训练,再学习率开始递减

二、使用场景

1、当网络非常容易nan时候,采用warm up进行训练,可使得网络正常训练;

2、如果训练集损失很低,准确率高,但测试集损失大,准确率低,可用warm up;具体可看:https://blog.csdn.net/u011995719/article/details/77884728

三、有效原因

这个问题目前还没有被充分证明,目前效果有:

  • 有助于减缓模型在初始阶段对mini-batch的提前过拟合现象,保持分布的平稳
  • 有助于保持模型深层的稳定性

在训练期间有如下情况:

1、在训练的开始阶段,模型权重迅速改变

2、mini-batch size较小,样本方差较大

第一种因为刚刚开始的时候,模型对数据的“分布”理解为零,或者是说“均匀分布”(初始化一般都是以均匀分布来初始化);

在第一轮训练的时候,每个数据对模型来说都是新的,随着训练模型会很快地进行数据分布修正,这时候学习率就很大,很有可能在刚刚开始就会导致过拟合,后期需要要通过多轮训练才能拉回来。当训练了一段时间(比如两轮、三轮)后,模型已经对每个数据过几遍了,或者说对当前的batch而言有了一些正确的先验,较大的学习率就不那么容易会使模型学偏,所以可以适当调大学习率。这个过程就也就是warmup。

那后期为什么学习率又要减小呢?这就是我们正常训练时候,学习率降低有助于更好的收敛,当模型学习到一定的 程度,模型的分布就学习的比较稳定了。如果还用较大的学习率,就会破坏这种稳定性,导致网络波动比较大,现在已经十分接近了最优了,为了靠近这个最优点,我就就要很小的学习率

第二原因:如果有mini-batch内的数据分布方差特别大,这就会导致模型学习剧烈波动,使其学得的权重很不稳定,这在训练初期最为明显,最后期较为缓解

所以由于上面这两个原因,我们不能随便成倍减少学习率;

在resnet文章中,有说到如果一开始就用大的学习率,虽然最终会收敛,但之后测试准确率还是不会提高;如果用了warmup,在收敛后还能有所提高。也就是说,用warm up和不用warm up达到的收敛点,对之后模型能够达到最优点有影响。这说明不用warm up收敛到的点比用warm up收敛到的点更差。这也说明,如果刚刚开始学偏了的权重后面都拉不回来;

那么为什么以前神经网络没用warm up技巧呢?

主要原因是:

1、y以前网络不够大、不够深

2、数据集普遍较小

四、部分实现代码

1、tensorflow

if warmup:warmup_steps = int(batches_per_epoch * 5)warmup_lr = (initial_learning_rate * tf.cast(global_step, tf.float32) / tf.cast(warmup_steps, tf.float32))return tf.cond(global_step < warmup_steps, lambda: warmup_lr, lambda: lr)

或者 ,看代码来理解,这是摘抄的;

with tf.name_scope('learn_rate'):self.global_step = tf.Variable(1.0, dtype=tf.float64, trainable=False, name='global_step')warmup_steps = tf.constant(self.warmup_periods * self.steps_per_period,dtype=tf.float64, name='warmup_steps') # warmup_periods epochstrain_steps = tf.constant((self.first_stage_epochs + self.second_stage_epochs) * self.steps_per_period,dtype=tf.float64, name='train_steps')self.learn_rate = tf.cond(pred=self.global_step < warmup_steps,true_fn=lambda: self.global_step / warmup_steps * self.learn_rate_init,false_fn=lambda: self.learn_rate_end + 0.5 * (self.learn_rate_init - self.learn_rate_end) * (1 + tf.cos((self.global_step - warmup_steps) / (train_steps - warmup_steps) * np.pi)))global_step_update = tf.assign_add(self.global_step, 1.0)"""训练分为两个阶段,第一阶段里前面又划分出一段作为“热身阶段”:热身阶段:learn_rate = (global_step / warmup_steps) * learn_rate_init其他阶段:learn_rate_end + 0.5 * (learn_rate_init - learn_rate_end) * (1 + tf.cos((global_step - warmup_steps) / (train_steps - warmup_steps) * np.pi))

2、pytorch

该项目中有pytorch实现

https://github.com/ruinmessi/ASFF/issues/65

正文

1. 背景

学习率是最影响性能的超参数之一,如果我们只能调整一个超参数,那么最好的选择就是它。 其实在我们的大多数情况下,遇到 loss 变成 NaN 的情况大多数是由于学习率选择不当引起的

2. 学习率的设置 — “不同阶段不同值:上升 -> 平稳 -> 下降”

由于神经网络在刚开始训练的时候是非常不稳定的,因此刚开始的学习率应当设置得很低很低,这样可以保证网络能够具有良好的收敛性。但是较低的学习率会使得训练过程变得非常缓慢,因此这里会采用以较低学习率逐渐增大至较高学习率的方式实现网络训练的“热身”阶段,称为 warmup stage。但是如果我们使得网络训练的 loss 最小,那么一直使用较高学习率是不合适的,因为它会使得权重的梯度一直来回震荡,很难使训练的损失值达到全局最低谷。这个代码采用了 cosine 的衰减方式,这个阶段可以称为 consine decay stage。

3. tf-yolov3作者的相关源码

with tf.name_scope('learn_rate'):self.global_step = tf.Variable(1.0, dtype=tf.float64, trainable=False, name='global_step')warmup_steps = tf.constant(self.warmup_periods * self.steps_per_period,dtype=tf.float64, name='warmup_steps') # warmup_periods epochstrain_steps = tf.constant((self.first_stage_epochs + self.second_stage_epochs) * self.steps_per_period,dtype=tf.float64, name='train_steps')self.learn_rate = tf.cond(pred=self.global_step < warmup_steps,true_fn=lambda: self.global_step / warmup_steps * self.learn_rate_init,false_fn=lambda: self.learn_rate_end + 0.5 * (self.learn_rate_init - self.learn_rate_end) * (1 + tf.cos((self.global_step - warmup_steps) / (train_steps - warmup_steps) * np.pi)))global_step_update = tf.assign_add(self.global_step, 1.0)"""训练分为两个阶段,第一阶段里前面又划分出一段作为“热身阶段”:热身阶段:learn_rate = (global_step / warmup_steps) * learn_rate_init其他阶段:learn_rate_end + 0.5 * (learn_rate_init - learn_rate_end) * (1 + tf.cos((global_step - warmup_steps) / (train_steps - warmup_steps) * np.pi))"""

学习率变化曲线:

4. 应用场景

(1)训练出现NaN:当网络非常容易nan时候,采用warm up进行训练,可使得网络正常训练;

(2)过拟合:训练集损失很低,准确率高,但测试集损失大,准确率低,可用warm up;具体可看: Resnet-18-训练实验-warm up操作

5. 应用原理/优势来源

这个问题目前还没有被充分证明,目前效果有:
(1)有助于减缓模型在初始阶段对mini-batch的提前过拟合现象,保持分布的平稳;
(2)有助于保持模型深层的稳定性。

在训练期间有如下情况:
(1)在训练的开始阶段,模型权重迅速改变;
(2)mini-batch size较小,样本方差较大。
分析:
(1)因为刚刚开始的时候,模型对数据的“分布”理解为零,或者是说“均匀分布”(初始化一般都是以均匀分布来初始化);在第一轮训练的时候,每个数据对模型来说都是新的,随着训练模型会很快地进行数据分布修正,这时候学习率就很大,很有可能在刚刚开始就会导致过拟合,后期需要要通过多轮训练才能拉回来。当训练了一段时间(比如两轮、三轮)后,模型已经对每个数据过几遍了,或者说对当前的batch而言有了一些正确的先验,较大的学习率就不那么容易会使模型学偏,所以可以适当调大学习率。这个过程就也就是warmup。
那后期为什么学习率又要减小呢?这就是我们正常训练时候,学习率降低有助于更好的收敛,当模型学习到一定的程度,模型的分布就学习的比较稳定了。如果还用较大的学习率,就会破坏这种稳定性,导致网络波动比较大,现在已经十分接近了最优了,为了靠近这个最优点,就要用很小的学习率了。
(2)如果有mini-batch内的数据分布方差特别大,这就会导致模型学习剧烈波动,使其学得的权重很不稳定,这在训练初期最为明显,最后期较为缓解。
所以由于上面这两个原因,我们不能随便成倍减少学习率
在resnet文章中,有说到如果一开始就用大的学习率,虽然最终会收敛,但之后测试准确率还是不会提高;如果用了warmup,在收敛后还能有所提高。也就是说,用warm up和不用warm up达到的收敛点,对之后模型能够达到最优点有影响。这说明不用warm up收敛到的点比用warm up收敛到的点更差。这也说明,如果刚刚开始学偏了的权重后面都拉不回来。

那么为什么以前神经网络没用warm up技巧呢?
主要原因是:
(1)以前的网络不够大、不够深;
(2)数据集普遍较小。

深度学习 warmup 策略相关推荐

  1. 证券投资深度学习_基于风险中性的深度学习选股策略

    今天我们为大家带来最新的研报内容,来自广发证券金工团队的<风险中性的深度学习选股策略>.下面让我们来一起学习吧!https://mp.weixin.qq.com/s?__biz=MzAxN ...

  2. 深度学习分布式策略优化、显存优化、通信优化、编译优化综述

    综述 因为我个人最近在从事可能是AI领域对性能挑战最大的方向,自动驾驶领域,所以对整个深度学习训练的优化尤为关注,最近一直在学习相关内容,谨以此篇文章做一个总结. 我一直很看好深度学习训练优化这个方向 ...

  3. 风险中性的深度学习选股策略

    一.数据驱动型机器学习模型的问题 目前流行的机器学习方法,包括深度学习,大部分是数据驱动的方法,通过对训练集数据学习来提取知识.数据驱动型机器学习方法应用成功的前提是:从训练集数据中学习到的" ...

  4. [ 深度学习 ] —— 优化策略:(1) Label Smoothing Regularization(LSR)

    参考文献:本文第七节 转载链接:https://blog.csdn.net/lqfarmer/article/details/74276680

  5. 深度学习通用策略:SGD优化方法总结

    转载:https://zhuanlan.zhihu.com/p/22252270 (标题不能再中二了)本文仅对一些常见的优化方法进行直观介绍和简单的比较,各种优化方法的详细内容及公式只好去认真啃论文了 ...

  6. 吴恩达CS 230深度学习课开学了!秋季视频全部上线,课件小抄应有尽有

    方栗子 发自 凹非寺  量子位 出品 | 公众号 QbitAI 清明假期过去,又可以开始学习了.耶. 正好,吴恩达老师在斯坦福讲的深度学习课CS230,春季4月2日刚刚开课,全套PPT已上线.跟着,秋 ...

  7. 深度学习 --- 优化入门六(正则化、参数范数惩罚L0、L1、L2、Dropout)

    前面几节分别从不同的角度对梯度的优化进行梳理,本节将进行正则化的梳理,所谓正则化,简单来说就是惩罚函数,在机器学习中的SVM中引入拉格朗日乘子法即引入惩罚项解决了约束问题,在稀疏自编码器中我们引入了惩 ...

  8. 解密阿里云大规模深度学习性能优化实践

    云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 作者 | 阿里云异构计算AI加速负责人 游亮 近日,斯坦福大学公布了最新的 DAWNBench 深 ...

  9. 自动驾驶中图像与点云融合的深度学习研究综述

    Deep Learning for Image and Point Cloud Fusion in Autonomous Driving: A Review IEEE TRANSACTIONS ON ...

最新文章

  1. 新手提升JSP技术能力的一点建议-调试篇
  2. 高通固件解包IPQ6000固件解包
  3. Python学习系列day2-python基础
  4. 查询优化器内核剖析第一篇
  5. MFC六大核心机制之五、六:消息映射和命令传递
  6. linux文件系统挂载不上,nfs文件系统在linux下挂载不上的解决办法
  7. Springboot配置fastjson开发
  8. 蓝桥杯入门训练Fibonacci数列
  9. 流程管理系统成功实施的六个步骤
  10. 2017ICPC北京 J:Pangu and Stones(区间DP)
  11. 360浏览器:中国为什么没有自主研发的浏览器内核?
  12. 交换局域网(链路层+以太网+交换机)
  13. 关于断点续传的那些事
  14. 推荐一些小而美的互联网公司
  15. 字符编码发展史和密码算法那些事儿
  16. (已解决)spring-boot maven报错Project 'org.springframework.boot:spring-boot-starter-parent:2.2.0.RELEAS
  17. 王欣的哲学逻辑与产品猜想
  18. 浙江大学数据结构第一讲:1.1什么是数据结构
  19. 6-1 插入法建立有序链表
  20. 第12届全国大学生信息安全竞赛线上初赛Web场景 Write Up

热门文章

  1. 【word】word表格不自动跨页,文字显示不全
  2. 最长上升子序列(c++图文详解)
  3. QT学习之路2 学习笔记
  4. 10-4 查找至少选修两门课程的学生学号
  5. 攻防世界 web webshell
  6. 了解工业能源统计的含义、分级以及分类
  7. Nodejs卸载、安装及环境配置
  8. 青岛大学计算机小姐姐,青岛大学举牌校花一夜爆红,评论区留下脏话:见不得别人好是病!...
  9. 模型选择准则之AIC和BIC
  10. 2022年度前8强20强|香港科大-越秀集团百万奖金国际创业大赛·2022年度总决赛第一轮评审结果公布!...