O'ReillyAI系列:将学习速率可视化来优化神经网络

时间:2022-04-21
本文章向大家介绍O'ReillyAI系列:将学习速率可视化来优化神经网络,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

O’Reilly和Intel人工智能2018北京大会售票系统已经上线,现在是Best Price票价阶段。目前已经公布部分讲师及议题,详情请登录官网:https://ai.oreilly.com.cn/ai-cn

原文摘要:

学习速率是随着时间的推移神经网络里信息积累的速度。学习速率决定了神经网络达到(以及是否能达到)所需特定输出的最佳、最有利位置的速度。在原始随机梯度下降(SGD)中,学习速率与误差梯度的形状无关,因为它使用了一个与误差梯度无关的全局学习速率。

然而可以对原始SGD的更新规则进行许多修改,这些规则会将学习速率跟误差梯度的大小和方向关联起来。

为什么要将学习速率的可视化出来?

将随着时间变化的学习速率可视化与随着道路状况变化的汽车速度可视化是类似的。在高速公路等畅通宽阔的道路上,我们可以提高速度(学习速率),但是在狭窄的丘陵或山谷道路上,我们必须放慢速度。此外,我们不想在高速公路上行驶得太慢,否则我们将花费太长时间才能到达目的地(由于参数不当而导致更长的训练时间)。同样的,我们不想在丘陵和狭窄的道路上(就像优化损失函数表面的沟谷)开车太快,因为我们很容易失去对汽车的控制(陷入局部最小值,或因产生太多的反弹而几乎没有改进)或错过目的地(最优值)。

请记住,“…一个高学习速率… [表示]系统含有太多的动能,参数向量胡乱的弹跳从而不能落入损失函数的较深但较窄的地方”(请参阅Karpathy的cs231n课程笔记)。

基于相同的数据来源,可以通过在数据集的一个子集上训练网络来获得一个良好的初始学习速率估计。理想的策略是从一个很大的学习速率开始,逐次减半直到损失不再变化。在接近训练结束时,学习速率的衰减应在100倍左右或更高。这种衰减使学习好的网络能够抵抗可能使学习失败的随机波动。在这里,我们将会先选择一个小的学习速率在一个小的数据集上测试,并选择适当的值。

学习速率衰减

非自适应学习速率可能不是最佳的。学习速率的衰减可以通过每几个周期减少某个常数因子,或通过指数衰减来实现,指数可以采用每几个周期的指数的数学形式。“衰减”通常被认为是一个消极的概念,在当前的学习速率衰减案例中也是负面的:它指的是学习速率下降的程度。然而这种衰减的结果实际上是我们非常想要的。例如我们降低一辆车的速度以适应道路和交通条件,这种减速可以被理解为汽车速度的“衰减”。同样我们也能从衰减学习速率以适应梯度中获益。

降低学习速率是必要的,因为高的学习速率在进行迭代训练时很可能会落入局部最小值。想象这个局部最小值是一张超速罚单、一个通行费、交通信号灯或是交通拥挤——某些基本上会增加到达目的地的时间的东西。完全避免所有的交通信号灯和通行费是不可能的,但是会有一个我们喜欢的最优驾驶路径。同样的在模型训练中,我们希望寻找最佳路径时避免在梯度上的反复跳跃,并希望模型训练是沿着最佳路径的。理想情况下,我们不希望加速太快因为我们会因此得到一张超速罚单(陷入局部最小值并抛锚)。同样的比喻也适用于学习速率。

动量是一种自适应学习速率方法的参数,它允许以较高速度在平缓方向上移动,而在陡峭方向上降低速度。这种动量定义被认为是“经典动量”,它会对速度进行校正然后在速度方向上大跳跃移动。动量有助于根据梯度的变化加速或减速基础学习速率,将引起净学习速率的变化而不影响其在损失函数表面上的位置。动量使学习到的网络更能抵抗输入中的噪声和随机性。

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

Duchi等人在2011年提出的AdaGrad,其增加了根据每个维度的历史平方和来缩放梯度的各个元素。

Tieleman和Hinton在2012年提出的RMSProp自适应学习速率,其保留了每个权重的平方梯度的移动平均值以正规化当前梯度。RMSProp增强了抵抗波动和随机噪声的能力。

Kingma和Ba在2014年提出的Adam,其引入了零初始化的一个偏差修正值补偿。

以及rprop,它只使用梯度符号来分别适应每个权重的步长。这不适用于小批量。

除了这些规则,还有很多遵循牛顿更新规则但计算量非常大的二阶方法。然而二阶方法不会把学习速率视为超参数,由于其计算量大所以很少被用于大型深度学习系统。

图1显示了在差不多的超参数设置下不同优化技术的比较:

图1 优化技术的比较。资料来源:Alec Radford,经许可使用

在这个图像中,动量更新越过了目标,但是到达全局最小值的速度更快。“NAG”是Nesterov加速梯度(Nesterov Accelerated Gradient),其首先沿速度的方向移动然后基于新位置对速度矢量进行校正。

从本质上讲,我们的目标不是衰减而是利用衰减到达正确的位置。为了到达全局最优或者期望的目的地,必须有选择性地增大或者减小学习速率。不要害怕这些,因为我们经常要做很多遍。

可视化

想要了解模型学习的进展,可视化是很必要的。例如,损失周期图对于了解损失是如何随着周期变化是非常有用的。当所有数据点在当前训练中至少被看到过一次时就完成一个周期。与迭代相比,跟踪周期更好。这是因为迭代次数取决于可以任意设定的批量大小。

生成这个图的一个好方法是通过叠加不同参数集合的每个周期曲线的损失。这个过程有助于我们识别最适合训练的一组参数。这些图的y轴是损失,x轴是周期数。总体来说,图2所示的几个损失曲线看起来比较相似,但是它们的优化模式存在一些微小的差异,具体表现在其收敛所需的周期数量和结果误差上。

在众多的损失函数中,选择使用哪一种是很重要的。对于一些分类任务,交叉熵误差往往比其他度量更适合(如均方误差),这是因为交叉熵误差背后所代表的数学假设。如果我们将神经网络视为概率模型,则交叉熵会变成一个直观的损失函数,其利用Sigmoid或softmax非线性函数使输入数据被正确分类的可能性最大化。另一方面,均方误差更多地关注于标签不正确的数据。因此平均分类误差是一个粗略的标准。

交叉熵的优点是包括一个log项,使其粒度更细,同时考虑到了预测值与目标值的接近度。交叉熵也有更好的偏导数以产生较大的误差,这会使梯度更大以确保更快的学习速度。通常损失函数应根据输出单元跟概率模型假设相匹配的假设来选择。例如,softmax和交叉熵最适合多类分类。绘制交叉熵函数可能更容易解释,因为log项仅仅是因为学习过程主要表现为指数形式的一个指数过程。

关于本文更多精彩内容,请登录O'Reilly官网:https://www.oreilly.com.cn/ideas/?p=1263