在深度学习中,经常会使用EMA(指数移动平均)这个方法对模型的参数做平均,以提高测试指标并增加模型鲁棒。

1.基于数学的介绍

1.1 公式例子

我们有关于“温度-天数”的数据

\theta_t:在第t天的温度。

v_t:第t天的移动平均数。

\beta:权重参数。

图中红线即是蓝色数据点的指数移动平均。

1.2 \LARGE v_t\LARGE \beta之间的关系

v_t大概表示前1/(1 - \beta)天的平均数据。(以第t天做参考)

如:

\beta = 0.9

1 / (1 - \beta) \approx 10

v_t大概表示前10天的平均数据

红线

\beta = 0.98

1 / (1 - \beta) \approx 50

v_t大概表示前50天的平均数据

绿线

\beta = 0.5

1 / (1 - \beta) \approx 2

v_t大概表示前2天的平均数据

黄线

那么\beta越大,表示考虑的时间长度越长。

1.3 进一步理解\LARGE v_t

\beta =0.9,从v_{100}往回写

  ...

迭代代入v_{99}v_{98} … 得:

由此可知:

1.v_{100}\theta_{100}\ \theta_{99}\ \theta_{98} \ ...的加权求和

2. 𝜃 前的系数相加起来为 1 或者逼近 1

当某项系数小于峰值系数(𝟏−𝜷)𝟏/𝒆时,我们可以忽略它的影响

(0.9)^10 ~= 0.34 ~= 1/e 所以当β=0.9时,相当于前10天的加权平均。

(0.98)^50 ~= 0.36 ~= 1/e 所以当β=0.98时,相当于前50天的加权平均。

(0.5)^2 ~= 0.25 ~= 1/e 所以当β=0.5时,相当于前2天的加权平均。

2.在深度学习模型中的应用

\theta_t:在第t次更新得到的所有参数权重。

v_t:第t次更新的所有参数移动平均数。

\beta:权重参数。

2.1 为啥EMA会有用

对于更新n次时普通的参数权重\theta_n   (g_n为第n次传播得到的梯度):

对于更新n次时使用EMA的参数权重v_n (此式中α为上面提到的参数β):

\theta_n代入v_n表达式,并且令v_0 = \theta_1得:

对比两式:

普通的参数权重相当于一直累积更新整个训练过程的梯度,使用EMA的参数权重相当于使用训练过程梯度的加权平均(刚开始的梯度权值很小)。由于刚开始训练不稳定,得到的梯度给更小的权值更为合理,所以EMA会有效。

3.Pytorch实现EMA类

4.biggan实现的EMA

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐