Maintains moving averages of variables by employing an exponential decay.这是官方的文档解释。
要想理解上面这句话就要知道什么是moving average和exponential decay。下面分别解释一下这两个概念。
exponential decay
在有时学习率的设置时,我们会把学习率设计为指数衰减的,就是让学习率满足一些性质的情况下不断下降,这里指数衰减的一个性质是它的衰减值是当前值的一部分,也就是说
dNdt=−λN
,其中N是要进行衰减的值,例如学习率。
为了满足上面的性质,具体的衰减如下,
N(t)=N0e−λt,
moving average
维基百科的解释:In statistics, a moving average (rolling average or running average) is a calculation to analyze data points by creating series of averages of different subsets of the full data set. 翻译成中文:在统计学中,移动平均通过建立整个数据集中的一系列子集的平均值来分析数据点的计算方法。这种方法通常用在时间序列分析中,例如股票涨跌这样的数据都是离散的,有波动的,为了更容易分析,因此可以把这样的数据做移动平均,这样可以使得小的波动更平滑,而又能显示出长期的整体趋势。在数学上这样的操作可以看做是“卷积”。
Exponential Moving Average
上面提到moving average类似于卷积的操作,因此我们就可以在卷积核上做文章,最普通的卷积核就是每个数据的权重都相同,但是在实际中明显越近的数据价值越大,因此要让越近的数据权重越大,越远的数据权重越小,在这里使用的权重衰减策略就是指数衰减。具体的,
其中,
- α 控制衰减速率。
- Yt 表示时间t时的原始值
- St 表示经过EMA后的时间t的值
综上我们就知道了,EMA就是把一系列的离散数据点转化为更“好”的数据点,它的后面的数据点会记住前面的数据点的一些信息,离得越远记得越少。
tensorflow中的ema
tf.train.ExponentialMovingAverage是用来让模型不被更新的太快的一种方法,在实际应用中会有两个变量:模型变量variable和影子变量shadow variable,shadow_variable = decay * shadow_variable + (1 - decay) * variable,在上面这个公式中可以看到,decay使得shadow variable具有一定的缓冲能力,不会变化太快,为了让前期训练加快,可以计入num_update参数,使得decay = min(decay, (1 + num_updates) / (10 + num_updates))。