浅笑の博客

我们的征途是星辰大海


  • 首页

  • 标签29

  • 分类6

  • 归档47

  • 留言板

  • 搜索

滑动平均(exponential moving average)

发表于 2019-08-02 分类于 深度学习 Valine: 本文字数: 3.5k

滑动平均

什么是滑动平均

滑动平均法是用一组最近的实际数据值来预测未来一期或几期内公司产品的需求量、公司产能等的一种常用方法。滑动平均法适用于即期预测。当产品需求既不快速增长也不快速下降,且不存在季节性因素时,滑动平均法能有效地消除预测中的随机波动,是非常有用的。滑动平均法根据预测时使用的各元素的权重不同

滑动平均法是一种简单平滑预测技术,它的基本思想是:根据时间序列资料、逐项推移,依次计算包含一定项数的序时平均值,以反映长期趋势的方法。因此,当时间序列的数值由于受周期变动和随机波动的影响,起伏较大,不易显示出事件的发展趋势时,使用滑动平均法可以消除这些因素的影响,显示出事件的发展方向与趋势(即趋势线),然后依趋势线分析预测序列的长期趋势。

用滑动平均估计局部均值

变量$v$在$t$时刻记为$v_t$,$\theta_t$为变量$v$在$t$时刻的取值,即在不使用滑动平均模型时$v_t=\theta_t$,在使用滑动平均模型后,$v_t$的更新公式如下:

上式中,$\beta\in[0,1)$。$\beta=0$相当于没有使用滑动平均。
Andrew Ng在Course 2 Improving Deep Neural Networks中讲到$t$时刻变量$v$的滑动平均值大致等于过去$\frac{1}{1-\beta}$个时刻$θ$值的平均。这个结论在滑动平均起始时相差比较大,所以有了Bias correction,将$vt$除以$(1−β^t)$修正对均值的估计。
加入了Bias correction后,更新公式如下:

$t$越大,$1-\beta^t$越接近1,则两者将会越来越接近。
当$\beta$越大时,滑动平均得到的值越和$\theta$的历史值相关。若$\beta=0.9$,则大致等于过去10个$\theta$值的平均;若$\beta=0.99$,则大致等于过去100个$\theta$值的平均。

滑动平均的好处:

占内存少,不需要保存过去10个或者100个历史 θ 值,就能够估计其均值。(当然,滑动平均不如将历史值全保存下来计算均值准确,但后者占用更多内存和计算成本更高),同时使用滑动平均法进行预测能平滑掉需求的突然波动对预测结果的影响。

tf.train.ExponentialMovingAverage

函数定义

tensorflow中提供了tf.train.ExponentialMovingAverage来实现滑动平均模型,他使用指数衰减来计算变量的移动平均值。

tf.train.ExponentialMovingAverage.__init__(self, decay, num_updates=None, zero_debias=False, name="ExponentialMovingAverage")

函数介绍:

  • decay 是衰减率在创建ExponentialMovingAverage对象时,需指定衰减率(decay),用于控制模型的更新速度。影子变量的初始值与训练变量的初始值相同。当运行变量更新时,每个影子变量都会更新为:$shadow_variable$就是上式中的$v_t$,$variable$就是上式中的$\theta_t$,$decay$就是上式中的$\beta$。decay 决定了影子变量的更新速度,decay 越大影子变量越趋于稳定。在实际运用中,decay一般会设成非常接近 1 的数(比如0.999或0.9999)。
  • num_updates 是ExponentialMovingAverage提供用来动态设置decay的参数,当初始化时提供了参数,即不为none时,每次的衰减率是:这一点其实和Bias correction很像
  • apply() 方法添加了训练变量的影子副本,并保持了其影子副本中训练变量的移动平均值操作。在每次训练之后调用此操作,更新移动平均值。
  • average()和average_name() 方法可以获取影子变量及其名称。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import tensorflow as tf

# 定义一个变量,初始值为0
v1 = tf.Variable(0, dtype=tf.float32)
# step为迭代轮数变量,控制衰减率
step = tf.Variable(0, trainable=False)
# 初始设定衰减率为0.99
ema = tf.train.ExponentialMovingAverage(0.99, step)
# 更新列表中的变量
maintain_averages_op = ema.apply([v1])
with tf.Session() as sess:
# 初始化所有变量
init_op = tf.initialize_all_variables()
sess.run(init_op)
# 输出初始化后变量v1的值和v1的滑动平均值
print(sess.run([v1, ema.average(v1)]))
# 更新v1的值
sess.run(tf.assign(v1, 5))
# 更新v1的滑动平均值
sess.run(maintain_averages_op)
print(sess.run([v1, ema.average(v1)]))
# 更新迭代轮转数step
sess.run(tf.assign(step, 10000))
sess.run(tf.assign(v1, 10))
sess.run(maintain_averages_op)
print(sess.run([v1, ema.average(v1)]))
# 再次更新滑动平均值,
sess.run(maintain_averages_op)
print(sess.run([v1, ema.average(v1)]))
# 更新v1的值为15
sess.run(tf.assign(v1, 15))
sess.run(maintain_averages_op)
print(sess.run([v1, ema.average(v1)]))

输出:

1
2
3
4
5
[0.0, 0.0]
[5.0, 4.5]
[10.0, 4.555]
[10.0, 4.60945]
[15.0, 4.713355]

分析:

参考:
https://www.cnblogs.com/wuliytTaotao/p/9479958.html
https://www.cnblogs.com/cloud-ken/p/7521609.html

TensorFlow
论文阅读笔记6:Gradient Harmonized Single-stage Detector
论文阅读笔记7:Libra R-CNN:Towards Balanced Learning for Object Detection
Zheng Yujie

Zheng Yujie

C++/Python/深度学习
47 日志
6 分类
29 标签
目录
  1. 1. 滑动平均
    1. 1.1. 什么是滑动平均
    2. 1.2. 用滑动平均估计局部均值
    3. 1.3. 滑动平均的好处:
  2. 2. tf.train.ExponentialMovingAverage
    1. 2.1. 函数定义
    2. 2.2. 例子
© 2019 Zheng Yujie | 全站共199k字
浙ICP备 - 19035016号
0%