转载:
随笔 - 67 文章 - 4 评论 - 84
理解滑动平均(exponential moving average)
对滑动平均的直观理解,以及滑动平均在tensorflow中的使用。
目录
1. 用滑动平均估计局部均值
2. TensorFlow中使用滑动平均来更新变量(参数)
3. 滑动平均为什么在测试过程中被使用?
1. 用滑动平均估计局部均值
滑动平均(exponential moving average),或者叫做指数加权平均(exponentially weighted moving average),可以用来估计变量的局部均值,使得变量的更新与一段时间内的历史取值有关。
变量v v 在t t 时刻记为 v t vt ,θ t θt 为变量 v v 在 t t 时刻的取值,即在不使用滑动平均模型时 v t =θ t vt=θt ,在使用滑动平均模型后,v t vt 的更新公式如下:
v t =β⋅v t−1 +(1−β)⋅θ t (1) (1)vt=β⋅vt−1+(1−β)⋅θt
上式中,β∈[0,1) β∈[0,1) 。β=0 β=0 相当于没有使用滑动平均。
假设起始 v 0 =0 v0=0 ,β=0.9 β=0.9 ,之后每个时刻,依次对变量 v v 进行赋值,不使用滑动平均和使用滑动平均结果如下:
表 1 三种变量更新方式
t | 不使用滑动平均模型,即给v v 直接赋值θ θ | 使用滑动平均模型, | 使用滑动平均模型, |
---|---|---|---|
0, 1, 2, ... , 35 | [0, 10, 20, 10, 0, 10, 20, 30, 5, 0, 10, 20, 10, 0, 10, 20, 30, 5, 0, 10, 20, 10, 0, 10, 20, 30, 5, 0, 10, 20, 10, 0, 10, 20, 30, 5] | [0, 1.0, 2.9, 3.61, 3.249, 3.9241, 5.5317, 7.9785, 7.6807, 6.9126, 7.2213, 8.4992, 8.6493, 7.7844, 8.0059, 9.2053, 11.2848, 10.6563, 9.5907, 9.6316, 10.6685, 10.6016, 9.5414, 9.5873, 10.6286, 12.5657, 11.8091, 10.6282, 10.5654, 11.5089, 11.358, 10.2222, 10.2, 11.18, 13.062, 12.2558] | [0, 10.0, 15.2632, 13.321, 9.4475, 9.5824, 11.8057, 15.2932, 13.4859, 11.2844, 11.0872, 12.3861, 12.0536, 10.4374, 10.3807, 11.592, 13.8515, 12.7892, 11.2844, 11.1359, 12.145, 11.9041, 10.5837, 10.5197, 11.5499, 13.5376, 12.6248, 11.2844, 11.1489, 12.0777, 11.8608, 10.6276, 10.5627, 11.5365, 13.4357, 12.5704] |
图 1:三种变量更新方式
Andrew Ng在Course 2 Improving Deep Neural Networks中讲到,t t 时刻变量 v v 的滑动平均值大致等于过去 1/(1−β) 1/(1−β) 个时刻 θ θ 值的平均。这个结论在滑动平均起始时相差比较大,所以有了Bias correction,将 v t vt 除以 (1−β t ) (1−βt) 修正对均值的估计。
加入了Bias correction后,v t vt 和 v_biased t v_biasedt 的更新公式如下:
v t =β⋅v t−1 +(1−β)⋅θ t v_biased t =v t 1−β t (2) (2)vt=β⋅vt−1+(1−β)⋅θtv_biasedt=vt1−βt
t t 越大,1−β t 1−βt 越接近 1,则公式(1)和(2)得到的结果 (v t vt 和 v_biased t v_biasedt )将越来越近,如图 1 所示。
当 β β 越大时,滑动平均得到的值越和 θ θ 的历史值相关。如果 β=0.9 β=0.9 ,则大致等于过去 10 个 θ θ 值的平均;如果 β=0.99 β=0.99 ,则大致等于过去 100 个 θ θ 值的平均。
滑动平均的好处:
占内存少,不需要保存过去10个或者100个历史 θ θ 值,就能够估计其均值。(当然,滑动平均不如将历史值全保存下来计算均值准确,但后者占用更多内存和计算成本更高)