【转】自适应学习率算法

神经网络研究员早就意识到学习率肯定是难以设置的超参数之一,因为它对模型的性能有显著的影响。损失通常高度敏感于参数空间中的某些方向,而不敏感于其他。动量算法可以在一定程度缓解这些问题,但这样做的代价是引入了另一个超参数。在这种情况下,自然会问有没有其他好的方法。如果我们相信方向敏感度在某种程度上是轴对齐的,那么每个参数设置不同的学习率,在整个学习过程中自动适应这些学习率便是有道理的。本节将简要说明这些自适应参数学习率的算法。

AdaGrad

优化算法中,无论是梯度下降、随机梯度下降、小批量随机梯度下降还是使用动量法,目标函数自变量的每一个元素在相同时刻都使用同一个学习率来自我迭代。

举个例子,假设目标函数为 $f$,自变量为一个多维向量 $[x_1, x_2]^\top$,该向量中每一个元素在更新时都使用相同的学习率。例如在学习率为 $\eta$ 的梯度下降中,元素 $x_1$ 和 $x_2$ 都使用相同的学习率$\eta$来自我迭代:

如何让 $x_1$ 和 $x_2$ 使用不同的学习率自我迭代?Adagrad就是一个在迭代过程中不断自我调整学习率,并让模型参数中每个元素都使用不同学习率的优化算法。

Adagrad的算法会使用一个小批量随机梯度 $\boldsymbol{g}_t$ 按元素平方的累加变量 $\boldsymbol{s}_t$ 。在时间步0,adagrad将 $\boldsymbol{s}_0$ 中每个元素初始化为0。在时间步 $t$,首先将小批量随机梯度 $\boldsymbol{g}_t$ 按元素平方后累加到变量 $\boldsymbol{s}_t$:

其中 $\eta$ 是初始学习率且 $\eta > 0$,$\epsilon$ 是为了维持数值稳定性而添加的常数,例如 $10^{-7}$。需要注意其中按元素开方、除法和乘法的运算。这些按元素运算使得目标函数自变量中每个元素都分别拥有自己的学习率。

在凸优化背景中,AdaGrad 算法具有一些令人满意的理论性质。然而,经验上已经发现,对于训练深度神经网络模型而言,从训练开始时积累梯度平方会导致有效学习速率过早和过量的减小。AdaGrad 在某些深度学习模型上效果不错,但不是全部。

RMSProp

在AdaGrad中,由于调整学习率时分母上的变量 $\boldsymbol{s}_t$ 一直在累加按元素平方的小批量随机梯度,目标函数自变量每个元素的学习率在迭代过程中一直在降低(或不变)。所以,当学习率在迭代早期降得较快且当前解依然不佳时,Adagrad在迭代后期由于学习率过小,可能较难找到一个有用的解。为了应对这一问题,RMSProp算法对Adagrad做了一点小小的修改。

不同于Adagrad里状态变量 $\boldsymbol{s}_t$ 是截至时间步 $t$ 所有小批量随机梯度 $\boldsymbol{g}_t$ 按元素平方和,RMSProp将这些梯度按元素平方做指数加权移动平均。具体来说,给定超参数 $0 \leq \gamma < 1$,RMSProp在时间步 $t>0$ 计算:

其中 $\eta$ 是初始学习率且 $\eta > 0$,$\epsilon$ 是为了维持数值稳定性而添加的常数,例如 $10^{-8}$ 。

RMSProp只在Adagrad的基础上修改了变量 $\boldsymbol{s}$ 的更新方法:对平方项 $\boldsymbol{g}_t \odot \boldsymbol{g}_t$ 从累加变成了指数加权移动平均。由于变量 $\boldsymbol{s}$ 可看作是最近 $1/(1-\gamma)$ 个时刻的平方项 $\boldsymbol{g}_t \odot \boldsymbol{g}_t$ 的加权平均,自变量每个元素的学习率在迭代过程中避免了“只降不升”的问题。

经验上,RMSProp 已被证明是一种有效且实用的深度神经网络优化算法。目前它是深度学习从业者经常采用的优化方法之一。

Adam

Adam是一个组合了动量法和RMSProp的优化算法,使用了动量变量 $\boldsymbol{v}$ 和RMSProp中变量 $\boldsymbol{s}$,并将它们中每个元素初始化为0。在每次迭代中,时刻 $t$ 的小批量随机梯度记作 $\boldsymbol{g}_t$。

和动量法类似,给定超参数 $\beta_1$ 且满足 $0 \leq \beta_1 < 1$(算法作者建议设为0.9),将小批量随机梯度的指数加权移动平均记作动量变量 $\boldsymbol{v}$,并将它在时刻 $t$ 的值记作 $\boldsymbol{v}_t$:

和RMSProp中一样,给定超参数 $\beta_2$ 且满足 $0 \leq \beta_2 < 1$(算法作者建议设为0.999), 将小批量随机梯度按元素平方后做指数加权移动平均得到 $\boldsymbol{s}$ ,并将它在时刻 $t$ 的值记作 $\boldsymbol{s}_t$:

需要注意的是,当 $t$ 较小时,过去各时刻小批量随机梯度权值之和会较小。例如当 $\beta_1 = 0.9$ 时,$\boldsymbol{v}_1 = 0.1\boldsymbol{g}_1$。为了消除这样的影响,对于任意时刻 $t$ ,我们可以将 $\boldsymbol{v}_t$ 再除以 $1 - \beta_1^t$ ,从而使得过去各时刻小批量随机梯度权值之和为1。这也叫做偏差修正。在Adam算法中,我们对变量 $\boldsymbol{v}$ 和 $\boldsymbol{s}$ 均作偏差修正:

接下来,Adam算法使用以上偏差修正后的变量 $\hat{\boldsymbol{v}}_t$ 和 $\hat{\boldsymbol{s}}_t$,将模型参数中每个元素的学习率通过按元素运算重新调整:

其中 $\eta$ 是初始学习率且 $\eta > 0$,$\epsilon$ 是为了维持数值稳定性而添加的常数,例如 $10^{-8}$。和Adagrad、RMSProp以及Adadelta一样,目标函数自变量中每个元素都分别拥有自己的学习率。

最后,时刻 $t$ 的自变量 $\boldsymbol{x}_t$ 的迭代步骤与小批量随机梯度下降类似:

本文转自动手深度学习

持续技术分享,您的支持将鼓励我继续创作!