【深度学习】一文教你如何确定好的“学习率”

2018 年 1 月 25 日 专知 专知内容组(编)

【导读】近日,数据科学家Hafidz Zulkifli发布一篇文章,主要讲解了深度学习中的“学习率”,以及如何利用学习率来提高深度学习模型的性能并减少训练时间。作者“学习率”入手,逐层抽丝剥茧教我们深入理解深度学习中的“学习率”,并掌握如何获得好的“学习率”。内容包括:什么是学习率、怎么确定学习率、如何获得更好的学习率、迁移学习中的学习率确定、差分学习。相信读完本文之后,将帮您解决“如何确定学习率?的困扰。专知内容组编辑整理。


Understanding Learning Rates and How It Improves Performance in Deep Learning

理解学习率及其如何提高深度学习的性能


这篇文章试图记录我对以下主题的理解:

  • 什么是学习率? 它有什么意义?

  • 如何获得好的学习率?

  • 为什么我们在训练期间改变学习

  • 如何使用预训练模型来处理学习率?


这篇文章大部分是基于过去fast.ai研究员写的文章[1],[2],[5]和[3]。 本文是这些文章的精简版,能让读者快速了解这些文章的思想。 想要了解更多内容,请参阅参考资料了解更多详情。


首先,什么是学习率?




学习率是一个超参数,控制我们要多大程度调整网络的权重,以符合梯度损失。 值越低,沿着梯度下降越慢。 虽然使用较小学习率可能是一个 好主意,以确保我们不会错过任何局部最低点,但也可能意味着我们将花费很长的时间来收敛——特别是当我们卡在平稳区域(plateau region)的时候。


以下公式显示了这种关系。

new_weight = existing_weight — learning_rate * gradient



通常,学习率是由用户随意配置的。 用户最多也只能通过之前的经验来配置最佳的学习率。


因此,很难得到好的学习率。 下图演示了配置学习速率时可能遇到的不同情况。


 

与此同时,学习率会影响我们的模型能够以多快的速度收敛到局部最小值(也就是达到最好的精度)。 因此,从正确的方向做出正确的选择意味着我们能用更少的时间来训练模型。


较少的训练时间,花在GPU云计算上的花费较少。:)


有没有更好的方法来确定学习率?




在“Cyclical Learning Rates for Training Neural Networks.”的第3.3节[4]中,Leslie N. Smith认为,可以在模型初始化的时候设置一个非常小的学习率,通过每次迭代地增加它(线性或指数级地 )。

 

如果我们记录每次迭代的学习,并绘制学习率(对数)与损失; 我们会看到,随着学习率的提高,会有一个损失停止下降并开始增加的点。 在实践中,我们的学习率理想情况下应该是从图的左边到某处最低点(如下图所示)。 在下图中,0.001到0.01。


以上想法看起来很有用。 我该如何开始使用它?




目前,它是fast.ai包的一个API,它是由Jeremy Howard开发的一种基于Pytorch的包(很像Keras和Tensorflow的关系)。

在训练神经网络之前,只需输入以下命令即可开始找到最佳学习率。


 

learn is an instance of Learner class or one of derived classes like ConvLearner

learn.lr_find()

learn.sched.plot_lr()


更近一步




我们已经介绍了什么是学习速度,接下来有一点是很重要的,即当我们开始训练我们的模型时,我们怎样才能系统地达到最佳的使用价值。


接下来,我们将介绍如何利用学习率来改善模型的性能。


传统方法




通常,当设定他们的学习率并训练模型时,只有等待学习速率随着时间的推移而下降,并且模型才能最终收敛。


然而,随着梯度达到稳定水平(plateau),训练损失变得更难以改善。 在[3]中,Dauphin等人认为,减少损失的难度来自鞍点(saddle points),而不是局部最低点。

 


那么我们怎么避免呢?




有几个选项我们可以考虑。 一般来说,从文章[1]引用一句:

...而不是使用一个固定值的学习速度,并随着时间的推移而降低,如果训练不会改善我们的损失,我们将根据一些循环函数f来改变每次迭代的学习速率。 每个周期的迭代次数都是固定的。 这种方法让学习率在合理的边界值之间循环变化。 这是有帮助的,因为如果我们卡在鞍点上,提高学习速度可以更快速地穿越鞍点高原。


在文献[2]中,Leslie提出了一种“三角”方法,在每次迭代之后重新开始学习速率。

 


另一种流行的方法是由Loshchilov&Hutter [6]提出的随机梯度下降与热重启。 这种方法基本上使用余弦函数作为循环函数,并在每个周期最大值重新开始学习速率。 重新开始学习率的时候会出现“warm”点,并不是从头开始, 而是来自模型在最后一步收敛的参数[7]。


虽然有这种变化,下面的图表演示其实施过程,其中每个周期设置为相同的时间段。

 

因此,我们现在有办法缩短训练时间,基本上是周期性地跳过“山脉”(如下图)。

 


除了能节省时间,研究还表明,无需进行调整,使用这些方法往往就可以提高分类准确性,而而且可以在更少的迭代次数内完成。

 

迁移学习的学习率



 

在fast.ai课程中,在解决AI问题时,很强调如何利用预训练模型。 例如,在解决图像分类问题时,教学生如何使用VGG或Resnet50等预训练模型,并将其连接到其他想要预测的图像数据集。


为总结如何在fast.ai中构建模型(不要与fast.ai包混淆),我们通过以下步骤进行说明:

1. 启用数据增强,并使precompute=True

2. 使用lr_find() 找到最高的学习率损失仍然使模型提高明显

3. 对1–2 epochs 使用预计算(precomputed)激活函数来训练最后一层

4. 在2-3 epochs设置cycle_len=1,使用数据增强训练最后一层(也就是precompute=False)

5. 解冻所有层

6. 将较早的层的学习率设置为比下一个层低3至10倍

7. 再次使用lr_find()

8. 当过拟合的时候使用cycle_mult=2训练完整的网络

 

从上面的步骤中,我们注意到步骤2,5和7关心学习率。 在这篇文章的前半部分基本涵盖了上述步骤中的第2项,我们在这里介绍了如何在训练模型之前得出最佳学习率。

 

在本文剩下的部分中,我们通过使用SGDR来了解如何通过重启学习速率来减少训练时间和提高准确性,以避免到达梯度接近于零的区域。

在最后一节中,我们将重点介绍差分学习(differential learning),以及如何在训练模型之前使用预训练模型来确定学习率。


什么是差分学习?(differential learning)




这是一种在训练期间为网络中的不同层设置不同的学习率的方法。 这与人们通常如何配置学习率的方法(即在训练期间在整个网络中使用相同的速率)相反。

 


在写这篇文章的时候,Jeremy和Sebastian Ruder 【9】发表了一篇论文,深入探讨了这个话题。 所以我估计差分学习可以被称为——有区别地微调。

 

为了更清楚地说明这个概念,我们可以参考下面的图,其中一个预训练模型被分成3个组,其中每个组将使用递增学习率值进行配置。

 

用不同的学习率来采样CNN。图像来自【3】

 

这种配置方法背后的想法是:前几个层通常会包含非常细微的数据细节,比如线条和边缘, 我们通常不希望改变这些细节并倾向于保留它的信息。 因此,不需要太多的改变它们。

 

相比之下,在后面的层中,比如图中绿色的层:我们可以获得眼球、嘴巴、鼻子等数据的详细特征; 我们可能不需要保留它们。

 

这种方法与其他的微调方法相比怎么样?




在【9】中,有人认为,微调整个模型太昂贵,因为有些网络可能超过100层。 因此,人们通常做的是一次对模型的一层进行微调。

 

【但是,这要求具有顺序性,妨碍了并行性,并且需要多次通过数据集,导致过度拟合小数据集。】

 

已经证明【9】中引入的方法能够在各种NLP分类任务中提高准确度和降低错误率(如下图)

参考




[1] Improving the way we work with learning rate.

[2] The Cyclical Learning Rate technique.

[3] Transfer Learning using differential learning rates.

[4] Leslie N. Smith. Cyclical Learning Rates for Training Neural Networks.

[5] Estimating an Optimal Learning Rate for a Deep Neural Network

[6] Stochastic Gradient Descent with Warm Restarts

[7] Optimization for Deep Learning Highlights in 2017

[8] Lesson 1 Notebook, fast.ai Part 1 V2

[9] Fine-tuned Language Models for Text Classification


参考链接:

https://towardsdatascience.com/understanding-learning-rates-and-how-it-improves-performance-in-deep-learning-d0d4059c1c10

-END-

专 · 知

人工智能领域主题知识资料查看获取【专知荟萃】人工智能领域26个主题知识资料全集(入门/进阶/论文/综述/视频/专家等)

同时欢迎各位用户进行专知投稿,详情请点击

诚邀】专知诚挚邀请各位专业者加入AI创作者计划了解使用专知!

请PC登录www.zhuanzhi.ai或者点击阅读原文,注册登录专知,获取更多AI知识资料

请扫一扫如下二维码关注我们的公众号,获取人工智能的专业知识!

请加专知小助手微信(Rancho_Fang),加入专知主题人工智能群交流!

点击“阅读原文”,使用专知

登录查看更多
4

相关内容

[ICML-Google]先宽后窄:对深度薄网络的有效训练
专知会员服务
34+阅读 · 2020年7月5日
专知会员服务
146+阅读 · 2020年6月15日
【2020新书】如何认真写好的代码和软件,318页pdf
专知会员服务
63+阅读 · 2020年3月26日
深度学习算法与架构回顾
专知会员服务
81+阅读 · 2019年10月20日
7个实用的深度学习技巧
机器学习算法与Python学习
16+阅读 · 2019年3月6日
入门 | 理解深度学习中的学习率及多种选择策略
如何找到最优学习率?
AI研习社
11+阅读 · 2017年11月29日
【教程】如何估算深度神经网络的最优学习率
GAN生成式对抗网络
5+阅读 · 2017年11月18日
教程 | 如何估算深度神经网络的最优学习率
机器之心
3+阅读 · 2017年11月17日
Arxiv
5+阅读 · 2020年3月26日
Accelerated Methods for Deep Reinforcement Learning
Arxiv
6+阅读 · 2019年1月10日
Arxiv
8+阅读 · 2018年6月19日
Arxiv
6+阅读 · 2018年2月8日
VIP会员
相关资讯
7个实用的深度学习技巧
机器学习算法与Python学习
16+阅读 · 2019年3月6日
入门 | 理解深度学习中的学习率及多种选择策略
如何找到最优学习率?
AI研习社
11+阅读 · 2017年11月29日
【教程】如何估算深度神经网络的最优学习率
GAN生成式对抗网络
5+阅读 · 2017年11月18日
教程 | 如何估算深度神经网络的最优学习率
机器之心
3+阅读 · 2017年11月17日
Top
微信扫码咨询专知VIP会员