【调参15】如何配置神经网络的学习率



神经网络的权重无法使用分析方法来计算,必须通过随机梯度下降的经验优化过程来寻找权重。神经网络的随机梯度下降法所解决的优化问题极具挑战性,解空间(权重集)可能包含许多好的解(全局最优解),而且容易找到,但是更容易找到局部最优解。在此搜索过程的每个步骤中,模型的变化量或步长称为学习率(learning rate),它可能是神经网络最重要求最需要调整的超参数,以实现模型对特定问题的良好性能。


1. 什么是学习率

深度学习神经网络是使用随机梯度下降算法训练的。随机梯度下降法是一种优化算法,它使用训练数据集中的示例为模型的当前状态估算误差梯度,然后使用误差的反向传播算法(简称反向传播)更新模型的权重。

训练过程中权重的更新量称为步长或“ 学习率”。具体而言,学习率是用于神经网络训练的可配置超参数,为一个确定步长的正标量,值域为 [0.0,1.0][0.0,1.0],经验值为 0.0010.0010.010.01。通常用小写的希腊字母 η\eta 表示。

在训练期间,误差的反向传播估计网络中节点权重所负责的错误量。不是更新全部权重,而是根据学习率来缩放。0.1的学习率意味着每次更新权重时,网络中的权重将更新0.1 *(估计的权重误差)或估计的权重误差的10%。


2. 学习率的影响

神经网络学习或近似一个函数,以最佳地将输入映射到训练数据集中示例的输出。

学习速率超参数控制模型学习的速率或速度。具体来说,它控制模型权重随其每次更新而更新的分配误差量,例如在每批训练示例的末尾。

给定一个完美配置的学习速率,该模型将学习在给定数量的训练时期(通过训练数据)中,在给定可用资源(层数和每层节点数)的情况下,对函数进行最佳近似。

通常,较高的学习率可使模型学习更快,但代价是要获得次优的最终权重集。较小的学习率可以使模型学习更优化的甚至是全局最优的权重集,但是训练时间可能会更长。

在极端情况下,学习速率过大将导致权重更新过大,模型的性能(例如训练损失)在训练期间会发生振荡。振荡是由发散的权重引起的。太小的学习速率可能永远不会收敛或陷入局部最优解。

在最坏的情况下,权重更新太大会导致权重爆炸(即导致数值溢出)。当使用较高的学习率时,可能会遇到一个正反馈循环,其中较大的权重会导致较大的梯度,然后导致较大的权重更新。如果这些更新持续增加权重的大小,则[权重]会迅速远离原点,直到发生数值溢出为止。


3. 如何设置学习率

在训练数据集上为模型找到合适的学习率非常重要。实际上,学习率可能是为模型配置的最重要的超参数。学习率可能是最重要的超参数。如果有时间仅调整一个超参数,请调整学习率。

一般来说,不可能先验地计算出最佳学习率。相反,必须通过反复试验找到一个好的(或足够好的)学习率。学习率的范围通常为 106η1.010^{-6} \le \eta \le 1.0

学习率将与优化过程的许多其它方面相互作用,并且相互作用可能是非线性的。一般而言,较低的学习率将需要更多的训练时间;较高的学习率将需要较少的训练时间。此外,考虑到误差梯度的噪声估计,较小的批次大小更适合较小的学习率

学习率的选择非常关键,如果值太小,则误差的减小将非常缓慢,而如果值太大,则可能导致发散振荡。

另一种方法是对所选模型的学习率进行敏感性分析,也称为网格搜索。这可以找到一个好的学习率可能存在的数量级范围,以及描述学习率和性能之间的关系。网格搜索学习率通常是 0.10.110510^{-5}10610^{-6} 之间。例如,测试集合 {0.10.01103104105}\{ 0.1,0.01、10^{-3}、10^{-4}、10^{-5} \} 中的学习率在模型上的表现。


4. 为学习过程添加动量(Momentum)

通过将历史记录添加到权重更新过程中,可以使训练神经网络变得更加容易。

具体地,当权重被更新时,可以包括权重的先前更新的指数加权平均值(exponentially weighted average)。随机梯度下降的这种变化称为动量(momentum),并在更新过程中增加了惯性(inertia),从而导致一个方向上的许多过去更新在将来继续朝该方向发展。

动量可以加速对这些问题的学习,在这些问题上,通过优化过程导航的高维权空间(weight space)具有误导梯度下降算法的结构,例如平坦区域(flat regions)或陡峭曲率(steep curvature)。动量法旨在加速学习,尤其是在面对高曲率(high curvature),较小但一致的梯度或噪声梯度(noisy gradients)时

过去更新的惯性量(amount of inertia)通过添加新的超参数(通常称为动量(momentum)或速度(velocity))进行控制,并使用希腊小写字母 α\alpha 表示。动量算法引入了一个变量 vv,表示参数在参数空间中移动的方向和速度。速度设置为负梯度的指数衰减平均值( exponentially decaying average of the negative gradient)。

它具有平滑优化过程,减慢更新速度以继续前一个方向而不会卡住或振荡(oscillating)的作用。解决**特征值差异很大(widely differing eigenvalues)**的一种非常简单的技术是在梯度下降公式中添加动量项。这有效地增加了权重空间的运动的惯性,并消除了振动。

动量设置为大于0.0且小于1的值,在实践中通常使用0.5,0.9和0.99等常用值。Keras默认配置为0.99。

动量不能使配置学习率变得容易,因为步长与动量无关。相反,动量可以与步长一致地提高优化过程的速度,从而提高在更少的训练时期中发现更好的权重集合(解空间)的可能性


5. 使用学习率时间表(LR Schedule)

与使用固定学习率相比,更好的另一种方法是在训练过程中改变学习率。学习率随时间变化的方式(训练时期)称为学习率时间表(learning rate schedule)或学习率衰减(learning rate decay)。最简单的学习率衰减方式是将学习率从较大的初始值线性减小到较小的值。这允许在学习过程开始时进行较大的权重更改,并在学习过程结束时进行较小的更改或微调。

在实践中,有必要逐渐降低学习率,这是因为SGD梯度估算器(estimator)引入了噪声源(m个训练样本的随机采样),即使达到最小化也不会消失。

实际上,在训练神经网络时,使用学习速率表可能是最佳实践。代替选择固定的学习速率超参数,配置挑战包括选择初始学习速率和学习速率时间表。考虑到学习率时间表可能允许的更好性能,初始学习率的选择可能不如选择固定学习率敏感。

学习率可以衰减到接近零的较小值。或者,可以在固定数量的训练时期内衰减学习速率,然后将剩余的训练时期保持在较小的恒定值,以利于进行更多的时间微调。

在Keras中可以设置学习率回调,通过监视验证损失或者其他指标,来决定学习率衰减的程度。举一个简单的例子:

# snippet of using the ReduceLROnPlateau callback
from tensorflow.keras.callbacks import ReduceLROnPlateau
...
rlrop = ReduceLROnPlateau(monitor='val_loss', factor=0.1, mode='auto', patience=100)
model.fit(..., callbacks=[rlrop])

以上代码的意思是说如果验证损失连续在100个epoch内减小值小于0.1,则降低学习率。


6. 自适应学习率(Adaptive LR)

训练数据集上模型的性能可以通过学习算法进行监控,并且可以相应地调整学习率。这称为自适应学习率。

合理的优化算法选择是SGD,其动量具有学习速率下降的趋势(在不同问题上表现较好或较差的流行衰减方法包括线性衰减,直到达到固定的最小学习速率,然后呈指数衰减,或将学习速率每次2-10个epoch降低一定比例)。如果在固定数量的训练时期内性能没有提高,则可以再次提高学习率。

自适应学习率方法通常会优于配置错误学习率的模型。自适应学习率方法如此有用和流行的原因之一是先验地选择好的学习率很困难。一个好的自适应算法通常会比简单的反向传播收敛速度快得多,而固定学习率选择得不好。

尽管没有任何一种方法可以最好地解决所有问题,但是已经证明了三种自适应学习率方法在许多类型的神经网络和问题上均具有较强的鲁棒性。它们是AdaGrad,RMSProp和Adam,并且都针对模型中的每个权重维持和调整学习率。 最常用的是Adam,因为它在RMSProp之上增加了动量。

实际上,选择何种优化器没有固定的标准,需要针对不同的问题进行试验,最流行的优化算法包括SGD,带动量的SGD,RMSProp,带动量的RMSProp,AdaDelta和Adam。


参考:
https://machinelearningmastery.com/learning-rate-for-deep-learning-neural-networks/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章