更新于 2026年6月29日

6.8 AdaDelta算法#

「第6.7节 AdaGrad算法原理:自适应学习率优化方法」内容中我们介绍了一种自适应各个维度梯度的优化算法AdaGrad,其核心思想是根据每个参数历史梯度的累积情况来自适应计算下一时刻各个参数的梯度值。在本节内容中我们将介绍另外一种基于AdaGrad算法改进的,同样也是自适应各维度梯度的模型优化算法AdaDelta,并且值得一提的是在AdaDelta[1]算法中我们并不需要指定一个全局的学习率。

6.8.1 AdaDelta动机#

尽管AdaGrad算法能够自适应地为目标函数中的每个权重参数计算得到一个梯度值,但它最大的弊端在于当优化迭代过程太久时梯度的累积值将会变得过大,导致学习率持续降低最终可能使得目标函数无法收敛。同时,在已经介绍过的几种优化算法中我们都需要通过手动设定一个全局学习率来辅助控制梯度的大小,但过大的学习率往往容易使得迭代过程震荡,而过小的学习率则容易陷入局部最优解。因此理想状况下应该是较大梯度的参数对应使用较小的学习率,而较小梯度的参数应该使用较大的学习率。

基于这样的动机,塞勒(Zeiler)等人[1]提出了另外一种自适应学习率的优化算法AdaDelta,其核心思想便是以梯度平方的移动平均来解决AdaGrad中历史梯度累积过大的问题,并同时提出通过历史梯度信息的比值来自适应学习率的做法,使得不同权重参数在更新过程中能够以合适尺度的梯度进行。也正是如此,我们在使用AdaDelta对目标函数进行优化时并不需要指定一个全局学习率。

6.8.2 AdaDelta原理#

AdaDelta算法的原理主要是基于对学习率的自适应调整,解决了一些传统优化算法中学习率难以选取的问题。具体地,设目标函数在第$t$时刻关于所有权重参数的梯度为$g_t$,累积梯度为$v_t$且$v_0=0$,更新梯度为$u_t$且$u_0=0$,移动平均衰减系数为$\rho$,权重参数为$\theta_t$,则第$t+1$时刻的结果$\theta_{t+1}$可通过如下公式计算

$$ \begin{aligned} v_{t+1}&=\rho v_{t}+(1-\rho)g_{t+1}\odot g_{t+1}\\[1ex] \Delta x_{t+1}&=\frac{\sqrt{u_{t}+\epsilon}}{\sqrt{v_{t+1}+\epsilon}}g_{t+1}\\[1ex] u_{t+1}&=\rho u_{t}+(1-\rho)\Delta x_{t+1}\odot \Delta x_{t+1}\\[1ex] \theta_{t+1}&=\theta_t-\gamma\Delta_{t+1} \end{aligned}\tag{6-31} $$

其中$\odot$表示按位乘,$\gamma$为学习率是PyTorch中的一个可选参数,当$\gamma=1$时即不考虑指定学习率,$\epsilon$为平滑项。

从式(6-31)累积梯度$v_t$的计算过程可知,由于采用了移动平均衰减策略所以只会累积最近时刻的梯度信息,进而避免了AdaGrad算法中累积梯度过大的问题。同时还可以发现,$\rho$越小则表示累积的梯度信息越少,当$\rho=0$时则表示不对历史梯度进行累积。进一步,更新梯度$u_t$同样也是根据移动平均衰减策略计算得到,它累积的是每个时刻实际用于梯度下降算法中的参数梯度。根据$\Delta x_{t}$的计算过程可知,当$t+1$时刻的梯度$g_{t+1}$变大时分母也会变大使得$\Delta x_{t}$整体变小,而当$t+1$时刻的梯度$g_{t+1}$变小时分母也会相应变小使得$\Delta x_{t}$整体变大。这就使得在训练过程中,对于梯度较大的参数学习率将相对减小,对于梯度较小的参数学习率将相对增大,从而平衡了不同参数的调整幅度。

除此以外,蒂勒曼(Tieleman)等人[2]同样也提出了一种类似但更为简单的学习率自适应优化算法RMSprop,并同时也采用了移动平均策略来解决AdaGrad算法中学习率衰减过快的问题。具体地,其计算过程如下所示

$$ \begin{aligned} v_{t+1}&=\rho v_{t}+(1-\rho)g_{t+1}\odot g_{t+1}\\[1ex] \theta_{t+1}&=\theta_t-\frac{\gamma}{\sqrt{v_{t+1}+\epsilon}}g_{t+1} \end{aligned}\tag{6-32} $$

其中$\gamma$为学习率,也是一个可选参数。

从式(6-32)可以看出,RMSprop可以看做是AdaDelta算法的一个简化版本,它仅仅只通过历史梯度平方的移动平均来得到每个权重参数自适应的学习率,并且同样也能实现当参数梯度较大时自适应较小学习率,当参数梯度较小时自适应较大学习率的目的。

总体来说,这两种自适应学习率优化算法在模型训练过程中都能使得参数的调整更为平稳,同时也无需手动设置全局学习率,有助于算法更好地适应不同参数的变化范围。

6.8.3 使用示例#

在介绍完AdaDelta和RMSprop算法的基本原理以后,我们再来看如何使用这两种优化算法。在PyTorch框架中,我们可以分别通过torch.optim.AdaDelta()torch.optim.RMSprop()模块来分别使用这两种自适应学习率的梯度下降算法。下面分别对其中的几个关键参数进行介绍。

1. AdaDelta()使用示例

1 class Adadelta(Optimizer):
2     def __init__(self, params,lr=1.0, rho=0.9, eps=1e-6, weight_decay=0.):
4     pass

在上述代码中,第2行params表示指定模型的权重参数;lr表示指定学习率,这里只是PyTorch框架中扩展的一个参数,默认为1,即此时等价于不指定学习率;rho为移动平均衰减系数;eps为平滑项系数。最后只需要在模型训练时指定优化器为Adadelta便可使用该优化器来最小化目标函数。

2. RMSprop()使用示例

1 class RMSprop(Optimizer):
2     def __init__(self, params, lr=1e-2, alpha=0.99, eps=1e-8,
3         weight_decay=0, momentum=0)
4     pass

在上述代码,第2行lr为学习率,PyTorch中给定的默认值是0.01;alpha移动平均的衰减系数,即式(6-32)中的$\rho$。第3行momentum维度动量系数,是Pytorch中基于原始RMSprop拓展部分的实现,即对式(6-32)中学习率乘以梯度这一项考虑动量策略,当momentum=0时机等价于式(6-32),详情可见torch.optim.RMSprop()接口的说明文档。

6.8.4 小结#

在本节内容中,我们首先介绍了AdaDelta算法的动机,即使得目标函数在优化过程中梯度较大的参数能够使用较小的学习率,而梯度较小的参数能够使用较大的学习率,来对权重参数进行更新;然后介绍了AdaDelta算法的基本原理以及它所存在的弊端,并同时也介绍了另外一种简单版的学习率自适应算法RMSprop;最后介绍了如何在PyTorch中使用这两种算法来优化目标函数。在下一节内容中,我们将继续介绍同时结合多种动量和自适应学习率等多种策略的优化算法Adam。

引用#

[1] Zeiler M D. Adadelta: an adaptive learning rate method[J]. arXiv preprint, 2012, arXiv:1212.5701.

[2] Tieleman T, Hinton G E. Lecture 6.5 - RMSProp, COURSERA: Neural Networks for Machine Learning. Technical report, 2012.

您当前阅读的内容现已出版,点击右侧了解

10章教学课件,400余幅示意插图、40个示例源代码,助力读者轻松迈入深度学习的大门!

查看详情
阅读 --