zoukankan      html  css  js  c++  java
  • 如何估算深度神经网络的最优学习率

    学习率如何影响训练?

    from:https://www.jiqizhixin.com/articles/2017-11-17-2

    深度学习模型通常由随机梯度下降算法进行训练。随机梯度下降算法有许多变形:例如 Adam、RMSProp、Adagrad 等等。这些算法都需要你设置学习率。学习率决定了在一个小批量(mini-batch)中权重在梯度方向要移动多远。

    如果学习率很低,训练会变得更加可靠,但是优化会耗费较长的时间,因为朝向损失函数最小值的每个步长很小。

    如果学习率很高,训练可能根本不会收敛,甚至会发散。权重的改变量可能非常大,使得优化越过最小值,使得损失函数变得更糟。

    学习率很小(上图)和学习率很大(下图)的梯度下降。来源:Cousera 机器学习课程(吴恩达)

    训练应当从相对较大的学习率开始。这是因为在开始时,初始的随机权重远离最优值。在训练过程中,学习率应当下降,以允许细粒度的权重更新。

    有很多方式可以为学习率设置初始值。一个简单的方案就是尝试一些不同的值,看看哪个值能够让损失函数最优,且不损失训练速度。我们可能可以从 0.1 这样的值开始,然后再指数下降学习率,比如 0.01,0.001 等等。当我们以一个很大的学习率开始训练时,在起初的几次迭代训练过程中损失函数可能不会改善,甚至会增大。当我们以一个较小的学习率进行训练时,损失函数的值会在最初的几次迭代中从某一时刻开始下降。这个学习率就是我们能用的最大值,任何更大的值都不能让训练收敛。不过,这个初始学习率也过大了:它不足以训练多个 epoch,因为随着时间的推移网络将需要更加细粒度的权重更新。因此,开始训练的合理学习率可能需要降低 1-2 个数量级。

    一定有更好的方法

    Leslie N. Smith 在 2015 年的论文「Cyclical Learning Rates for Training Neural Networks」的第 3.3 节,描述了一种为神经网络选择一系列学习率的强大方法。

    诀窍就是从一个低学习率开始训练网络,并在每个批次中指数提高学习率。

    在每个小批量处理后提升学习率

    为每批样本记录学习率和训练损失。然后,根据损失和学习率画图。典型情况如下:

    一开始,损失下降,然后训练过程开始发散

    首先,学习率较低,损失函数值缓慢改善,然后训练加速,直到学习速度变得过高导致损失函数值增加:训练过程发散。

    我们需要在图中找到一个损失函数值降低得最快的点。在这个例子中,当学习率在 0.001 和 0.01 之间,损失函数快速下降。

  • 相关阅读:
    26_多线程_第26天(Thread、线程创建、线程池)
    25_IO_第25天(Properties、序列化流、打印流、CommonsIO)
    24_IO_第24天(转换流、缓冲流)
    23_IO_第23天(字节流、字符流)
    22_IO_第22天(File、递归)
    PHP常用函数
    PHP后台基本语法使用笔记
    java笔记
    springmvc常用注解标签详解
    Java:全局变量(成员变量)与局部变量
  • 原文地址:https://www.cnblogs.com/bonelee/p/8578532.html
Copyright © 2011-2022 走看看