Adadelta:一种自适应学习率方法.

梯度下降算法可以表示为:

\[x_{t+1} = x_t - \eta g_t\]

其中学习率$\eta$需要手动调整。过大的学习率可能会使过程不收敛甚至发散,过低的学习率会导致收敛速度缓慢。本文提出了一种动态学习率算法Adadelta,主要特点如下:

Adadelta是对Adagrad算法的改进。Adagrad算法的梯度更新公式如下:

\[x_{t+1} = x_t - \frac{\eta}{\sqrt{\sum_{\tau=1}^{t}g_{\tau}^2}} g_t\]

Adagrad算法为参数的每个维度设置了不同的动态学习率。梯度较大的参数维度具有较小的学习率,梯度较小的参数维度具有较大的学习率,这使得不同维度上的参数更新是平衡的。此外,随着训练轮数的推移,学习率逐渐衰减。

Adagrad算法也存在一些缺点:

改进①:沿窗口累积

不累计所有轮数的平方梯度,而是指定累计最近$w$次迭代中的平方梯度,通过这种窗口式累计,总平方梯度不会累积到无穷大,而是使用最近一些轮数的梯度进行局部估计。

由于存储最近的$w$次平方梯度需要额外的内存和运算时间,因此采用指数衰减平均的方式累计平方梯度:

\[G_t = \rho G_{t-1} + (1-\rho)g_t^2\]

超参数$\rho$为衰减率,此时梯度更新公式如下:

\[x_{t+1} = x_t - \frac{\eta}{\sqrt{G_t+\epsilon}} g_t\]

改进②:使用Hessian近似校正单位

参数更新时应保证具有相同的单位,如果参数$x$具有一些假设单位,则对该参数的更新量$\Delta x$也应该具有相同的单位。梯度更新属于一阶优化方法,在更新时无法保证更新量$\Delta x$与原参数$x$具有相同的单位:

\[\Delta x ∝ g = \frac{\partial f}{\partial x} ∝ \frac{1}{\partial x}\]

注意到使用Hessian矩阵的二阶优化方法(如牛顿法)具有正确的参数更新单位:

\[\Delta x ∝ H^{-1}g = \frac{\frac{\partial f}{\partial x}}{\frac{\partial^2 f}{\partial x^2}} ∝ x\]

因此考虑使用与$H^{-1}$具有相同单位(二阶导数的逆)的数值对梯度$g$的单位进行修正,注意到:

\[\Delta x = \frac{\frac{\partial f}{\partial x}}{\frac{\partial^2 f}{\partial x^2}} \to \frac{1}{\frac{\partial^2 f}{\partial x^2}} = \frac{\Delta x}{\frac{\partial f}{\partial x}}\]

由于梯度的方均根已经在改进①中出现在分母上校正,因此在分子上添加参数的更新量进行校正。具体地,采用指数衰减平均的方式累计平方参数更新量:

\[ΔX_t = \rho ΔX_{t-1} + (1-\rho)\Delta x_{t}^2\]

Adagrad算法最终的参数更新量和梯度更新公式如下:

\[Δx_t = -\frac{\sqrt{ΔX_{t-1}+\epsilon}}{\sqrt{G_t+\epsilon}} g_t\] \[x_{t+1} = x_t +Δx_t\]