滑动平均(exponential moving average),或者叫做指数加权平均(exponentially weighted moving avergae),可以用来估计变量的局部均值,使得变量的更新与一段时间内的历史取值有关。
变量在时刻记为,为变量在时刻的取值,即在不使用滑动平均模型时,在使用滑动平均模型后,的更新公式如下:
上式中,。相当于没有使用滑动平均。
时刻变量的滑动平均值大致等于过去个时刻值的平均。这个结论在滑动平均起始时相差比较大,所以有了bias correction,将除以修正对均值的估计。
加入Bias correction后,和的更新公式如下:
当越大,越接近1,则公式(1)和(2)得到的结果(和)将越来越接近。
当越大时,滑动平均得到的值越和的历史值相关。如果,则大致等于过去10个值的平均;如果,则大致等于过去100个值的平均。
下面的图时使用不同方式的结果:
如上图所示,滑动平均可以看作是变量的过去一段时间取值的均值,相比对变量直接赋值而言,滑动平均得到的值在图像上更加平缓光滑,抖动性更小,不会因为某种次的异常取值而使得滑动平均值波动很大。
滑动平均的优势: 占用内存少,不需要保存过去10个或者100个历史值,就能够估计其均值。(当然,滑动平均不如将历史值全保存下来计算均值准确,但)后者占用更多内存和计算成本更高。
为什么滑动平均在测试过程中被使用?
滑动平均可以使模型在测试数据上更健壮(robust)。
“采用随机梯度下降算法训练神经网络时,使用滑动平均在很多应用中都可以在一定程度上提高最终模型在测试数据上的表现。”
对神经网络边的权重 使用滑动平均。之后在测试过程中使用滑动平均后的 作为神经网络边的权重,这样在测试数据上效果更好。因为滑动平均后的 的更新更加平滑,对于随机梯度下降而言,更平滑的更新说明不会偏离最优点很远;对于 mini-batch gradient decent,可以尝试滑动平均,毕竟 mini-batch gradient decent 对参数的更新也存在抖动。
设 decay=0.999,一个更直观的理解,在最后的 1000 次训练过程中,模型早已经训练完成,正处于抖动阶段,而滑动平均相当于将最后的 1000 次抖动进行了平均,这样得到的权重会更加 robust。