机器学习-滑动平均算法

648 阅读2分钟

一、介绍

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

二、算法作用

当在机器学习中,有些数据,总是在上下震荡或叫抖动。如果我们想得到一条平滑的均线,这样有利于模型的训练和收敛。在强化学习中,我们在更新 target 模型参数时,也会用到滑动平均,来避免“硬更新”的问题,这样会导致模型偏差过大,我们希望在旧均值的基础上有一个平滑的变化,不会造成巨大的跳变。

下图蓝色曲线就是数据的争夺,黄色曲线就是采用了滑动平均的效果。

image.png

三、算法细节

变量 𝑣 在 𝑡 时刻记为 𝑣𝑡 ,𝜃𝑡 为变量 𝑣 在 𝑡 时刻的取值,即在不使用滑动平均模型时 𝑣𝑡=𝜃𝑡,在使用滑动平均模型后,𝑣𝑡 的更新公式如下: 𝑣𝑡=𝛽⋅𝑣𝑡−1+(1−𝛽)⋅𝜃𝑡(1)

上式中,𝛽∈[0,1)β∈[0,1) 。𝛽=0 β=0 相当于没有使用滑动平均。

四、总结

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

对神经网络的权重 weights 使用滑动平均,得到对应的 shadow_weights。在训练过程仍然使用原来不带滑动平均的权重 weights,不然无法得到 weights 下一步更新的值,又怎么求下一步 weights 的影子变量 shadow_weights。之后在测试过程中使用 shadow_weights 来代替 weights 作为神经网络的权重,这样在测试数据上效果更好。因为 shadow_weights 的更新更加平滑,对于随机梯度下降而言,更平滑的更新说明不会偏离最优点很远;对于梯度下降 batch gradient decent,我感觉影子变量作用不大,因为梯度下降的方向已经是最优的了,loss 一定减小,对于 mini-batch gradient decent,可以尝试滑动平均,毕竟 mini-batch gradient decent 对参数的更新也存在抖动。