3.3 优化器及自定义优化器
Adam算法
Adam算法在RMSProp算法基础上对小批量随机梯度也做了指数加权移动平均。下面我们来介绍这个算法。
1. 算法
Adam算法使用了动量变量vt和RMSProp算法中小批量随机梯度按元素平方的指数加权移动平均变量st,并在时间步0将它们中每个元素初始化为0。给定超参数0≤β1<1(算法作者建议设为0.9),时间步t的动量变量vt即小批量随机梯度gt的指数加权移动平均:
和RMSProp算法中一样,给定超参数$$0 \leq \beta_2 < 1$(算法作者建议设为0.999), 将小批量随机梯度按元素平方后的项$\boldsymbol{g}_t \odot \boldsymbol{g}_t$做指数加权移动平均得到$\boldsymbol{s}_t$:
由于我们将v0和s0中的元素都初始化为0, 在时间步t我们得到vt=(1−β1)∑i=1tβ1t−igi。将过去各时间步小批量随机梯度的权值相加,得到 (1−β1)∑i=1tβ1t−i=1−β1t。需要注意的是,当t较小时,过去各时间步小批量随机梯度权值之和会较小。例如,当β1=0.9时,v1=0.1g1。为了消除这样的影响,对于任意时间步t,我们可以将vt再除以1−β1t,从而使过去各时间步小批量随机梯度权值之和为1。这也叫作偏差修正。在Adam算法中,我们对变量vt和st均作偏差修正:
接下来,Adam算法使用以上偏差修正后的变量v^t和s^t,将模型参数中每个元素的学习率通过按元素运算重新调整:
其中η是学习率,ϵ是为了维持数值稳定性而添加的常数,如10−8。和AdaGrad算法、RMSProp算法以及AdaDelta算法一样,目标函数自变量中每个元素都分别拥有自己的学习率。最后,使用gt′迭代自变量:
原始论文中实现:

2. 简单实现
基于Python实现Adam优化器:
TODO:
https://github.com/OverLordGoldDragon/keras-adamw/blob/master/keras_adamw/optimizers_v2.py
实验
最后更新于