滑动平均算法的原理
举个例子,这个例子来自吴恩达老师的deep learning课程中。给出一个连续365天的温度数据,如图所示,横坐标为天数,纵坐标是温度。
可以看到这些数据是很不平滑的,会让拟合出来的模型难以具有泛化性,因此,可以采用滑动平均的方式处理。假设某一天经过滑动平均处理后的温度数据为vt,实际的温度数据是at,假定第一天的数据v0是已知的,设β为0.9,那么可以得到
v1 = v00.9 + a1(1-0.9)
v2 = v10.9 + a2(1-0.9)
v3 = v20.9 + a3(1-0.9)
…
即某一天的滑动平均处理后的温度数据为前一天滑动平均处理后的温度数据x0.9加上今天实际的温度数据x(1-0.9),计算后得到数据如下
红色的就是经过滑动平均后得到的数据结果,可以发现数据更加平滑,拟合出来的模型也将更有泛化性,由此我们可以总结得到滑动平均的计算公式就是:
vt = vt-1β + at(1-β)
那么β这个值又有什么含义呢,实际上,vt≈1/(1-β)天的平均温度,假设β等于0.9,那么vt约等于前10天温度的平均。假设β = 0.98,那么vt就是前五十天的温度的平均值,下面的绿线就是β等于0.98时的曲线

可以看到,绿线很明显比红线还要平滑,同时绿线比红线变化要延迟,红线达到某一温度,绿线要过一阵子才能达到相同温度。因为绿线是前50天的平均温度,变化就会更加缓慢,而红线是最近十天的平均温度,只要最近十天的温度都是上升,红线很快就能跟着变化。所以直观的理解就是,vt是前1/(1-β)天的平均温度。
再假设β等于0.5,再画出相应曲线如下图:

也就是某一天温度为前两天温度的平均,可以发现数据与原本蓝色的数据相当拟合,但是温度的变化也非常陡峭。
分析:
一般来说,我们的数据也像上面的温度一样,是有噪声的,如果用滑动平均算法,就可以使数据变化更加平滑,训练出来的模型更具有泛化性,较小的β值会导致数据噪声降低的不够,较大的β值又会导致数据过分右移,与真实数据取别太大,因此需要找到一个合适的β值,使模型泛化的更好。同时滑动平均模型在深度学习中只占用较少的内存,解释如下:
假设β为0.9,如果说用vt = 1/(1-β)天的平均值,我们需要提供前十天的温度,但是如果用vt = vt-1β + at(1-β)我们则只需提供两个值即可,大大降低内存使用量
偏差修正
tensorflow中的滑动平均
参考文献:https://blog.csdn.net/m0_/article/details/
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228561.html原文链接:https://javaforall.net
