滑动平均模型(MA)—tensorflow
在采用梯度下降的方式训练神经网络的时候,我们使用滑动平均模型会在一定的程度上提高最终模型在测试集上的表现。
在TensorFlow中提供了tf.train.ExponentialMovingAverage来实现滑动平均模型,在初始化ExponentialMovingAverage的时候,需要提供一个衰减率(decay)。这个衰减率将来控制模型更新的速度,ExponentialMovingAverage对每个变量会维护一个影子变量(shadow variable),这个影子变量的初始值就是相应变量的初始值,而每次运行变量更新时,影子变量的值会更新为:
shadow_variable = decay × shadow_variable + (1 - decay) × variable
ExponentialMovingAverage还提供了num_updates参数控制decay的大小。如果在ExponentialMovingAverage中提供了num_updates每次使用的衰减率将是:
min{decay,(1+numupdates)/(10+numupdates)}
下面通过一段代码解释如何使用:
import tensorflow as tf
v1 = tf.Variable(0, dtype=tf.float32)
step = tf.Variable(0, trainable=False)
ema = tf.train.ExponentialMovingAverage(0.99, step)
maintain_averages_op = ema.apply([v1])
with tf.Session() as sess:
# 初始化
init_op = tf.global_variables_initializer()
sess.run(init_op)
print sess.run([v1, ema.average(v1)])
# 更新变量v1的取值
sess.run(tf.assign(v1, 5))
sess.run(maintain_averages_op)
print sess.run([v1, ema.average(v1)])
# 更新step和v1的取值
sess.run(tf.assign(step, 10000))
sess.run(tf.assign(v1, 10))
sess.run(maintain_averages_op)
print sess.run([v1, ema.average(v1)])
# 更新一次v1的滑动平均值
sess.run(maintain_averages_op)
print sess.run([v1, ema.average(v1)])
[0.0, 0.0]
[5.0, 4.5]
[10.0, 4.5549998]
[10.0, 4.6094499]