本节主要讲了神经网络学习率退火和超参数调优等问题
学习率更新
学习率衰减
训练深度网络时,让学习率随着时间退火通常很有帮助。如果学习率很高,系统的动能就过大,参数向量就会无规律地跳动,不能够稳定到损失函数更深更窄的部分去。
何时开始衰减学习率是有技巧的:缓慢减小它,可能很长时间内只能是浪费计算资源地看着它混沌地跳动,实际进展很少。而如果快速地减小它,系统可能过快地失去能量,不能到达原本可以到达的最好位置。
通常,实现学习率退火以下三种:
随步数衰减:每进行几个周期就根据一些因素降低学习率。典型的值是每过5个周期就将学习率减少一半,或者每20个周期减少到之前的0.1。这些数值的设定是严重依赖具体问题和模型的选择的。在实践中经验做法是:使用固定的学习率训练的同时观察验证集错误率,每当验证集错误率停止下降,就乘以一个常数(比如0.5)来降低学习率。
指数衰减。数学公式是 α=α0e−kt ,其中 α0,k 是超参数, t 是迭代次数(也可以使用周期作为单位)。
-
1/t 衰减的数学公式是 α=α0/(1+kt) ,其中 α0,k 是超参数,t是迭代次数。
实践中,随步数衰减的随机失活(dropout)更受欢迎,因为它使用的超参数(衰减系数和以周期为时间单位的步数)比 k 更有解释性。
二阶迭代法
该优化方法基于牛顿法,其迭代方式如下:
这里 Hf(x) 是 Hessian矩阵,它是函数的二阶偏导数的平方矩阵。 ∇f(x) 是梯度向量,这和梯度下降中一样。直观理解上,Hessian矩阵描述了损失函数的局部曲率,从而使得可以进行更高效的参数更新。具体来说,就是乘以Hessian转置矩阵可以让最优化过程在曲率小的时候大步前进,在曲率大的时候小步前进。这个公式中没有学习率这个超参数,因此比一阶方法好得多。
在实际深度学习应用中,上述更新方法很难运用,这是因为计算(以及求逆)Hessian矩阵操作非常耗费时间和空间。例如,假设一个有一百万个参数的神经网络,其Hessian矩阵大小就是[1,000,000 x 1,000,000],将占用将近3725GB的内存。好消息是,各种各样的拟-牛顿法就被发明出来用于近似转置Hessian矩阵。最流行的是L-BFGS,该方法使用随时间的梯度中的信息来隐式地近似(整个矩阵没有被计算)。
然而,即使解决了存储空间的问题,L-BFGS应用的一个巨大劣势是需要对整个训练集进行计算,而整个训练集一般包含几百万的样本。和小批量随机梯度下降(mini-batch SGD)不同,让L-BFGS在小批量上运行起来是很需要技巧,同时也是研究热点。
在实践中,使用L-BFGS之类的二阶方法并不常见。基于(Nesterov的)动量更新的各种随机梯度下降方法更加常用,因为它们更加简单且容易扩展。
感兴趣的同学可以参考以下文献:
- On Optimization Methods for Deep Learning:2011年的论文比较随机梯度下降和L-BFGS
- Large Scale Distributed Deep Networks:google brain组的论文,比较随机梯度下降和L-BFGS在大规模分布式优化上的差别。
- SFO算法试图结合随机梯度下降和L-BFGS的优势。
逐参数适应学习率
前面讨论的基于梯度的优化方法(SGD、Momentum、NAG)的学习率是全局的,且对所有参数是相同的。 参数的有些维度变化快,有些维度变化慢;有些维度是负的斜坡,有些维度是正的斜坡(如鞍点);采用相同的学习率并不科学,比如有的参数可能已经到了仅需要微调的阶段,但又有些参数由于对应样本少等原因,还需要较大幅度的调动。理想的方案是根据参数每个维度的变化率,采用对应的学习率。
学习率调参是很耗费计算资源的过程,所以很多工作投入到发明能够适应性地对学习率调参的方法,甚至是逐个参数适应学习率调参。很多这些方法仍需其他超参数设置,但普遍认为这些方法对于更广范围的超参数比原始的学习率方法有更良好的表现。下面将介绍一些在实践中可能遇到的常用适应算法:
AdaGrad(Adaptive Gradient )
Adagrad是一个由Duchi等提出的适应性学习率算法
# 假设有梯度和参数向量x
cache += dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)
变量cache的尺寸和梯度矩阵的尺寸相同,还跟踪了每个参数的梯度的平方和。这个一会儿将用来归一化参数更新步长,归一化是逐元素进行的。注意,接收到高梯度值的权重更新的效果被减弱,而接收到低梯度值的权重的更新效果将会增强。平方根的操作非常重要,如果去掉,算法的表现将会糟糕很多。用于平滑的式子eps
(一般设为 1e−4 到 1e−8 之间)防止出现除0的情况。
优点:不需要手动调整Learning Rate,默认值为0.01即可。
缺点:在分母中累积了梯度的平方,且此累积值单调递增,从而导致学习率单调递减,直至无限小(在深度学习中单调的学习率被证明通常过于激进且过早停止学习),从而不能再学到相关知识(AdaDelta、RMSprop、Adam专为解决此问题而生)。
AdaGrad方法给参数的每个维度给出适应的学习率。给不经常更新的参数以较大的学习率, 给经常更新的参数以较小的学习率。Google使用此优化方法“识别Youtube视频中的猫” 。
在AdaGrad中,每个参数 θi 在每一次更新时都使用不同的学习率。其公式如下: