ADADELTA: AN ADAPTIVE LEARNING RATE METHOD
参考:[自适应学习率调整AdaDelta](https://www.cnblogs.com/neopenx/p/4768388.html)
我们提出了一种新的梯度下降的逐维学习率方法ADADELTA。该方法仅使用一阶信息随时间动态地适应,并且除了一般的随机梯度下降外,具有最小的计算开销。该方法不需要人工调整学习速率,对噪声梯度信息、不同模型结构选择、不同数据模式和超参数选择具有鲁棒性。与其他方法相比,我们在分布式集群环境下,在单机和大规模语音数据集上进行MNIST数字分类时,取得了令人满意的结果。
1. INTRODUCTION
许多机器学习方法的目的是更新一组参数x,以优化目标函数f(x)。将第t次迭代的参数表示为 x t x_t xt,这个简单的更新规则为:
x t + 1 = x t + Δ x t x_{t+1}=x_t+\Delta x_t xt+1=xt+Δxt (1)
本文考虑梯度下降算法,该算法试图通过跟踪梯度
g
t
g_t
gt的负方向给出的最陡下降方向来优化目标函数。此一般方法可用于更新任何可获得导数的参数:
Δ
x
t
=
−
η
g
t
\Delta x_t=-\eta g_t
Δxt=−ηgt (2)
其中
g
t
g_t
gt为第t次迭代时参数的梯度
∂
f
(
x
t
)
∂
x
t
\frac{\partial f(x_t)}{\partial x_t}
∂xt∂f(xt),
η
\eta
η是一个学习率,它控制在负梯度方向上的步长。对于从数据集中选择的每一个新样本或每一批样本,按照这个负梯度给出一个局部估计,即哪个方向的代价最小,称为随机梯度下降(SGD)。梯度下降算法对各参数的梯度解析推导往往比较简单,但要求选择学习率超参数。
设定学习速率通常需要一个调整过程,在该过程中,手动选择可能的最高学习速率。选择高于此速率会导致系统在目标函数方面出现分歧,而选择此速率过低会导致学习缓慢。对于许多问题来说,确定一个好的学习率更像是一门艺术而不是科学。
这项工作试图通过引入一个新的动态学习率来减轻选择学习率的任务,该动态学习率是基于每个维度仅使用一阶信息计算的。这需要在梯度下降的每次迭代中进行少量的额外计算。另外,虽然该方法中存在一些超参数,但我们发现它们的选择并没有显著地改变结果。这种方法的好处如下:
没有需要手动设置的学习率
超参数不敏感
每个维度独立的动态学习速率。
梯度下降的最小计算。
鲁棒的大梯度,噪音和架构的选择。
适用于单机或分布式环境。
2. RELATED WORK
梯度下降算法有许多修改,其中最强大的修改是牛顿法,它需要成本函数的二阶导数:
Δ x t = H t − 1 g t \Delta x_t=H^{-1}_tg_t Δxt=Ht−1gt (3)
H t − 1 H^{-1}_t Ht−1为第t次迭代计算的二阶导数海森矩阵的逆。这决定了二次型问题的最优步长,但不幸的是,在大型模型的实际计算中是不允许的。因此,提出了许多其他的方法来改进一阶信息的使用或近似二阶信息。
2.1. Learning Rate Annealing
已经有好几次尝试使用启发式方法在梯度下降的每次迭代中估计一个好的学习率,这些尝试要么在适当的时候加快学习速度,要么在接近局部极小值时减慢学习速度。在这里我们考虑后者。
当梯度下降接近成本曲面的极小值时,参数值可以围绕极小值来回振荡。一种防止这种情况的方法是通过降低学习速率来减慢参数更新的速度。当验证精度趋于稳定时,可以手动完成。另外,还提出了学习速率表[1],以根据通过数据完成的阶段数自动退火学习速率。这些方法通常会添加额外的超参数来控制学习速率衰减的速度。
η0为初始学习率,d为衰减常数,通常为
1
0
−
3
10^{-3}
10−3
模拟退火基于一个梯度法优化的事实:
在优化过程中,Weight逐渐变大,因而需要逐渐减小学习率,保证更新平稳。
2.2. Per-Dimension First Order Methods
上面讨论的启发式退火过程修改了适用于参数所有维度的单个全局学习率。由于参数向量的每个维度可以以完全不同的方式与总体成本相关,因此能够补偿这些差异的每个维度的学习率通常是有利的。
2.2.1. Momentum
加速每维训练的一种方法是动量法[2]。这也许是几十年来成功使用的SGD最简单的扩展。动量背后的主要思想是沿着梯度一致指向同一方向的维度加速前进,并沿着梯度符号持续变化的维度减慢前进。这是通过跟踪具有指数衰减的过去参数更新来完成的:
Δ x t = ρ Δ x t − 1 − η g t \Delta x_t=\rho\Delta x_{t-1}-\eta g_t Δxt=ρΔxt−1−ηgt (4)
ρ \rho ρ 是一个常数,控制前一个参数更新的衰减。在优化复杂的成本曲面(如狭长的山谷)时,与SGD相比,这是一个很好的直观改进。沿着山谷的梯度,尽管比穿过山谷的梯度小得多,但通常是在同一个方向上,因此动量项积累起来以加快进展。在SGD中,由于梯度幅度较小,且各维度共享的固定全局学习率不能加快进度,因此沿着山谷的进展将是缓慢的。为SGD选择更高的学习率可能会有所帮助,但整个山谷的维度也会进行更大的参数更新,这可能会导致整个山谷前后的振荡。当使用动量时,这些振荡会得到缓解,因为梯度的符号会改变,因此动量项会减弱这些更新,从而减缓整个山谷的进展。同样,这发生在每个维度,因此沿着山谷的进展不受影响。
ρ为动量因子,通常设为0.9
在更新中引入0.9这样的不平衡因子,使得:
★在下降初期,使用前一次的大比重下降方向,加速。
★在越过函数谷面时,异常的学习率,会使得两次更新方向基本相反,在原地”震荡“
此时,动量因子使得更新幅度减小,协助越过函数谷面。
★在下降中后期,函数面局部最小值所在的吸引盆数量较多,一旦陷进吸引盆当中,
Gradient→0,但是前后两次更新方向基本相同。
此时,动量因子使得更新幅度增大,协助跃出吸引盆
#### 2.2.2. ADAGRAD
最近一种称为ADAGRAD[3]的一阶方法在分布式环境中的大规模学习任务中显示了显著的良好效果[4]。该方法只依赖于一阶信息,但具有二阶方法和退火的一些性质。ADAGRAD的更新规则如下:
Δ x t = − η Σ τ = 1 t g τ 2 g t \Delta x_t=-\frac{\eta}{\sqrt{\Sigma^t_{\tau=1}g_\tau^2}}g_t Δxt=−Στ=1tgτ2ηgt (5)
这里分母计算每个维度所有先前梯度的 l 2 l_2 l2范数 η \eta η是一种全局学习所有维度共享的学习率。虽然存在手动调整的全局学习速率,但每个维度都有自己的动态速率。由于这种动态速率随梯度大小的倒数而增长,大梯度的学习速率较小,小梯度的学习速率较大。这有一个很好的特性,就像在二阶方法中一样,随着时间的推移,每个维度上的进度都是均衡的。这对于训练深层神经网络是非常有益的,因为每一层的梯度尺度往往相差几个数量级,所以最优学习率应该考虑到这一点。此外,分母中梯度的累积具有与退火相同的效果,随着时间的推移降低了学习速率。
由于在ADAGRAD中考虑了梯度的大小,因此该方法对参数的初始条件和相应的梯度比较敏感。如果初始梯度较大,则剩余训练的学习率将较低。这可以通过提高全局学习率来解决,使ADAGRAD方法对学习率的选择敏感。此外,由于分母中平方梯度的不断累积,学习率在整个训练期间将继续下降,最后降为零,完全停止训练,我们建立了ADADELTA方法,克服了对超参数选择的敏感性,避免了学习率的持续下降。
2.3. Methods Using Second Order Information
上述方法仅利用梯度和函数求值来优化目标,而二阶方法如牛顿法或拟牛顿法则利用Hessian矩阵或其近似。虽然这为优化提供了有用的附加曲率信息,但计算精确的二阶信息通常是昂贵的。由于计算整个二阶导数的Hessian矩阵对于大型模型来说计算成本太高,Becker和LecCun[5]提出了Hessian的对角近似。这种对角近似可以通过模型中的一个额外的正向和反向传播来计算,有效地在SGD上加倍计算。一旦Hessian的对角线 d i a g ( H ) diag(H) diag(H)被计算出来,更新规则变成:
Δ x t = − 1 ∣ d i a g ( H t ) ∣ + μ g t \Delta x_t=-\frac{1}{|diag(H_t)|+\mu}g_t Δxt=−∣diag(Ht)∣+μ1gt (6)
其中,该对角Hessian的绝对值用于确保始终遵循负梯度方向,并且
μ
\mu
μ是一个小常数,用于改善Hessian对小曲率区域的条件(避免分母为0)。Schaul等人的最新方法。[6] 引入了对角Hessian和ADAGRAD结合在一起的方法,以减少对手工指定学习速率的需要。此方法使用以下更新规则:
**其中
E
[
g
t
−
w
:
t
]
E[g_{t-w:t}]
E[gt−w:t]是之前w个梯度的期望值,
E
[
g
t
−
w
:
t
2
]
E[g_{t-w:t}^2]
E[gt−w:t2]是同一窗口w上的梯度的平方的期望值。**Schaul等人还为这个窗口大小w引入了一种启发式方法(有关详细信息,请参阅[6])。
3. ADADELTA METHOD
本文提出的思想来源于ADAGRAD[3],目的是改进该方法的两个主要缺点:1)在整个训练过程中学习率持续下降,2)需要手动选择全局学习率。在推导出我们的方法后,我们注意到与Schaul等人的一些相似之处。[6] ,将与下面进行比较。在ADAGRAD方法中,分母从训练开始的每次迭代中累积平方梯度。由于每个学期都是正的,这个累积的总和在整个训练过程中继续增长,有效地缩小了每个维度的学习率。经过多次迭代后,这个学习速率将变得非常小。
3.1. Idea 1: Accumulate OverWindow
我们没有一直累积平方梯度之和,而是将累积的过去梯度的窗口限制为某个固定大小的w(而不是大小t,其中t是ADAGRAD中的当前迭代)。有了这个加窗累加,ADAGRAD的分母不能累加到无穷大,而是使用最近的梯度成为一个局部估计。这确保了即使在多次更新迭代之后,学习仍能继续取得进展。
由于存储以前的平方梯度是低效的,我们的方法实现这种积累作为指数衰减平均的平方梯度。假设t时刻的滑动平均值为 E [ g 2 ] t E[g^2]_t E[g2]t,则计算:
E [ g 2 ] t = ρ E [ g 2 ] t − 1 + ( 1 − ρ ) g t 2 E[g^2]_t=\rho E[g^2]_{t-1}+(1-\rho)g^2_t E[g2]t=ρE[g2]t−1+(1−ρ)gt2 (8)
其中 ρ \rho ρ是一个类似于动量法的衰变常数。因为我们在参数更新中需要这个量的平方根,所以这实际上成为时间t之前的先前平方梯度的均方根:
常数 ε \varepsilon ε是为了更好地满足分母条件而添加的,如[5]。由此产生的参数更新为:
Δ
x
t
=
−
η
R
M
S
[
g
]
t
g
t
\Delta x_t=-\frac{\eta}{RMS[g]_t}g_t
Δxt=−RMS[g]tηgt (10)
3.2. Idea 2: Correct Units with Hessian Approximation
4.2. Sensitivity to Hyperparameters
3047)]
[外链图片转存中…(img-7wTRnvqa-1593961503049)]
[外链图片转存中…(img-zhqIHz8t-1593961503049)]
4.2. Sensitivity to Hyperparameters
虽然经过许多阶段的训练,动量收敛到比ADADELTA更好的最终解,但它对学习率的选择非常敏感,SGD和ADAGRAD也是如此。在表1中,我们改变了每种方法的学习率,并使用校正线性单元作为激活函数(relu),显示了6个阶段的训练后的测试集错误。每个列的最佳设置用于生成图1。对于SGD、动量或ADAGRAD,需要将学习速率设置为正确的数量级,高于该数量级的解通常会发散,低于该数量级的解则优化过程缓慢。我们可以看到,与表2中的ADADELTA相比,每种方法的这些结果都是高方差的,其中ADADELTA两个超参数不会显著改变性能。