自适应学习率调整的方法,常见包括AdaGrad、RMSprop、AdaDelta等。

学习率调整

在凸优化中,使用梯度下降算法时,通常期望学习率在一开始要保持大些以便提高收敛速度,但到最优点附件时为避免来回震荡,学习率应该小一些。也就是说,我们期望学习率以一定的规则先大后小。

学习率衰减

常见的学习率衰减如下,

指数衰减:

自然指数衰减:

分段衰减:按照一定的阶梯设置不同阶段的学习率。

补充:更多可参看Tensorflow文档

学习率预热

考虑到一半神经网络的训练都是随机初始化网络参数,刚开始梯度较大,如果一开始就设置较大的学习然后在慢慢衰减,会导致刚开始训练及其不稳定,导致收敛效果不好。为此,我们可以想,在最初的训练时,使用较少的学习率,减轻梯度的大幅变化,等梯度下降到一定程度后,再回复原有的学习率衰减策略,如自然指数衰减。我们称这以过程为学习率预热。实践上,常见的方法有,

其中$T$为预热的迭代次数。学习率预热可以认为这个阶段并不是训练过程,而是参数的特殊初始化方式。

以上方法导致学习率的调整和优化算法本身分离开来,我们的疑问是,学习率调整本身能否根据优化过程自动地调整。自动调整学习率有两个目标:

  • (1)当遇到landscape更抖的区域,学习率变小一点,当遇到landscape更平缓的区域,学习率更大一点。
  • (2)此外,考虑到每个维度的参数的收敛情况不同,我们应该为参数的收敛情况配置不同的学习率而不是原SGD中配置相同的学习率。

AdaGrad 挖过的坑

AdaGrad(Adaptive Gradient Algorithm)每次迭代时自适应地调整每个参数的学习率,当然,在工程上,这意味着我们需要额外的内存或显存来保持这些学习率参数。

AdaGrad的递推式如下,

其中$\gamma_{0}$为初始化学习率,$\odot$为按元素乘积。

容易看到,如果某个维度的参数其梯度较大,那么其当前学习率$\gamma_{0} \frac{1}{\sqrt{G_{t} + \varepsilon }}$就会较小,这达到我们想要的目标(1)。

根据上式很容易看出AdaGrad的问题,由于$G_{t}$在迭代过程中不断累积梯度,导致学习率逐步减小,如果在一定的迭代次数后训练还没有收敛,学习率已经相当小了,后续的收敛就更不可能了。这个问题RMSprop出场解决了。

RMSprop

RMSProp(Root Mean Square Propagation)认为AdaGrad计算$G_{t}$的方式太暴力了,前者用指数移动平均的方式平滑梯度累积结果,如下

其中$0 \lt \beta \lt 1$为衰减系数,表示过去$G_{t-1}$占当前时刻的$G_{t}$的比重。其实使用这种平滑方法在时间序列处理中可谓相当常规的。有趣的是,学习率在每次迭代中累积下来的数值可以看做是多维时间序列,因此在学习率调整上,并不妨碍我们使用更多时间序列中的平滑技术。

RMSprop梯度更新并没有改变,

RMSprop采用指数移动平均的方式平滑梯度累积可以解决AdaGrad中学习率呈现单调递减的问题。因为指数移动平均后的值可能比前一时刻的值小。如果你认为不够直观,可以考虑特殊情况$\boldsymbol{g}_{t}=0$,那么$G_{t}$比前一时刻要小。

RMSprop对AdaGrad的改进不复杂,在时间序列技术中是相当普遍的方法,但能够直接解决AdaGrad的问题,可谓大道至简。

Adadelta

Adadelta也是对AdaGrad的改进,前者通过梯度平方的指数移动平均来调整学习率,具体计算如下,

其中$\Delta \theta_{t-1}$为第$t-1$时刻的参数更新差,计算方法如下,

$\psi_{t-1}^{2}$为参数更新差$\Delta \theta_{t-1}$的平方的指数移动平均。$G_{t}$的计算方法和RMSprop一致。形式上,可以认为Adadelta把RMSprop的$\gamma_{0}$替换为动态的$\sqrt{\psi_{t-1}^{2} + \varepsilon}$,这样显得更智能,平衡学习率波动。

总结

本文介绍了学习率调整的一些策略,然后分别介绍基于学习率自适应调整的优化器:AdaGrad、RMSprop、AdaDelta。

参考文献

[1] Exponential_moving_average

[2] 《深度学习》bengio

[3] https://tensorflow.google.cn/api_docs/python/tf/keras/optimizers