算法内容
Adam
算法使用了动量变量
v
t
v_t
vt 和RMSProp算法
中小批量随机梯度按元素平方的指数加权移动平均变量
s
t
s_t
st ,并在时间步0将它们中每个元素初始化为0。给定超参数
0
≤
β
1
<
1
0≤β_1<1
0≤β1<1 (默认设为0.9),时间步 t 的动量变量
v
t
v_t
vt 即小批量随机梯度
g
t
g_t
gt 的指数加权移动平均:
v t ← β 1 v t − 1 + ( 1 − β 1 ) g t . (1) v_t←β_1v_{t−1}+(1−β_1)g_t.\tag{1} vt←β1vt−1+(1−β1)gt.(1)
和RMSProp
算法中一样,给定超参数
0
≤
β
2
<
1
0≤β_2<1
0≤β2<1 (默认设为设为0.999), 将小批量随机梯度按元素平方后的项
g
t
⊙
g
t
g_t\odot g_t
gt⊙gt 做指数加权移动平均得到
s
t
s_t
st :
s t ← β 2 s t − 1 + ( 1 − β 2 ) g t ⊙ g t . (2) s_t←β_2s_{t−1}+(1−β_2)g_t\odot g_t.\tag{2} st←β2st−1+(1−β2)gt⊙gt.(2)
由于我们将 v 0 v_0 v0 和 s 0 s_0 s0 中的元素都初始化为0, 在时间步 t 我们得到 v t = ( 1 − β 1 ) ∑ i = 1 t β 1 t − i g i v_t=(1−β_1)\sum^{t}_{i=1}\beta_1^{t-i}g_i vt=(1−β1)∑i=1tβ1t−igi 。将过去各时间步小批量随机梯度的权值相加,得到 ( 1 − β 1 ) ∑ i = 1 t β 1 t − i = 1 − β 1 t (1−β_1) \sum_{i=1}^t β^{t−i}_1=1−β^t_1 (1−β1)∑i=1tβ1t−i=1−β1t 。需要注意的是,当 t 较小时,过去各时间步小批量随机梯度权值之和会较小。例如,当 β 1 = 0.9 β_1=0.9 β1=0.9 时, v 1 = 0.1 g 1 v_1=0.1g_1 v1=0.1g1 。为了消除这样的影响,对于任意时间步 t ,我们可以将 v t v_t vt 再除以 1 − β 1 t 1−β^t_1 1−β1t ,从而使过去各时间步小批量随机梯度权值之和为1。这也叫作偏差修正。在Adam算法中,我们对变量 v t v_t vt 和 s t s_t st 均作偏差修正:
v ^ t ← v t 1 − β 1 t , (3) \hat{v}_t←\frac{v_t}{1−β^t_1},\tag{3} v^t←1−β1tvt,(3)
s ^ t ← s t 1 − β 2 t . (4) \hat{s}_t←\frac{s_t}{1−β^t_2}.\tag{4} s^t←1−β2tst.(4)
接下来,Adam算法使用以上偏差修正后的变量 v t v^t vt和 s t s^t st ,将模型参数中每个元素的学习率通过按元素运算重新调整:
g t ′ ← η v ^ t s ^ t + ϵ , (5) g^′_t←\frac{η\hat{v}_t}{\sqrt{\hat{s}_t}+ϵ,}\tag{5} gt′←s^t+ϵ,ηv^t(5)
其中 η \eta η 是学习率, ϵ \epsilon ϵ 是为了维持数值稳定性而添加的常数,如 1 0 − 8 10^{−8} 10−8 。和AdaGrad算法、RMSProp算法以及AdaDelta算法一样,目标函数自变量中每个元素都分别拥有自己的学习率。最后,使用 g t ′ g^′_t gt′ 迭代自变量:
x t ← x t − 1 − g t ′ . (6) x_t←x_{t−1}−g^′_t.\tag{6} xt←xt−1−gt′.(6)
算法优化问题
- 当优化器更新梯度时,出现
nan
, 可适当降低学习率。