平时跑模型只知道直接上Adam Optimizer,但具体原理却不甚理解,于是把吴恩达老师的深度学习课翻出来看,记录一下关于动量优化算法的基础-EMA相关内容。
指数加权平均的概念
平时我们计算平均值,就是简单地将所有数据加起来之后与数据总数求商。对于一部分数据来说,这样的平均值以及可以反应数据的趋势,例如某单位的平均年龄,身高等。
但是对于某些数据来说,就不能简单取这样的平均值来观察数据特征了,吴恩达老师课上举的气温就是一个很好的例子,天气跟所属的季节相关性很大,也就是应当更加关注近期的数据。
指数加权平均值就是这样一种加权均值的计算方法,只不过其权值呈现出指数衰减的趋势。
以课上例子为例,给出计算方法:
v
0
=
0
v_0 = 0
v0=0
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代表当天气温, β ∈ [ 0 , 1 ] \beta \in[0,1] β∈[0,1]是可调的超参数,稍后就能看到它的作用。 v t v_t vt代表到当天为止的温度均值。图中,蓝色散点代表真实温度,红色曲线由计算的均值构成。可以看到拟合得还是不错的。
按照递推式,计算前几项:
v
1
=
β
v
0
+
(
1
−
β
)
θ
1
v_1 = \beta v_0 +(1-\beta) \theta_1
v1=βv0+(1−β)θ1
v
2
=
β
v
1
+
(
1
−
β
)
θ
2
v_2 = \beta v_1 +(1-\beta) \theta_2
v2=βv1+(1−β)θ2
v
3
=
β
v
2
+
(
1
−
β
)
θ
3
v_3 = \beta v_2 + (1-\beta) \theta_3
v3=βv2+(1−β)θ3
将递推展开,代入前面项:
v
1
=
(
1
−
β
)
θ
1
v_1 = (1-\beta)\theta_1
v1=(1−β)θ1
v
2
=
β
(
1
−
β
)
θ
1
+
(
1
−
β
)
θ
2
v_2 = \beta(1-\beta)\theta_1 + (1-\beta)\theta_2
v2=β(1−β)θ1+(1−β)θ2
v
3
=
β
2
(
1
−
β
)
θ
1
+
β
(
1
−
β
)
θ
2
+
(
1
−
β
)
θ
3
v_3 = \beta^2(1-\beta)\theta_1 + \beta(1-\beta)\theta_2 + (1-\beta)\theta_3
v3=β2(1−β)θ1+β(1−β)θ2+(1−β)θ3
还可以一直写下去,但这里已经可以看到,每一天的预测值都是到当天为止的加权平均,并且其权值随着天数的增加呈指数衰减。 β \beta β实际上可以看作是衰减的速度,其值越小则衰减得越快,也就代表着均值越依赖于最近的值而不是早期的值。
上图蓝色曲线为
β
=
0.95
\beta=0.95
β=0.95的指数衰减,橙色为
β
=
0.9
\beta = 0.9
β=0.9,绿色为
β
=
0.5
\beta=0.5
β=0.5,横轴是时间轴,可以看到,在第一百天绿色的曲线几乎只关注到了前十天左右的数据,而在往前的数据权重近乎为零。所以实际上随着序列增长,指数加权平均总是关注一个局部的数据。
吴恩达也给出了一个估计公式。仍以气温为例,某天的气温可以看做最近
1
1
−
β
\frac{1}{1-\beta}
1−β1天的均值。
总的来说,EMA让当前状态综合前面的状态的累积且重点关注最近的数据。是带有动量的优化算法的基础思想。