调整学习速率以优化神经网络训练

http://mp.weixin.qq.com/s/W7Vk-7zbHvi86b-HBAeveA

为什么要调整学习速率?

随着时间的推移,调整学习速率与根据道路条件对汽车的速度进行调整相似。在高速公路等平稳宽阔的道路上,我们可以提高速度(学习速率),但是在狭窄的丘陵或山谷道路上,我们必须放慢速度。此外,我们不希望在高速公路上行驶得太慢,否则我们需要太长时间才能到达目的地(由于参数不正确而导致更长的训练时间)。同样,我们也不想在丘陵和狭窄的道路上(如优化损失函数曲面的沟壑)驾驶太快,因为我们很容易失去对汽车的控制(陷入抖动或产生太多的反弹,我们几乎不能做任何改进)或跳过目的地(最佳值)。

请记住“...较高的学习速率... \[表示\]系统含有太多的动能,参数向量在处于混沌状态下,不断来回反弹,无法稳定到损失函数的一个较深且较窄的最优值”(请参阅Karpathy的cs231n笔记)。

从相同的来源,可以通过在数据的子集上训练网络来获得一个不错的初始学习速率。理想的策略是从一个很大的学习速率开始,除以一半,直到损失值不再分歧(发散)。接近训练结束时,学习速率的衰减应该在100倍以上。这种衰减使学习到的网络模型可以抵抗随机波动,这中随机波动可能会扭转学习(陷入发散状态)。我们将从一个小的LR开始,测试一小组数据,并选择适当的值。

衰减学习速率

非自适应学习速率可能不是最佳的。学习速率衰减可以通过每几个时间周期做一些较小的常数因子的衰减,或通过指数衰减来实现,指数衰减采用几个时间周期的指数的数学形式来实现。“衰减”通常被认为是一个消极的概念,同时,目前情况下,学习速率的衰减也是消极的:它指的是学习速率下降的程度。然而,这种衰减的结果实际上是我们非常想要的。例如在一辆车上,我们降低速度以适应道路和交通状况;这种减速可以被理解为汽车速度的“衰减”。同样,我们从衰减学习速率得到好处,以适应梯度。

降低学习速率是必要的,因为在训练过程中,较高学习速率很可能陷入局部最小值。以交通情况为例,将局部最优值视为高速票,通行费或交通灯,或交通拥堵,这些情况会增加到达目的地所需的时间。不可能完全避免所有的交通信号灯和通行费,但是在驾驶时我们更喜欢一条最佳的路线。同样,在训练中,我们希望避免梯度的曲折反弹,同时寻找最优路线,并且喜欢在该路径上的训练。理想情况下,我们不希望加速得太多,因为我们会得到一张超快的车票(跳进一个局部最优值并卡住)。同样的比喻也适用于学习速率。

动量是一种自适应学习速率方法的参数,允许沿浅方向使用较高的速度,同时沿陡峭方向降低速度前进。这种动量被定义为“经典动量”,其对速度进行校正,然后在速度方向上进行大跳跃。动量有助于加速或减速学习速率以适应梯度的变化,最终导致网络学习速率的变化而不是其在损失函数表面上的位置的变化。动量使学习到的网络更能抵抗输入数中的噪声和随机性。

将学习速率视为超参数的其他更新规则包括:

· AdaGrad更新规则,Duchi等人,2011年。基于每个维度历史的均方误差的和,为每一个维度的梯度增加了一个初度变换的规则。

· RMSProp自适应学习速率法,Tieleman和Hinton,2012年。保持每个权重的平方梯度的移动平均值以规范化(normalize)当前梯度。RMSProp增加了对波动和随机噪声的更强的抵抗能力。

· Adam,Kingma和Ba,2014年,引入了偏差矫正策略以补偿零初始化带来影响。

· rprop,只使用梯度的符号来对每个权重的步长自适应调整。这不适用于mini-batch训练。

除了这些规则以外,还有基于牛顿的更新规则的二阶方法,二阶的方法计算量非常大。然而,二阶方法不将学习速率视为超参数;由于它们的计算需求很高,所以很少用于大规模的深度学习系统。

图1显示了在类似超参数设置条件下,不同优化技术的对比:

图1. 优化技术的比较

在图1中,动量更新时超过了目标,但是总体最小化速度更快。“NAG”是Nesterov Accelerated Gradient的简称,其中,第一步是沿速度方向,然后基于新位置对速度矢量进行校正。

从本质上讲,我们的目的不是衰减,而是要通过衰减跳入一个正确的地方。必须选择性地增加或减少学习速率,为了达到一个全局最优值或者是期望的目标值。不要害怕这个,因为我们经常要做一遍又一遍。

可视化

可视化是必须的,因为我们必须要知道学习进行到什么程度了。例如,损失值的关于epochs变化的图,对于理解损失函数随着epochs的变化是非常有用的。当所有数据点在当前运行中至少被看到一次时,一个epoch就完成了。与迭代(iteration)相比,跟踪epochs变化更好,因为迭代次数(iteration)取决于批量大小的设置。

生成这个图的一个好方法是对于不同的参数集合,覆盖每一个epoch曲线的loss。这个过程可以帮助我们识别最适合手头训练样本的一组参数集合。这些图具有沿着y轴的loss曲线,沿x轴具有epoch参数。总体而言,与图2所示的loss曲线看起来相似,但是它们的优化模式存在轻微的差异,体现在达到收敛或目标误差所需的epoch数不同。

存在有多种损失参数,选择使用哪一种使用很重要的一步。对于一些分类任务,由于交叉熵误差背后所依赖的数学假设,交叉熵误差往往比其他度量方式更适合,例如均方误差。如果我们将神经网络视为概率模型,则交叉熵变成直观的损失函数,因为它具有Sigmoid或softmax非线性特性,可以最大化正确分类输入数据的可能性。另一方面,均方误差更多地集中在标签错误的数据上。因此,平均分类误差其实是一种粗略的度量方式。

交叉熵的优点是使其更细化,同时考虑到与目标的预测值的接近度。交叉熵也有更好的偏导数产生较大的误差,这导致更大的梯度,以确保更快的学习。通常,成本函数应根据与输出单位和概率模型假设相匹配的假设来选择。例如,softmax和cross熵最适合多类分类。由于学习过程主要是以指数形式的指数过程,所以绘制交叉熵函数可能更容易解释。

实验不同的学习速率

学习速率是控制更新步长大小的超参数。随着学习速率的增加,振荡次数也在增加。如图2所示,随着学习速率的增加,存在很多混乱或随机噪声。图2中的所有曲线都是针对MNIST数据集训练,采用单层神经网络。

我们可以从图中推断,高学习速率更有可能使整个模型爆炸,导致数值更新不稳定,如上溢或下溢,这也是运行这些实验时,得到的一些经验性的结果。事实上,NAN在第一个epoch之后就会出现这种情况。

图2. 不同学习速率下,loss per epoch。

图2显示不同学习速率下,loss per epoch的曲线。比较两种不同的损失函数,即交叉熵和分类误差。这些图显示,在较低的学习速率下,提升(improvement)是线性的(学习速率.01)。当学习速率较高时,几乎可以看到指数级跳跃(学习速率1和.5)。更高的学习速率能够使损失衰减地更快,但缺点是较的jump,可能会使模型训练陷入局部极小值,然后陷入更差的损失函数值。

这种现象经常被看作是在图中的振荡,表明所学习的参数主要是弹跳,不能稳定,使梯度朝着全局最小方向前进。如果验证曲线紧跟训练曲线变换,则网络是正确训练。然而,验证和训练曲线之间的差距比较大,表明网络在训练集上过度拟合(学习速率.01)。可以通过使用dropout或其他正则化技术来减少过度拟合的出现的几率。

对每个连接使用单独的自适应的学习速率

具有多个层的网络是常见的。每个层都有不同的输出或输入数量,这会导致冲击效应,这一效应是由于同时更新一个单元(unit)的输入权重产生,这一更新的目的旨在纠正相同错误(如全局学习速率的情况)。另外,梯度的幅值对于不同的层也是不同的,特别是如果初始权重很小(始终是初始化的情况)。因此,针对不同的权重值,合适的学习速率可能存在很大的差异。

这个问题的一个解决方案是设置全局学习速率,并将其乘以一个局部增益,这个关于每个权重的局部增益凭经验确定。为了强化网络的性能,收益应处于在合理的预定范围内。当使用独立的自适应学习速率时,应将整个批次用于学习,或者应使用更大的batch size,以确保梯度符号的变化并不是主要是由于小批量的抽样误差或随机波动导致。这写per-weight自适应学习速率也可以与动量相结合。(有关更多信息,请参见第6b节,神经网络,Coursera。)

迁移学习的学习速率

迁移学习旨在修改现有的预训练模型以供另一应用使用。这种模型的重用是必要的,因为用于训练目的的相当大的数据集在应用程序域中相对较少。微调(Fine-tuning)是一种迁移学习方式,网络的一部分被修改,比如,网络的最后一层被修改以得到特性的应用的输出。还有其他类型的迁移学习方法,我们在这里不讨论。如图3所示,当网络已经在类似的数据(钢琴)上进行了训练时,微调会修改网络以学习稍微不同种类的数据(如手风琴)。

图3.手风琴fine-tuning了从以前的钢琴中获得的知识。

由于网络被预先训练,网络已经获得了大部分需要的信息,因此微调所需的时间要少得多,而且只能在微调阶段来提纯(refine)知识。

微调时,我们降低整体学习速率,同时提高切片(最后一层或新层)的学习速率。例如,在开源Caffe框架中,base\_lr应该在求解器prototxt中减少,而对于新引入的层,lr\_mult应该增加。这有助于实现整体模型的缓慢变化,同时,在新的层中使用新的数据,不会导致剧烈的变化。经验法则是使学习过的层的学习速率保持在比其他静态层(全局学习速率)小至少10倍以上。

结论

在这篇文章中,我们只是简要介绍了深度学习算法参数多元化变化的一部分。学习速率的衰减是一个这样的参数,并且对于避免局部极小值非常关键。在进行深度学习实验的同时,请记住使用可视化技术。他们是了解深度学习黑匣子中真正发生了什么的最重要的方式之一。

想象一下,深度学习充满了小旋钮和开关,就像飞行员的仪表板。我们需要学习如何调整这些参数,以获得最佳的产出。我们可以随时为我们正在开发的应用程序找到一个预先训练的模型,有选择地添加或删除其中的一部分,并最终对我们需要的应用进行微调。而且,如果我们准确地引导我们的学习速率的变化,就可以及时到达我们的目的地。

results matching ""

    No results matching ""