6.8 AdaDelta算法#
在6.7节内容中我们介绍了一种自适应各个维度梯度的优化算法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$为学习率,也是一个可选参数。