梯度下降中的优化策略

模型训练中的学习率是最重要的超参数之一,目前的学习率优化方法主要有两大类,一类可以在训练过程中定义存在其他动态的超参数参与的调整更新规则,另一类是预先设定的更新(一般是衰减)规则,比如线性衰减,指数衰减等。

min-batch SGD从训练集中随机fetch出大小为m的batch,执行更新规则如下:

动量法在SGD之上考虑了之前的梯度方向对当前更新梯度的影响,即用动量$\mathbf{m}$来代替梯度更新超参数,动量的计算依赖上一时刻的动量和当前梯度(也可以理解为之前的累计梯度的信息):

动量因子$\mu$可以描述之前累计的梯度对当前梯度的影响,假设在SGD过程中梯度抖动的十分厉害(方向,大小),那么引入动量可以一定程度上对这种抖动起到抑制作用。反之如果保持相对平稳,那么动量可以起到放大梯度的作用(相当于增大步长)。

此外还有一种称为Nesterov动量的变式,在计算$\mathbf{g}_t$时,用的不是参数$\theta_t$,而是施加了动量$\mathbf{m}_t$之后的参数,即:

之后再进行$\mathbf{m}_{t + 1}, \theta_{t + 1}$的更新。

下面是三个常见的自适应学习率调整方法,即AdaGrad,RMSProp,Adam:

AdaGrad

AdaGrad每一次会更急累计更新梯度的平方和,对当前得出的梯度矩阵进行缩放。缩放大小反比与该平方和的平方根,即累计损失越多的方向学习率越高:

注:缩放方式为对应元素的缩放。

RMSProp

从AdaGrad的更新公式可以看出,累积量$\mathbf{n}_t$在时间轴上是没有加权的,RMSProp丢弃较远的历史信息,将累计平方梯度更新公式变换为:

Adam

Adam结合了动量和和RMSProp,将动量并入一阶矩的估计,同时加入偏差修正,更新过程如下:

除此之外还有AdaDelta,AdaDec等优化方法在相应的论文中,这里有时间再加上……

一些常用衰减规则主要有:

  1. Exponential Scheduling:在nnet2/3中使用的是指数衰减,计算出训练需要的轮数,在设置的初始学习率和终止学习率之间进行指数衰减。
  2. Power Scheduling
  3. Performance Scheduling:一般在测试集上的loss不再下降时(或者满足某种折半条件),将学习率乘以一个decay rate,比如在nnet1中进行折半(乘以0.5)。

参考文献

  • DeepLearning Book第八章
  • An empirical study of learning rates in deep neural networks for speech recognition