ADADELTA:一种学习率自调整方法
摘要
针对梯度下降算法提出了一种新型的适用于高维情况下学习率设置方法,称之为ADADELTA。这种方法仅仅使用一阶导数信息,具有良好的动态适应性,并且与原始随机梯度下降算法相比具有更小的计算开销。这种方法不需要人工调节学习率而且对噪声梯度信息、不同模型结构、不同的数据模式以及超参数(某个参数是随机变量时,该参数的分布中的参数就是超参数,即参数的参数)的选择表现出较强的鲁棒性。我们在同一台电脑上进行MNIST数字识别以及在分布式环境中对一个大规模的声音数据库进行语音识别,与其他方法相比,我们的方法得到了更好的结果。
1.介绍
很多机器学习方法的目的都是不断更新参数集合 x 来优化目标函数 f(x) 。它们通常包含很多迭代程序用来求出 Δx 。我们用 xt 表示 t 时刻的 x ,那么这个简单的更新规则为
xt+1=xt+Δxt(1)
在文中我们认为,梯度
gt 的负方向就是下降最快的方向,梯度下降算法就是依靠这个方向来优化目标函数的。这个一般性的方法可以用来更新任何可以求导的参数,即:
Δxt=−ηgt(2)
其中
gt 表示参数在
t 时刻的梯度
∇=∂f(xt)∂xt ,
η 是学习率,学习率控制着每次在负梯度的方向上走多少。随机梯度下降算法(SGD, stochastic gradient descent)的做法是对于每一个样本或者从数据集中随机选出的一批样本都计算一次梯度,然后把该梯度的负方向作为当前最小化成本函数的估计方向。对于梯度下降算法需要选择学习率的超参数。
设置学习率通常要不断调整,而较好的学习率一般是手动设置的。 学习率设置的过高会使得系统发散,但选择的过小又会使学习过程变慢。对于很多问题而言,选择一个好的学习率更像是艺术而不是科学。
这项工作试图通过引入新的“动态学习率”来减轻原先需要反复选择学习率的重复任务。这种方法在每个维度上计算时只需要一阶导数信息,并且在每次在梯度下降的迭代计算时只增加额外少量计算量。另外,这种方法用到了一些超参数,但是我们发现这些超参数的选择对结果影响不大。这种方法的优点如下:
- 不需要人工设置学习率。
- 对超参数不敏感。
- 每维有单独的动态学习率。
- 能减小梯度下降算法的计算量。
- 对于大梯度、噪声和不同结构有较好的鲁棒性。
2.相关工作
梯度下降算法有很多改进方法,在这些改进方法中最强的就是牛顿的方法(Newton’method),它需要用到成本函数(cost function)的二阶导数信息:
Δxt=H−1tgt(3)
其中,
H−1t 在第
t 次迭代中二阶导数Hessian矩阵的转置。由此可以求出二次问题的最佳步长,但不幸的是在实际中我们无法对大模型进行这样的计算。因此,又提出了一些既可以改善一阶导数信息的使用又能近似于二阶导数信息的方法。
2.1 学习率的退火算法
在梯度下降算法的每一次迭代中,很多人尝试用启发式算法来预估一个好的学习率。他们试着在合适的时候加快学习的速度,在局部极小值附近则降低学习速度。我们将在后面探讨这些问题。
当梯度下降的成本函数的极小值附近时,这个参数会围着这个极小值来回震荡。一种解决方法是通过减小学习率来减缓参数的更新,这可以在验证准确率达到平稳时手动完成。另外,还有人提出通过查学习率表来完成学习率的自动退火,这种方法基于已经有多少数据已经训练完了,这是一种典型的通过增加额外的超参数来控制学习率下降快慢的方法。
2.2 对每维求一阶导方法
上面讨论的启发式退火算法对所有维度的参数仅仅更新一个全局学习率。因为每维的参数向量与整体成本函数之间的关系可能完全不同,因此能够抵消这种不同的每维学习率通常性能更好。
2.2.1 增加动量项
一种对每个维度都加速的方法是动量方法。这是一种非常简单的对SGD的扩展方法,已经成功应用了数十年。动量方法的核心思想是在梯度方向一致的地方加速,在梯度方向不断改变的地方减速。这种方法是通过追踪指数下降的过去的参数来完成的:
Δxt=ρΔxt−1−ηgt(4)
其中
ρ 是一个常数,它控制着以前的参数下降的快慢。这种方法对SGD给出了一种直观的改善,特别是对于像一些又长有窄的山谷一样的复杂的成本函数面时更为有效。尽管沿着山谷方向的梯度要比横跨山谷方向的梯度要小的多,但因为沿着山谷方向的梯度方向是一致的,因此动量项能加快其学习速度。在SGD中,由于沿着山谷方向的梯度的模很小,因此沿着山谷方向的速度很慢,并且每个维度都共用同一个固定的全局学习率,很难进行加速。这时选择一个较大的学习率有助于跨越山谷获得较大的参数更新,但可能会导致横跨山谷的来回震荡。当使用加入动量项时这种震荡会减弱,因为梯度不断改变会使得动量项减慢程序跨越山谷的速度。由于这种情况发生在每个维度上,因此沿着山谷的方向不会受影响。
2.2.2 ADAGRAD
最近有一种叫ADAGRAD的一阶方法在分布式环境下执行大规模学习任务时表现优异。这种方法仅仅使用一阶方法但表现出了一些二阶方法的特性。他的更新规则是:
Δxt=−η∑tτ=1g2τ−−−−−−−√gt(5)
这里,分母计算了以前所有时刻基于每个维度的偏置和全局学习率的梯度的范数。
与之前不同的是,这里有调节全局学习率的地方,并且每个维度都有自己的动态学习率。动态学习率与梯度的幅值成反比,梯度越大学习率越小,梯度越小学习率越大。它有一个非常好的特性,就像一个二阶方法一样,它随着时间的推移在各个维度上的速度会趋于一致。这使得它非常适合训练深度网络,因为深度网络的不同层的梯度的尺度通常是不同数量级。因此,对于最优学习率应该考虑到这一点。此外,分母中的梯度和与退火算法有相同的效果,都会随着时间的推移减少学习率。由于ADAGRAD没有考虑梯度的幅值,所以这种方法会对参数的初值和相对应的梯度敏感。如果初始梯度很大,在剩余的学习率将会变得很小。当然,可以通过增大全局学习率来解决这个问题,所以这使得ADAGRAD的学习率的选择变得很难。因为随着分母上梯度的平方不断积累,学习率会随着训练持续减小,最终会减小到零而导致训练停止。我们的ADADELTA方法有助于克服这种对超参数的选择的敏感性,同时能够避免学习率的持续下降。
2.3 使用二阶信息的方法
上面的方法仅仅使用了梯度和进化函数来优化目标函数,而二阶方法比如牛顿法或拟牛顿法则使用了Hessian矩阵,或者使用一些近似方法。虽然这些方法能够提供额外的曲率信息,但精确计算二阶导数却使得计算开销很大。
对于大模型,整个Hessian矩阵的二阶导数的计算量非常大。因此Becker和LecCun提出了一种对Hessian矩阵对角近似计算方法。这种对角阵计算方法需要额外前向传播和后向传播的计算,使得计算量比SGD增加了一倍。Hessian的对角阵 diag(H) 被计算完后,更新规则可以被写为:
Δxt=−1|diag(Ht)|+μgt(6)
其中,Hessian矩阵对角阵的绝对值用来保证永远跟随梯度的负方向,
μ 是一个很小的常数,用来改善Hessian在小曲率区域的条件。
最近,Schaul等人又提出了一种方法。这种方法包含3Hessian矩阵的对角阵,和ADAGRAD形式很像,用来减轻手动设置学习率的繁琐。它的更新公式为:
Δxt=−1|diag(Ht)|E[gt−w:t]2E[g2t−w:t]gt(7)
其中
E[gt−w:t] 是前
w 个梯度的期望值,
E[g2t−w:t] 是同样宽为
w 的窗口下梯度平方的期望值。Schaul等人还对窗口值
w 提出一种启发式算法。
3. ADADELTA 方法
本文提出的方法源自于ADAGRAD,主要是为了改善这个方法的两大缺陷:1)随着训练学习率逐渐减小。2)需要人工选择全局学习率。我们注意到我们的方法和Schaul等人的方法有些相似之处,两者比较如下:
在ADAGRAD方法中,分母从开始训练就对每一次迭代进行累加。每一个表达式都是正的,随着不断的累加,其和也不断的变大,使得每个维度上的学习率不断减小。多次迭代后,学习率会变得非常小。
3.1. 思想1:用窗口限制累加
不直接累加所有的梯度的平方,而是用一个宽度为 w 的窗口限制累加的历史梯度(即用 w 代替 t ,其中 t 指的是ADAGRAD中当前第 t 次迭代)。在窗口限制累加情况下,ADAGRAD中的分母就不会被累加到无穷大,这就变成了用最近几个的梯度来做局部预估。这就保证了若干次迭代之后学习能继续进行。
因为直接存储 w 个梯度的平方率有些低,因此把求和换成梯度平方的均值,我们的方法与直接计算相比计算量指数下降。假设在 t 时刻的平均值为 E[g2]t ,然后我们只需计算:
E[g2]t=ρE[g2]t−1+(1−ρ)g2t(8)
其中
ρ 是下降常数,和我们在动量方法中用的很像。在参数更新的时候我们需要计算出它的平方根,所以这就变成了求直到时间
t 前的梯度平方的均方根(RMS,root mean square):
RMS[g]t=E[g2]t+ϵ−−−−−−−−√(9)
其中加入常数
ϵ 是为了改善上式作为分母的条件(如避免分母为0等)。至此,我们可以得出更新规则为:
Δxt=−ηRMS[g]t(10)
算法 1 计算ADADELTA在 t+1 时刻的值 |
需要:下降率 ρ ,常数 ϵ |
需要:初始参数 x1 |
初始化求和变量
E[g2]0=0,E[Δx2]0=0
|
for t=1:T |
|
累加梯度:
E[g2]t=ρE[g2]t−1+(1−ρ)g2t
|
计算更新值:
Δxt=−RMS[Δx]t−1RMS[g]tgt
|
累加更新值:
E[Δx2]t=ρE[Δx2]t−1+(1−ρ)Δx2t
|
|
end for |
3.2. 思想2:带Hessian逼近的正确修正单元
当提到更新参数 Δx 时,不得不提到 x ,它们应该是相匹配。假设某个参数有对应有一些更新单元,那么这些参数发生改变时,它们的更新单元也应该响应改变。在SGD,动量法,ADAGRAD中这不是问题。在SGD和动量法中,更新单元只和梯度有关,与参数无关:
units of Δx∝units of g∝∂f∂x∝1units of x(11)
注: log 一阶导数正比于 1x
假设成本函数 f 没有单位,ADAGRAD同样没有正确的单位,因为更新包含了梯度的比率,因而更新没有单位。
相对比而言,使用Hessian或者Hessian逼近法等二阶信息的方法,比如牛顿法,可以在参数更新中修正单位:
Δx∝H−1g∝∂f∂x∂2f∂x2∝units of x(12)
注: log 二阶导数正比于 1x1x1x=x