参数优化的Adam法

本文内容主要摘抄自NNDL和科学空间

批量梯度下降法(Batch gradient descent)

定义可导的损失函数\(L(\cdot)\),给定批量大小(batch size\(K\),每次选取\(K\)个训练样本\(\cal{S}_t=\{(\bf{x}^{(k)},\bf{y}^{(k)})\}^{K}_{k=1}\)。第\(t\)次迭代时,损失函数关于参数\(\theta\)的偏导数为

\[{\frak{g}}_t(\theta)=\frac{1}{K}\sum_{\bf{(x,y)}\in{\cal{S}_t}}{\frac{\partial{\cal{L}({\bf{y}},f({\bf{x}};\theta))}}{\partial\theta}} \]

\(t\)次更新的梯度\(g_t\)定义为

\[{\bf{g}_t}\triangleq{\frak{g}}_t(\theta_{t-1}) \]

使用梯度下降来更新参数

\[\theta_t\leftarrow\theta_{t-1}-\alpha g_t \]

其中\(\alpha\gt0\)为学习率

每次迭代时参数更新的差值\(\Delta\theta_t\)定义为

\[\Delta\theta_t\triangleq\theta_t-\theta_{t-1} \]

差值\(\Delta\theta_t\)和梯度\(\bf{g}_t\)的方向不需要完全一致。

影响小批量梯度下降法的主要因素有:

  1. 批量大小𝐾
  2. 学习率𝛼
  3. 梯度估计

Stochastic Gradient Descent (SGD)

Mini-Batch Gradient Descent (MBGD)


学习率调整

AdaGrad算法(Adaptive Gradient Algorithm)[Duchi et al., 2011]

借鉴 ℓ2 正则化的思想,每次迭代时自适应地调整每个参数的学习率

在第\(𝑡\)次迭代时, 先计算每个参数梯度平方的累计值

\[G_t=\sum_{\tau=1}^{t}{\bf{g_{\tau}\odot g_{\tau}}} \]

其中\(\odot\)为按元素乘积,\(\bf{g_{\tau}}\in \mathbb{R}^{|\theta|}\)是第\(\tau\)次迭代时的梯度。

AdaGrad算法的参数更新差值为

\[\Delta\theta_t =-\frac{\alpha}{\sqrt{G_t+\epsilon}}\odot\mathbf{g}_t \]

其中\(\alpha\)是初始的学习率,\(\epsilon\)是为了保持数值稳定性而设置的非常小的常数,一般取值\(e^{-7}\sim e^{-10}\)。开平方、除、加运算在此处是按元素进行操作。

AdaGrad算法的缺点是在经过一定次数的迭代依然没有找到最优点时,由于这时的学习率已经非常小,很难再继续找到最优点.

RMSprop算法[Tieleman et al., 2012]

Geoff Hinton提出的一种自适应学习率的方法,可以在有些情况下避免AdaGrad算法中学习率不断单调下降以至于过早衰减的缺点.

RMSprop算法首先计算每次迭代梯度\({\bf{g}}_t\)平方的指数衰减移动平均

\[G_t=\beta G_{t-1} + (1-\beta)\mathbf{g_t\odot g_t}\\ =(1-\beta)\sum_{\tau=1}^{t}{\beta^{t-\tau}\mathbf{g_\tau\odot g_\tau}} \]

其中𝛽为衰减率,一般取值为0.9.

RMSprop算法的参数更新差值为

\[\Delta\theta_t = -\frac{\alpha}{\sqrt{G_t+\epsilon}}\odot\mathbf{g}_t \]

其中\(\alpha\)是初始的学习率,比如0.001。

RMSProp算法和AdaGrad算法的区别在于\(G_t\)的计算由累积方式变成了指数衰减移动平均.在迭代过程中,每个参数的学习率并不是呈衰减趋势,既可以变小也可以变大.


梯度估计修正

梯度估计(Gradient Estimation)修正

在随机(小批量)梯度下降法中,如果每次选取样本数量比较小,损失会呈现振荡的方式下降.也就是说,随机梯度下降方法中每次迭代的梯度估计和整个训练集上的最优梯度并不一致,具有一定的随机性.
一种有效地缓解梯度估计随机性的方式是通过使用最近一段时间内的平均梯度来代替当前时刻的随机梯度来作为参数更新的方向,从而提高优化速度

动量法

动量法(Momentum Method)是用之前积累动量来替代真正的梯度.每次迭代的梯度可以看作加速度。在第𝑡次迭代时,计算负梯度的“加权移动平均”作为参数的更新方向

\[\Delta\theta_t=\rho\Delta\theta_{t-1}-\alpha{\bf{g}}_t\\ =-\alpha\sum^{t}_{\tau=1}{\rho^{t-\tau}{\bf{g}}_t} \]

其中\(\rho\)为动量因子,通常设为\(0.9\)\(\alpha\)为学习率。

Nesterov加速梯度(Nesterov Accelerated Gradient,NAG)

Nesterov加速梯度是一种对动量法的改进[Nesterov, 2013; Sutskever et al., 2013],也称为Nesterov动量法Nesterov Momentum

在动量法中,实际的参数更新方向\(\Delta\theta_t\)为上一步的参数更新方向\(\Delta\theta_{t-1}\)和当前梯度的反方向\(-{\bf{g}}_t\)的叠加.这样,\(\Delta\theta_t\)可以被拆分为两步进行,先根据\(\Delta\theta_{t-1}\)更新一次得到参数 \(\hat\theta\),再用\(-{\bf{g}}_t\)进行更新.

\[\hat\theta=\theta_{t-1}+\rho\Delta\theta_{t-1}\\ \theta_t=\hat\theta-\alpha{\bf{g}}_t \]

其中梯度\({\bf{g}}_t\)为点\(\theta_{t-1}\)上的梯度,因此在第二步更新中有些不太合理.更合理的更新方向应该为\(\hat\theta\)上的梯度.这样,合并后的更新方向为

\[\Delta\theta_t=\rho\Delta\theta_{t-1}-\alpha{\frak{g}}_t(\theta_{t-1}+\rho\Delta\theta_{t-1}) \]

其中\({\frak{g}}_t(\theta_{t-1}+\rho\Delta\theta_{t-1})\)表示损失函数在点\(\hat\theta=\theta_{t-1}+\rho\Delta\theta_{t-1}\)上的偏导数。

Adam算法(AdaptiveMomentEstimation Algorithm)[Kingma et al., 2015]

可以看作动量法和RMSprop算法的结合,不但使用动量作为参数更新方向,而且可以自适应调整学习率.

Adam算法一方面计算梯度平方\({\bf{g}}_t^2\)的指数加权平均(和RMSprop算法类似),另一方面计算梯度\({\bf{g}}_t\)的指数加权平均(和动量法类似)

\[M_t=\beta_1M_{t-1}+(1-\beta_1){\bf{g}}_t,\\ G_t=\beta_2G_{t-1}+(1-\beta_2){\bf{g}}_t\odot{\bf{g}}_t \]

其中\(\beta_1\)\(\beta_2\)分别是两个移动平均的衰减率,通常取值\(\beta_1=0.9,\beta_2=0.99\)

可以把\(M_t\)\(G_t\)分别看坐梯度的均值(一阶矩)和未减去均值的方差(二阶矩)

当衰减率接近1,M和G的值比真实值要小,因此进行修正

\[\hat{M_t}=\frac{M_t}{1-\beta_1^t},\\ \hat{G_t}=\frac{G_t}{1-\beta_2^t} \]

Adam算法的参数更新差值为

\[\Delta\theta_t=-\frac{\alpha}{\sqrt{\hat{G_t}+\epsilon}}\hat{M_t} \]

Adam优化器称为自适应矩估计优化器。

\[E(|X-c|^k) \]

称为X关于点c的k阶矩

posted @ 2021-07-21 21:29  Ohnkyta  阅读(625)  评论(0)    收藏  举报