Refs:
- https://zhuanlan.zhihu.com/p/29895933
- https://www.cnblogs.com/guoyaohua/p/8544835.html
- https://terrifyzhao.github.io/2018/02/16/%E5%8A%A8%E9%87%8F%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E6%B3%95Momentum.html
- 维基百科,有数学推导
- 模型参数更新
1. 引言
在深度学习的各种优化算法中,例如
M
o
m
e
n
t
u
m
Momentum
Momentum、
R
M
S
p
r
o
p
RMSprop
RMSprop、
A
d
a
m
Adam
Adam等,都提到了指数加权移动平均(Exponential Moving Average,EMA 或 Exponentially Weighted Moving Average,EWMA)是以指数式递减加权的移动平均。 各数值的加权影响力随时间而指数式递减,越近期的数据加权影响力越重,但较旧的数据也保留了一定的加权值,如下所示就是指数衰减的权重,
2. 举例说明
已知,有 n 天的温度值分别为 $\theta_1,\theta_2,\theta_3\dots,\theta_n $,在计算指数加权平均时,要引入了一个权重 β \beta β,则第 t 天的平均温度计算的递推公式如下所示,
v t = β v t − 1 + ( 1 − β ) θ t v_{t}=\beta v_{t-1}+(1-\beta) \theta_{t} vt=βvt−1+(1−β)θt
可以发现,当前的平均温度依赖于之前计算好的平均温度以及当前的实际温度,因此可以依次计算每个点的指数加权平均,
v 0 = 0 v_{0}=0 v0=0
v 1 = β v 0 + ( 1 − β ) θ 1 v_{1}=\beta v_{0}+(1-\beta) \theta_{1} v1=βv0+(1−β)θ1
$\vdots $
v t − 1 = β v t − 2 + ( 1 − β ) θ t − 1 v_{t-1}=\beta v_{t-2}+(1-\beta) \theta_{t-1} vt−1=βvt−2+(1−β)θt−1
依次带入就可以得到, v t v_t vt 的计算公式,
v t = β v t − 1 + ( 1 − β ) θ t = β n v 0 + ( 1 − β ) ( θ t + β θ t − 1 + β 2 θ t − 2 + ⋯ + β t − 1 θ 1 ) v_{t}=\beta v_{t-1}+(1-\beta) \theta_{t}=\beta^nv_0+(1-\beta)(\theta_t+\beta\theta_{t-1}+\beta^2\theta_{t-2}+\dots+\beta^{t-1}\theta_{1}) vt=βvt−1+(1−β)θt=βnv0+(1−β)(θt+βθt−1+β2θt−2+⋯+βt−1θ1)
可以发现,
- 指数加权平均是给每个实际值都赋了一个权重系数,距离 t 越近,权重越大,反之就越小。
- 因为越是前面的值,权重越小,几乎可以忽略不计,相当于计算了一个小窗口里的平均值。权重 β \beta β 越大,这个窗口也就越大,反之越小。
这里假设了初始值为 0,由于没有先前时刻的数据,这会导致刚开始的平均值非常小,因此需要加入一个偏差修正,如下所示,(也可以在 Adam 优化器中看到这个修正)
$\hat{v}{t}=\frac{v{t}}{1-\beta^{t}} $
一开始修正项 1 1 − β t \frac{1}{1-\beta^t} 1−βt1 比较大,随着 t 增加,就会逐渐趋近于 1。
3. 模型训练
除了在优化器中会使用到 EMA 外,为了提高模型鲁棒性,会同时实例化两个相同的模型 n e t net net、 n e t e m a net_{ema} netema,并初始化为同样的参数 θ 1 \theta_1 θ1,前者是要参与训练的,而后者不参与训练,只是采用ema来更新参数,测试阶段就会用到 n e t e m a net_{ema} netema。
如下式,是第n时刻模型 n e t net net 的权重 θ n \theta_n θn,每次更新的梯度为 g i , i = 1 , 2 , 3 … n g_i,i=1,2,3\dots n gi,i=1,2,3…n
θ n = θ 1 − ∑ i = 1 n − 1 g i \theta_n=\theta_{1}-\sum_{i=1}^{n-1} g_{i} θn=θ1−∑i=1n−1gi
如果采用 EMA,则 n e t e m a net_{ema} netema 的权重为 v n v_n vn,
v n = β v n − 1 + ( 1 − β ) θ n = β n v 0 + ( 1 − β ) ( θ n + β θ n − 1 + β 2 θ n − 2 + ⋯ + β n − 1 θ 1 ) v_{n}=\beta v_{n-1}+(1-\beta) \theta_{n}=\beta^nv_0+(1-\beta)(\theta_n+\beta\theta_{n-1}+\beta^2\theta_{n-2}+\dots+\beta^{n-1}\theta_{1}) vn=βvn−1+(1−β)θn=βnv0+(1−β)(θn+βθn−1+β2θn−2+⋯+βn−1θ1)
将 θ \theta θ 代入,可以得到,
v n = θ 1 − ∑ i = 1 n − 1 ( 1 − β n − i ) g i v_n=\theta_{1}-\sum_{i=1}^{n-1}\left(1-\beta^{n-i}\right) g_{i} vn=θ1−∑i=1n−1(1−βn−i)gi
可以发现两个模型值差了一个权重系数,相当于是一个学习率的衰减。但是和优化器中的学习率衰减有所不同,前者不影响更新多少梯度的计算,但后者会直接衰减更新速率,也就是每次梯度更新的量会受到影响。
4. 总结
指数加权平均的求解过程实际上是一个递推的过程,那么这样就会有一个非常大的好处,每当要求从0到某一时刻的平均值时,并不需要像普通求解平均值那样,保留所有的时刻值求平均。而是只需要保留之前时刻的平均值和现时刻值即可。也就是每次只需要保留常数值,然后进行运算即可,这对于深度学习中的海量数据来说,是一个很好的减少内存和空间的做法。