6.9 Adam算法#
在前面几节内容中我们陆续介绍了动量法、AdaGrad和AdaDelta等优化算法。除了动量法以外,其它几种算法都能够分别为每个权重参数自适应计算得到一个学习率,以此来实现对不同的权重参数以不同的尺度进行更新。在本节内容中我们将介绍最后一种通过利用一阶矩和二阶矩信息来自适应各权重参数学习率的优化算法。
6.9.1 Adam动机#
动量法在更新参数的过程中不仅会考虑当前梯度的方向同时也会考虑历史梯度的方向,以此来解决目标函数梯度来回震荡的问题;AdaGrad算法在更新参数的过程中通过考虑数据样本特征出现的频次来自适应不同的权重参数所对应的学习率,以此来提高目标函数的收敛速度;AdaDelta和RMSprop算法在更新参数的过程中通过梯度的移动平均来解决AdaGrad中学习率衰减过快的问题,并同时实现了无序手动指定全局学习率。
结合AdaGrad算法和RMSprop算法各自的优点,金马(Kingma)[1]等人提出了一种新的学习率自适应算法自适应矩估计(Adaptive Moment Estimation, Adam)。Adam算法可以根据每个参数梯度的趋势性和稳定性在训练的不同阶段自适应调整学习率,使得Adam在处理非平稳(Non-Stationary)的目标函数时仍然能表现良好,同时在面对梯度稀疏的情况下Adam算法也能够有效地进行处理。
6.9.2 Adam原理#
Adam算法通过考虑梯度的一阶矩和二阶矩来动态调整学习率,使得它能够在不同参数和不同时间步上提供更为平滑和稳定的参数梯度,然后对权重参数进行学习更新。具体地,设目标函数在第$t$时刻关于所有权重参数的梯度为$g_t$,梯度的一阶矩为$m_t$且$m_0=0$,梯度的二阶矩为$v_t$且$v_0=0$,移动平均的衰减系数分别为$\beta_1\in[0,1)$和$\beta_2\in[0,1)$,权重参数为$\theta_t$,则第$t+1$时刻的结果$\theta_{t+1}$可通过如下步骤进行计算
$$ \begin{aligned} m_{t+1}&=\beta_1m_t+(1-\beta_1)g_{t+1}\\[1ex] v_{t+1}&=\beta_2v_t+(1-\beta_2)g_{t+1}\odot g_{t+1}\\[1ex] \hat{m}_{t+1}&=\frac{m_{t+1}}{1-\beta_1^{t+1}}\\[1ex] \hat{v}_{t+1}&=\frac{v_{t+1}}{1-\beta_2^{t+1}}\\[1ex] \theta_{t+1}&=\theta_t-\frac{\gamma \hat{m}_{t+1}}{\sqrt{\hat{v}_{t+1}}+\epsilon} \end{aligned} \tag{6-33} $$其中$\odot$表示按位乘,$\gamma$为学习率,$\beta^t_i$中$t$表示幂次,$\epsilon$为平滑项。
在式(6-33)中,Adam算法通过移动平均来分别估计第$t+1$时刻梯度的一阶矩$m_{t+1}$和二阶矩$v_{t+1}$即梯度的均值和近似方差。一阶矩估计可以更好的帮助算法适应目标函数梯度的整体趋势。二阶矩估计则可以用于捕捉梯度的方差或波动性,如果目标函数表面上存在平坦区域或高曲率区域时,则此时梯度的方差可能变化很大,将其作为分母便可以减小学习率以提高稳定性;相反则会增加算法的学习率以提高收敛速度。
同时,由于在训练初期$m_0$和$v_0$的初始值均为0,所以一阶矩$m_t$和二阶矩$v_t$的估计可能偏离真实值。为了减小这种偏差,Adam算法引入了偏差校正,即校正后的结果分别为$\hat{m}_{t+1}$和$\hat{v}_{t+1}$。根据式(6-33)可以看出,随着迭代次数$t$的增加$\beta_i^t$将会逐渐趋于0,并且当$t$足够大之后矩估计值便近似等于校正值。