Machine Learning,  Programming

滑动平均模型

原理

又称为指数加权移动平均算法,用通俗的话来讲,就是使用滑动平均模型,使得整体数据变得更加平滑——这意味着数据的噪音会更少,也不会出现异常值,在深度学习中,还有另一个优点:它只占用极少的内存。

来看一个例子

avatar

那么我们现在要模拟一条曲线来描述这个温度的变化趋势,显然需要做一点处理:

首先给定一个值v0,然后我们定义每一天的温度是a1,a2,a3····· 接着,我们计算出v1,v2,v3····来代替每一天的温度,也就是上面的a1,a2,a3 计算方法是:v1 = v0 * 0.9 + a1 (1-0.9),v2= v1 0.9 + a2 (1-0.9),v3= v2 0.9 + a3 (1-0.9)···,也就是说,每一天的温度改变为前一天的v值 0.9 + 当天的温度 * 0.1,vt = v(t-1) * 0.9 + at * 0.1,把所有的v计算完之后画图,红线就是v的曲线:

avatar

v值就是指数加权平均数,整个过程就是指数加权平均算法,把0.9抽象为变量β,总结为vt = v(t-1) * β + at * (1-β)

那么,β到底是什么?β=0.9的时候,1/(1-β)就等于十,也就是vt=前十天的平均温度,如果我们将β值增大到1,也就是前50天的平均温度,那么现在的曲线:

avatar

明显看到绿线比红线的变化更迟,红线达到某一温度,绿线要过一阵子才能达到相同温度。因为绿线是前50天的平均温度,变化就会更加缓慢,而红线是最近十天的平均温度,只要最近十天的温度都是上升,红线很快就能跟着变化

那么β=0.5,也就是最近两天的平均温度呢?

avatar

和原本的温度很相似,但曲线的波动幅度也相当大!

这也就是我们之前说的,让曲线更加的平滑。

偏差修正

为什么会出现偏差?

比如β=0.98时,曲线就跟紫线一样:

avatar

可以看到紫线刚刚开始的时候,曲线的值相当低,因为一开始的时候并没有50天,相当于少加了几十天的数据,所以vt的值很小,差距很大,也就是偏差

而在TensorFlow中的ExponentialMovingAverage()采取的偏差修正方法是:使用num_updates来动态设置β的大小

avatar

在数据迭代的前期,数据量比较少的时候,(1+num_updates)/(10+num_updates)的值比较小,使用这个值作为β来进行vt的计算,所以在迭代前期就会像上面的红线一样,和原数据更加接近。举个例子,当天数是第五天,β为0.98,那么(1+num_updates)/(10+num_updates) = 6/15 = 0.4,相当于最近1.6天的平均温度,而不是β=0.98时候的50天,这样子就做到了偏差修正。

发表评论

电子邮件地址不会被公开。 必填项已用*标注