滑动平均(exponential moving average),或者叫做指数加权平均(exponentially weighted moving avergae),可以用来估计变量的局部均值,使得变量的更新与一段时间内的历史取值有关。

变量vvtt时刻记为vtv_{t}θt\theta_{t}为变量vvtt时刻的取值,即在不使用滑动平均模型时vt=θtv_{t} = \theta_{t},在使用滑动平均模型后,vtv_{t}的更新公式如下:

深度学习_深度学习基础_滑动平均详解

上式中,βϵ[0,1)\beta\epsilon[0,1)β=0\beta = 0相当于没有使用滑动平均。

tt时刻变量vv的滑动平均值大致等于过去1/(1β)1/(1-\beta)个时刻θ\theta值的平均。这个结论在滑动平均起始时相差比较大,所以有了bias correction,将vtv_{t}除以(1βt)(1 - \beta^{t})修正对均值的估计。

加入Bias correction后,vtv_{t}vbiasedtv_{biased_{t}}的更新公式如下:

深度学习_深度学习基础_滑动平均详解

tt越大,1βt1 - \beta^{t}越接近1,则公式(1)和(2)得到的结果(vtv_{t}vbiased1v_{biased_{1}})将越来越接近。

β\beta越大时,滑动平均得到的值越和θ\theta的历史值相关。如果β=0.9\beta = 0.9,则大致等于过去10个θ\theta值的平均;如果β=0.99\beta = 0.99,则大致等于过去100个θ\theta值的平均。

下面的图时使用不同方式的结果:

深度学习_深度学习基础_滑动平均详解

深度学习_深度学习基础_滑动平均详解

如上图所示,滑动平均可以看作是变量的过去一段时间取值的均值,相比对变量直接赋值而言,滑动平均得到的值在图像上更加平缓光滑,抖动性更小,不会因为某种次的异常取值而使得滑动平均值波动很大。

滑动平均的优势: 占用内存少,不需要保存过去10个或者100个历史θ\theta值,就能够估计其均值。(当然,滑动平均不如将历史值全保存下来计算均值准确,但)后者占用更多内存和计算成本更高。

为什么滑动平均在测试过程中被使用?

滑动平均可以使模型在测试数据上更健壮(robust)。

“采用随机梯度下降算法训练神经网络时,使用滑动平均在很多应用中都可以在一定程度上提高最终模型在测试数据上的表现。”

对神经网络边的权重 weightsweights 使用滑动平均。之后在测试过程中使用滑动平均后的 weightsweights 作为神经网络边的权重,这样在测试数据上效果更好。因为滑动平均后的 weightsweights 的更新更加平滑,对于随机梯度下降而言,更平滑的更新说明不会偏离最优点很远;对于 mini-batch gradient decent,可以尝试滑动平均,毕竟 mini-batch gradient decent 对参数的更新也存在抖动。

设 decay=0.999,一个更直观的理解,在最后的 1000 次训练过程中,模型早已经训练完成,正处于抖动阶段,而滑动平均相当于将最后的 1000 次抖动进行了平均,这样得到的权重会更加 robust。

相关文章: