- 概念
滑动平均是用来衡量当前趋势的方向。每种类型的滑动平均(MA)都是一个通过计算过去数据的平均值得到的数学结果。
“滑动”:当新值可用时,必须从集合中删除最老的数据点,并且必须引入新的数据点来替换它们。因此,数据集不断“移动”。这种计算方法确保只对当前信息进行核算。 - 计算
在采用随机梯度下降算法训练神经网络时,使用滑动平均模型在很多应用中都可以在一定程度上提高最终模型在测试数据上的表现。
在Tensorflow中提供了tf.train.ExponentialMovingAverage来实现滑动平均模型。在初始化ExponentialMovingAverage 时,需要提供一个衰减率(decay)。这个衰减率会用于控制模型的更新速度。ExponentialMovingAverage对每一个变量会维护一个影子变量(shadow variable),这个影子变量的初始值就是相应变量的初始值,而每次运行变量更新时,影子变量的值会被更新为:
shadow_variable = decay * shadow_variable + (1 - decay) * variable
添加目标变量,为之维护影子变量。注意维护不是自动的,需要每轮训练中运行此句,所以一般都会使用tf.control_dependencies使之和train_op绑定,以至于每次train_op都会更新影子变量
ema.apply([var0, var1])
从影子变量集合中提取目标值
sess.run(ema.average([var0, var1]))
ExponentialMovingAverage使用实例
import tensorflow as tf
v1 = tf.Variable(0.,dtype=tf.float32)
step = tf.variable(0,trainable=False)
#设置滑动平均模型的系数
ema = tf.train.ExponentialMovingAverage(0.99,step)
#设置变量v使用滑动平均模型,tf.all_variables()设置所有变量
maintain_averages_op = ema.apply([v1])
with tf.Session() as sess:
init_op = tf.global_variables_initializer
sess.run(init_op)
printsess.run([v1,ema.average(v1)])
sess.run(tf.assigh(v1,5))
sess.run(maintain_averages_op)
print sess.run([v1,ema.average(v1)])
sess.run(tf.assigh(step,1000))
sess.run(tf.assigh(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)])