Adam在PyTorch的官方文档中有详细介绍,摘录如下:
在此有几处知识点做些详细说明。
上图的算法排除IF后(一般情况),按如下执行:
其中累计梯度和梯度的平方均用指数加权平均(exponentially weighted averges)的方法来实现,如果学习过吴恩达老师的deepLearning课程应该不陌生,这个方法的通式为:
v
t
=
β
∗
v
t
−
1
+
(
1
−
β
)
∗
θ
t
v_{t}=\beta * v_{t-1}+(1-\beta) * \theta_{t}
vt=β∗vt−1+(1−β)∗θt
其中
θ
t
\theta_{t}
θt为本次迭代的数值,
v
t
−
1
v_{t-1}
vt−1为上一次累计的数值,
β
\beta
β为权重。一般将权重下降到峰值权重的
1
/
e
1/e
1/e时,就说他平均了
1
/
(
1
−
β
)
1/(1-\beta)
1/(1−β)个数据。例如
β
=
0.9
\beta=0.9
β=0.9时,基本认为其平均此前的10次数据。但该方法会导致前期的指数加权平均存在较大误差,因此需要进行偏差修正。而Adam优化器中,就引入了修正方法:
v
t
=
v
t
1
−
β
t
v_{t}=\frac{v_{t}}{1-\beta^{t}}
vt=1−βtvt
所以在上述Adam优化器的过程中,有4,5两步进行偏差修正。