神经网络训练 -- 调整学习速率
学习速率是神经网络中随着时间推移,信息累积的速度。学习速率决定了网络达到最优值速度,或对于特定期望的输出时,网络的参数达到最优的状态的速度。在随机梯度下降(SGD)的平面图中,学习速率与误差梯度的形状无关,因为全局学习速率与误差梯度无关。然而,可以对原始SGD更新规则进行许多修改,将学习速率与错误梯度的大小和方向相关联。
为什么要调整学习速率?
随着时间的推移,调整学习速率与根据道路条件对汽车的速度进行调整相似。在高速公路等平稳宽阔的道路上,我们可以提高速度(学习速率),但是在狭窄的丘陵或山谷道路上,我们必须放慢速度。此外,我们不希望在高速公路上行驶得太慢,否则我们需要太长时间才能到达目的地(由于参数不正确而导致更长的训练时间)。同样,我们也不想在丘陵和狭窄的道路上(如优化损失函数曲面的沟壑)驾驶太快,因为我们很容易失去对汽车的控制(陷入抖动或产生太多的反弹,我们几乎不能做任何改进)或跳过目的地(最佳值)。
从相同的来源,可以通过在数据的子集上训练网络来获得一个不错的初始学习速率。理想的策略是从一个很大的学习速率开始,除以一半,直到损失值不再分歧(发散)。接近训练结束时,学习速率的衰减应该在100倍以上。这种衰减使学习到的网络模型可以抵抗随机波动,这中随机波动可能会扭转学习(陷入发散状态)。我们将从一个小的LR开始,测试一小组数据,并选择适当的值。
衰减学习速率
非自适应学习速率可能不是最佳的。学习速率衰减可以通过每几个时间周期做一些较小的常数因子的衰减,或通过指数衰减来实现,指数衰减采用几个时间周期的指数的数学形式来实现。“衰减”通常被认为是一个消极的概念,同时,目前情况下,学习速率的衰减也是消极的:它指的是学习速率下降的程度。然而,这种衰减的结果实际上是我们非常想要的。例如在一辆车上,我们降低速度以适应道路和交通状况;这种减速可以被理解为汽车速度的“衰减”。同样,我们从衰减学习速率得到好处,以适应梯度。
降低学习速率是必要的,因为在训练过程中,较高学习速率很可能陷入局部最小值。以交通情况为例,将局部最优值视为高速票,通行费或交通灯,或交通拥堵,这些情况会增加到达目的地所需的时间。不可能完全避免所有的交通信号灯和通行费,但是在驾驶时我们更喜欢一条最佳的路线。同样,在训练中,我们希望避免梯度的曲折反弹,同时寻找最优路线,并且喜欢在该路径上的训练。理想情况下,我们不希望加速得太多,因为我们会得到一张超快的车票(跳进一个局部最优值并卡住)。同样的比喻也适用于学习速率。
动量是一种自适应学习速率方法的参数,允许沿浅方向使用较高的速度,同时沿陡峭方向降低速度前进。这种动量被定义为“经典动量”,其对速度进行校正,然后在速度方向上进行大跳跃。动量有助于加速或减速学习速率以适应梯度的变化,最终导致网络学习速率的变化而不是其在损失函数表面上的位置的变化。动量使学习到的网络更能抵抗输入数中的噪声和随机性。
将学习速率视为超参数的其他更新规则包括:
- AdaGrad更新规则,Duchi等人,2011年。基于每个维度历史的均方误差的和,为每一个维度的梯度增加了一个初度变换的规则。
- RMSProp自适应学习速率法,Tieleman和Hinton,2012年。保持每个权重的平方梯度的移动平均值以规范化(normalize)当前梯度。RMSProp增加了对波动和随机噪声的更强的抵抗能力。
- Adam,Kingma和Ba,2014年,引入了偏差矫正策略以补偿零初始化带来影响。
- rprop,只使用梯度的符号来对每个权重的步长自适应调整。这不适用于mini-batch训练。
除了这些规则以外,还有基于牛顿的更新规则的二阶方法,二阶的方法计算量非常大。然而,二阶方法不将学习速率视为超参数;由于它们的计算需求很高,所以很少用于大规模的深度学习系统。
可视化
可视化是必须的,因为我们必须要知道学习进行到什么程度了。例如,损失值的关于epochs变化的图,对于理解损失函数随着epochs的变化是非常有用的。当所有数据点在当前运行中至少被看到一次时,一个epoch就完成了。与迭代(iteration)相比,跟踪epochs变化更好,因为迭代次数(iteration)取决于批量大小的设置。
生成这个图的一个好方法是对于不同的参数集合,覆盖每一个epoch曲线的loss。这个过程可以帮助我们识别最适合手头训练样本的一组参数集合。这些图具有沿着y轴的loss曲线,沿x轴具有epoch参数。总体而言,与图2所示的loss曲线看起来相似,但是它们的优化模式存在轻微的差异,体现在达到收敛或目标误差所需的epoch数不同。
存在有多种损失参数,选择使用哪一种使用很重要的一步。对于一些分类任务,由于交叉熵误差背后所依赖的数学假设,交叉熵误差往往比其他度量方式更适合,例如均方误差。如果我们将神经网络视为概率模型,则交叉熵变成直观的损失函数,因为它具有Sigmoid或softmax非线性特性,可以最大化正确分类输入数据的可能性。另一方面,均方误差更多地集中在标签错误的数据上。因此,平均分类误差其实是一种粗略的度量方式。
交叉熵的优点是使其更细化,同时考虑到与目标的预测值的接近度。交叉熵也有更好的偏导数产生较大的误差,这导致更大的梯度,以确保更快的学习。通常,成本函数应根据与输出单位和概率模型假设相匹配的假设来选择。例如,softmax和cross熵最适合多类分类。由于学习过程主要是以指数形式的指数过程,所以绘制交叉熵函数可能更容易解释。
实验不同的学习速率
学习速率是控制更新步长大小的超参数。随着学习速率的增加,振荡次数也在增加。高学习速率更有可能使整个模型爆炸,导致数值更新不稳定,如上溢或下溢,这也是运行这些实验时,得到的一些经验性的结果。
对每个连接使用单独的自适应的学习速率
具有多个层的网络是常见的。每个层都有不同的输出或输入数量,这会导致冲击效应,这一效应是由于同时更新一个单元(unit)的输入权重产生,这一更新的目的旨在纠正相同错误(如全局学习速率的情况)。另外,梯度的幅值对于不同的层也是不同的,特别是如果初始权重很小(始终是初始化的情况)。因此,针对不同的权重值,合适的学习速率可能存在很大的差异。
这个问题的一个解决方案是设置全局学习速率,并将其乘以一个局部增益,这个关于每个权重的局部增益凭经验确定。为了强化网络的性能,收益应处于在合理的预定范围内。当使用独立的自适应学习速率时,应将整个批次用于学习,或者应使用更大的batch size,以确保梯度符号的变化并不是主要是由于小批量的抽样误差或随机波动导致。这写per-weight自适应学习速率也可以与动量相结合。
迁移学习的学习速率
迁移学习旨在修改现有的预训练模型以供另一应用使用。这种模型的重用是必要的,因为用于训练目的的相当大的数据集在应用程序域中相对较少。微调(Fine-tuning)是一种迁移学习方式,网络的一部分被修改,比如,网络的最后一层被修改以得到特性的应用的输出。
由于网络被预先训练,网络已经获得了大部分需要的信息,因此微调所需的时间要少得多,而且只能在微调阶段来提纯(refine)知识。
微调时,我们降低整体学习速率,同时提高切片(最后一层或新层)的学习速率。例如,在开源Caffe框架中,base_lr应该在求解器prototxt中减少,而对于新引入的层,lr_mult应该增加。这有助于实现整体模型的缓慢变化,同时,在新的层中使用新的数据,不会导致剧烈的变化。经验法则是使学习过的层的学习速率保持在比其他静态层(全局学习速率)小至少10倍以上。
相关推荐
深度学习 -- 损失函数
深度残差网络(Deep Residual Networks (ResNets))
深度学习 -- 激活函数
神经网络训练 -- 调整学习速率
生成对抗网络(GAN)改进与发展
生成对抗网络(GAN)优点与缺点
生成对抗网络(GAN)的训练
生成对抗网络(GAN)基本原理
生成模型与判别模型