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

【导读】近日,数据科学家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

原文发布于微信公众号 - 专知(Quan_Zhuanzhi)

原文发表时间:2018-01-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI科技评论

王宇龙:如何通过关键数据通路去理解网络行为?

AI科技评论按:神经网络长久以来的“黑盒”属性,导致人们一直无法理解网络的内部是如何运作的,针对这个困扰已久的问题,学界主要存在三种研究方向:数据归因模式、特征...

6330
来自专栏鸿的学习笔记

写给开发者的机器学习指南(二)

在机器学习领域有两种主要的学习方式,即监督学习和无监督学习。当您想在您的应用程序中使用机器学习时,需要简要说明下,因为选择正确的机器学习方法和算法是一个重要但有...

11120
来自专栏IT派

随机森林之美

导语:随机森林和决策树相比,能更好的防止过拟合。虽然每个基分类器很弱,但最后组合的结果通常很强,这也类似于:“三个臭皮匠顶个诸葛亮”的思想。对比发现Random...

45540
来自专栏企鹅号快讯

用于大规模行人重识别的行人对齐网络

AI 科技评论按:本文首发于知乎行人重识别专栏,AI 科技评论获其作者郑哲东授权转载。 1.Motivation 近年来,对行人重识别(person re-ID...

45180
来自专栏计算机视觉战队

深度网络自我学习,最终实现更少样本的学习

接下来我们就开始今日的主题:自我学习,最少的样本去学习。听到这个,大家会想到剪枝、压缩神经网络。今天这个更加有趣,现在我们开始欣赏学术的盛宴!

25110
来自专栏人工智能LeadAI

Tensorflow新手通过PlayGround可视化初识神经网络

是不是觉得神经网络不够形象,概念不够清晰,如果你是新手,来玩玩PlayGround就知道,大神请绕道。 PlayGround是一个在线演示、实验的神经网络平台,...

53640
来自专栏CVer

[计算机视觉论文速递] 2018-04-17

[1]《Towards Improved Cartoon Face Detection and Recognition Systems》

15220
来自专栏ATYUN订阅号

自动驾驶中机器学习算法应用大盘点

今天,机器学习算法被广泛应用于解决自动驾驶汽车制造的各种挑战问题中。人类将传感器数据处理集成到汽车的ECU(电子控制单元)中。 提高机器学习的利用率去完成新...

36040
来自专栏人工智能LeadAI

LSTM模型在问答系统中的应用

在问答系统的应用中,用户输入一个问题,系统需要根据问题去寻找最合适的答案。 1、采用句子相似度的方式。根据问题的字面相似度选择相似度最高的问题对应的答案,但是采...

48370
来自专栏量子位

Kaggle优胜者详解:如何用深度学习实现卫星图像分割与识别

王新民 编译 量子位 出品 | 公众号 QbitAI 最近,Kaggle网站举办了一场在卫星图像上进行场景特征检测的比赛,数据集由英国国防科学与技术实验室(DS...

559120

扫码关注云+社区

领取腾讯云代金券