Adam算法
moment(矩)
矩在数学中的定义,一阶矩(first moment)就是样本的均值(mean), 二阶矩就是方差(variance)。 ## 滑动平均 滑动平均(exponential moving average),或者叫做指数加权平均(exponentially weighted moving average),可以用来估计变量的局部均值,使得变量的更新与一段时间内的历史取值有关。在时间序列预测中也常用。
变量 \(v\) 在 \(t\) 时刻记为 \(v_{t} ,\text{可以理解为0到t时刻的平均值} 。\quad \theta_{t}\) 为变量 \(v\) 在 \(t\) 时刻的取值,即在不使用滑动平均模型时 \(v_{t}=\theta_{t}\) ,在使用滑动平均模型后, \(v_{t}\) 的更新公式如下:
\[ v_{t}=\beta \cdot v_{t-1}+(1-\beta) \cdot \theta_{t} \]
上式中, \(\beta \in[0,1) ,
\beta=0\) 相当于没有使用滑动平均。
这也是RMSProp和Adam等算法里使用的最重要的思想。通过滑动平均来降低梯度的波动值。
## Adam 下面看最经典的伪代码:
adam算法比起adagrad和RMSProp,不仅加入了一阶和二阶moment的计算。而且加入了bias-correction term。以下将展开分析:
adam的更新率(stepsize)
adam算法中最重要的就是每次迭代的迭代率(step size),他决定了adam算法的效率。根据上 文的算法, step size等于: \(\Delta_{t}=\alpha \cdot \widehat{m}_{t} / \sqrt{\hat{v}_{t}}\) 1) 当 \(\left(1-\beta_{1}\right)>\sqrt{1-\beta_{2}}\) 的时候,它的上界满足不等式: \(\left|\Delta_{t}\right| \leq \alpha \cdot\left(1-\beta_{1}\right) / \sqrt{1-\beta_{2}}\) 2) 否则 \(\left|\Delta_{t}\right| \leq \alpha\) 1)通常发生在数据很稀疏的时候。当数据密集的时候, stepsize会更小。 3) 当 \(\left(1-\beta_{1}\right)=\sqrt{1-\beta_{2}}\) 的时候,因为 \(\left|\widehat{m}_{t} / \sqrt{\hat{v}_{t}}\right|<1\) 所以,也满足条件 2 的 \(\left|\Delta_{t}\right| \leq \alpha\) 总结以上3个条件,可以近似得出stepsize 满足 \(\left|\Delta_{t}\right| \cong \alpha\) 这里的 \(\widehat{m}_{t} / \sqrt{\hat{v}_{t}}\) 通常也成为信噪比(Signal-to-noise ratio SNR),并且满足SND越小, stepsize也越小。
初始化偏差矫正项
原算法中的这两行 \[ \begin{aligned} &\widehat{m}_{t} \leftarrow m_{t} /\left(1-\beta_{1}^{t}\right) \\\\ &\hat{v}_{t} \leftarrow v_{t} /\left(1-\beta_{2}^{t}\right) \end{aligned} \] 称为偏差校正项(bias-correction term),他使用了滑动平均值(EMA: exponential moving average)的思想,例如计算二次moment的 \(v_{t}=\beta_{2} \cdot v_{t-1}+\left(1-\beta_{2}\right) \cdot g_{t}^{2}\) 可以写成如下的形 式: \[ v_{t}=\left(1-\beta_{2}\right) \sum_{i=1}^{t} \beta_{2}^{t-i} \cdot g_{i}^{2} \] 我们的目的是求得 \(\mathbb{E}\left[v_{t}\right]\) (EMA) 和二阶moment \(\mathbb{E}\left[g_{t}^{2}\right]\) 之间的关系,推导如下: \[ \begin{aligned} \mathbb{E}\left[v_{t}\right] &=\mathbb{E}\left[\left(1-\beta_{2}\right) \sum_{i=1}^{t} \beta_{2}^{t-i} \cdot g_{i}^{2}\right] \\\\ &=\mathbb{E}\left[g_{t}^{2}\right] \cdot\left(1-\beta_{2}\right) \sum_{i=1}^{t} \beta_{2}^{t-i}+\zeta \\\\ &=\mathbb{E}\left[g_{t}^{2}\right] \cdot\left(1-\beta_{2}^{t}\right)+\zeta \end{aligned} \] 最后得出 \(\mathbb{E}\left[g_{t}^{2}\right]=\frac{\mathbb{E}\left[v_{t}\right]-\zeta}{\left(1-\beta_{2}^{t}\right)}\) 通常可以忽略常数 \(\zeta\) 。得出
\[ \bar{v_t} = \frac{v_t}{1-\beta_2^t} \]
综上所述,Adam 优化器可以根据历史梯度的震荡情况和过滤震荡后的真实历史梯度对变量进行更新