背景介绍

在神经网络训练的过程中,一个需要调节的非常关键的超参数就是学习率。合理的学习率的设置决定了模型训练的精度和效率。学习率设置的过大,模型可能很难收敛,设置的过小,则参数更新过于缓慢,因此模型训练的会比较慢,需要更多轮的迭代才能达到与合理的学习率在更少的迭代轮数上取得相同的效果。我们遇到的主要问题有两个:一个是初始学习率该怎么设置,另一个是在模型训练的过程中学习率该怎样变化才能使得训练的模型更优。目前的一些主流的方法,比如随机梯度下降(SGD),可以设置一个参数,使得学习率随着模型的训练而下降,一直降到一个非常小的值。但是这样的话,还是有可能会遇到模型收敛到一个局部最优点,或者鞍点上。本文将介绍一种周期性学习率的技术来解决上面的第二个问题。第一个关于初始学习率的设置的问题会在另外的博文中介绍。

图1.采用传统学习率下降和周期性学习率下降示意图。
  • 采用单调下降的学习率的一些可能的弊端:

1.我们的模型已经优化器对于初始的学习率是敏感的。

2.我们不知道该选什么样的初始学习率,因此我们可能需要尝试几十甚至几百次的试验来选定一个比较合理的初始学习率。

3.当初始学习率下降时,我们也不能保证模型会收敛到一个局部最小值。事实上,它有可能会收敛在鞍点上。

而利用Cyclical Learning Rate 可以解决上面这三个弊端。

三种 Cyclical Learning Rate (CLR)

周期性学习率遵从从小到大再从大到小,然后又是从小到大再从大到小,如此这般循环下去。1个Cycle定义为从小到大再从大到小的变化。1个Cycle由两个step_size组成,见下图1:

图1. Triangular型的周期性学习率。

对于CLR,需要设定一个最大的学习率(max_lr) 和一个最小的学习率(base_lr), 整个学习率在训练期间会在这两个限定值之间来回振荡。按照振荡的方式不同,这里介绍三种CLR。

1.第一种CLR命名为"triangular",每一个Cycle的max_lr是不变的,也即为图1所示情况。
2.第二种CLR命名为"triangular2",每一个Cycle的max_lr会逐渐减半,如下图2所示。
3.第三种CLR命名为"exp_range",每一个Cycle的max_lr随着Cycle指数下降,如下图3所示。

图2.Triangular2型的周期性学习率。

图3.Exp_range型周期性学习率。

对于第一种Triangular型周期性学习率,由于即便到了训练的末期,其学习率仍然可以达到最大或者比较大的一个值,因此就有可能会使得原本已经训练到了最优的模型又跳出最优点位置,使得模型的训练结果变得不太稳定。因此后面的trainglar2 和 exp_rangle两种类型的周期性学习率可以保证避免这种不稳定性问题。

有两点需要注意的是:

1.上面的图显示,一开始的学习率是一个非常小的值,也就是说学习率由小变大。(为什么不一开始由大到小呢?我的理解是,最终我们设定的参数应该要保证使得最后一个训练的iteration所对应的学习率是最小的。否则很难保存模型训练的最后一个iterations对应的是局部最优点。)

2.参考资料中的作者(Adrian Rosebrock) 在实践中发现,他不需要用“”exp_range策略“来调节学习率,实际上,在大部分情况下,triangular和triangular2两种策略已经可以取得足够好的效果了


关键实现代码介绍:

1.github(https://github.com/bckenstler/CLR)上也给出了上述三个周期性学习率调整策略的关键代码。

2.详细的使用上述代码例子可以在提供的参考资料主页上找到索取方法。需要向Adrian Rosebrock发邮件索要。

这里我只挑选重要的地方讲解。

关键的定义这三种周期学习率的代码就只有下面几行:

# CLR
cycle = np.floor(1+iterations/(2*step_size))
x = np.abs(iterations/step_size - 2*cycle + 1)
lr= base_lr + (max_lr-base_lr)*np.maximum(0, (1-x))*scale_fn(x)

其中不同的scale_fn(x)就代表了不同的周期性学习率策略。具体可以见如下代码片段:

if self.mode == 'triangular':self.scale_fn = lambda x: 1. # triangularself.scale_mode = 'cycle'
elif self.mode == 'triangular2':self.scale_fn = lambda x: 1/(2.**(x-1)) # triangular2self.scale_mode = 'cycle'
elif self.mode == 'exp_range':self.scale_fn = lambda x: gamma**(x) # exp_rangeself.scale_mode = 'iterations'

在keras中可以按照下面的代码来使用CLR策略:

cycle = np.floor(1+iterations/(2*step_size))
x = np.abs(iterations/step_size - 2*cycle + 1)
lr= base_lr + (max_lr-base_lr)*np.maximum(0, (1-x))*gamma**(iterations) # exp_rangeclr = CyclicLR(base_lr=0.001, max_lr=0.006,step_size=2000., mode='exp_range',gamma=0.99994)
model.fit(X_train, Y_train, callbacks=[clr])

需要说明的是,你也可以自己去定义scale_fn。下面例举两个例子:

1.cycle的最大幅度按照类似sin函数变化:

cycle = np.floor(1+iterations/(2*step_size))
x = np.abs(iterations/step_size - 2*cycle + 1)
lr= base_lr + (max_lr-base_lr)*np.maximum(0, (1-x))*0.5*(1+np.sin(cycle*np.pi/2.))clr_fn = lambda x: 0.5*(1+np.sin(x*np.pi/2.))
clr = CyclicLR(base_lr=0.001, max_lr=0.006,step_size=2000., scale_fn=clr_fn,scale_mode='cycle')
model.fit(X_train, Y_train, callbacks=[clr])

2.cycle的最大幅度是cycle的iterations的函数:

cycle = np.floor(1+iterations/(2*step_size))
x = np.abs(iterations/step_size - 2*cycle + 1)
lr= base_lr + (max_lr-base_lr)*np.maximum(0, (1-x))*1/(5**(iterations*0.0001))clr_fn = lambda x: 1/(5**(x*0.0001))
clr = CyclicLR(base_lr=0.001, max_lr=0.006,step_size=2000., scale_fn=clr_fn,scale_mode='iterations')
model.fit(X_train, Y_train, callbacks=[clr])

一些说明:

batch_size: 每一批同时输入模型进行前向和反向传播的数据量;

iteration: 表示每一轮(epoch)中,参数更新的次数,它等于 “总的样本数/batch_size”(向上取整)。

从上面两张图可以看出,学习率在每一个iteration都是变化的。不要把它理解为在某一段

iterations区间它是不变的,进入下一个区间它才变化。

Cycle: 它表示学习率从base_lr增大到max_lr,再从max_lr减少到base_lr所需要的iteration数目。

通常1个Cycle所包含的iteration数目比一轮(epoch)训练所包含的iteration要多。也就是说,

经过几个epoch才完成1个Cycle。

step_size: 半个Cycle所需要的iterations, CLR的发明者Leslie Smith建议,1个step_size可以取

(2-8)*training_iterations_in_epoch。而前面提到的Adrian Rosebrock发现在大部分情形下,

取4或者8就足以得到不错的结果。也就是说通常step_size也要跨越4个或者8个epoch。

比如,num_epochs=96, step_size=8, 那么:  1 cycle = 96/(8*2) = 6 。也就是说在96轮迭代中,一共

有6个学习率调整周期。个人理解:通常设置的 num_epochs 能够被 2*step_size 整除,这样才能保证最后一个

iteration对应的学习率最小,从而保证模型收敛于一个局部最优解。

一个小问题:

结合early_stop技术,有可能在做early_stop时,对应的学习率不是最小值。会不会出现这种情况呢?应该是有可能的,

具体是否如此,就在实践中检验吧。

参考资料:

1. https://www.pyimagesearch.com/2019/07/29/cyclical-learning-rates-with-keras-and-deep-learning/

2. https://arxiv.org/pdf/1506.01186.pdf

关于周期性学习率(Cyclical Learning Rate, CLR)相关推荐

  1. 深度学习成长之路(二)学习率(learning rate)的知识汇总

    首先是找到的三篇不错的博客,看完收获很多.链接如下: 机器之心 学习速率设置指南 简书 batchsize和lr的笔记 雷锋网 抛弃learning rate decay 学习率(learning r ...

  2. 深度学习——学习率衰减(learning rate decay)

    学习率衰减(learning rate decay) 为了防止学习率过大,在收敛到全局最优点的时候会来回摆荡,所以要让学习率随着训练轮数不断按指数级下降,收敛梯度下降的学习步长. 学习率衰减可以用以下 ...

  3. 机器学习笔记之学习率(learning rate)与过拟合(overfitting)

    这次的笔记,之所以把学习率和过拟合放在一起讲,是因为,Msc阶段的几个挂掉的入职面试(投的实习,有的直接变成了校招的比如hw和zx,还有ali),问了相关的问题,结果回答地不好,所以在这里把这两个东西 ...

  4. 3.1 学习率(learning rate)的选择

    文章目录 1. 什么是学习率 2. 学习率指数衰减机制 3. 实例解析 4. 总结 1. 什么是学习率 调参的第一步是知道这个参数是什么,它的变化对模型有什么影响. (1)要理解学习率是什么,首先得弄 ...

  5. 【深度学习】 学习率lr(Learning Rate)对精度和损失值的影响

    学习率对精度和损失值的影响研究 1 问题 探究不同学习率对深度学习的精度和损失的影响. 2 探究 通过设置不同学习率(lr)发现,训练精度随着学习率的减小在模型训练次数较多的背景下渐趋平稳,逐渐稳定在 ...

  6. 深度学习:权重衰减(weight decay)与学习率衰减(learning rate decay)

    正则化方法:防止过拟合,提高泛化能力 避免过拟合的方法有很多:early stopping.数据集扩增(Data augmentation).正则化(Regularization)包括L1.L2(L2 ...

  7. TensorFlow之二—学习率 (learning rate)

    文章目录 一.分段常数衰减 tf.train.piecewise_constan() 二.指数衰减 tf.train.exponential_decay() 三.自然指数衰减 tf.train.nat ...

  8. tensorflow learning rate的设置

    一.分段常数衰减 tf.train.piecewise_constan() 二.指数衰减 tf.train.exponential_decay() 三.自然指数衰减 tf.train.natural_ ...

  9. 【学习率调整】学习率衰减之周期余弦退火 (cyclic cosine annealing learning rate schedule)

    1. 概述 在论文<SGDR: Stochastic Gradient Descent with Warm Restarts>中主要介绍了带重启的随机梯度下降算法(SGDR),其中就引入了 ...

  10. Adam和学习率衰减(learning rate decay)

    1.梯度下降法更新参数 梯度下降法参数更新公式: 其中,η 是学习率,θt是第 t 轮的参数,J(θt) 是损失函数,∇J(θt) 是梯度. 在最简单的梯度下降法中,学习率 ηη 是常数,是一个需要实 ...

最新文章

  1. jquery判断页面、图片是否加载完成
  2. 阿里资深技术工程师: 程序员怎样快速成长?
  3. srpg 胜利条件设定_英雄联盟获胜条件
  4. PMP读书笔记(第6章)
  5. 用c语言编程减法计算,求用C编个大数加减法运算程序
  6. python3.0实例_python3.0 模拟用户登录,三次错误锁定的实例
  7. 《scikit-learn》决策树之回归树
  8. python正则表达式爬虫_Python爬虫之正则表达式一些常用方法
  9. 解决php中json_decode的异常JSON_ERROR_CTRL_CHAR
  10. Android XML文件使用
  11. 网站服务器 凭证,登录云服务器的凭证是什么
  12. OSPF区域内拓扑计算原理与实验
  13. 阶段3 1.Mybatis_10.JNDI扩展知识_2 补充-JNDI搭建maven的war工程
  14. RHCSA与RHCE红帽认证考试心得
  15. 路由器450m和1200m有什么区别
  16. 【liunxptp协议栈详解第一部分】
  17. 想准确识别各地方言?这套15000小时方言语音数据推荐了解一下
  18. 聚合供应链,Saas系统
  19. 计算机辅助技术英语,电子计算机辅助技术(CAD)
  20. linux4.0 RT负载均衡原理

热门文章

  1. [luoguT30208]太极剑
  2. Linux入门(五)-系统管理
  3. 显示计算机101代码,电脑出现蓝屏故障101停机码,怎么解决问题
  4. 【原】 可供测试的信用卡号 Test Credit Card Number
  5. java ltp4j_ltp工具使用配置
  6. SEO入门知识1:网站改版后怎么做SEO
  7. 物联网Wi-Fi,SIP 时代即将来临
  8. js调起打开APP_浏览器点击打开微信
  9. 保健操对颈椎病有辅助治疗。
  10. python掷骰子实验报告_python掷骰子游戏