该函数用于更新参数,就是采用滑动平均的方法更新参数:
tf.train.ExponentialMovingAverage(decay, steps)
这个函数初始化需要提供一个衰减速率(decay
),用于控制模型的更新速度。这个函数还会维护一个影子变量,也就是更新参数后的参数值,这个影子变量的初始值就是这个变量的初始值,影子变量值的更新方式如下:
shadow_variable = decay * shadow_variable + (1 - decay) * variable
shadow_variable
是影子变量;variable
表示待更新的变量,也就是变量被赋予的值;decay
为衰减速率,一般设为接近于1
的数(0.99
或0.999
),其越大模型越稳定,因为decay
越大,参数更新的速度就越慢,趋于稳定。
tf.train.ExponentialMovingAverage
这个函数还提供了自己动更新decay
的计算方式:
decay = min(decay, (1 + steps) / (10 + steps))
steps
是迭代的次数,可以自己设定。
import tensorflow as tf
import numpy as np
v1 = tf.Variable(0, dtype=tf.float32)
step = tf.Variable(tf.constant(0))
ema = tf.train.ExponentialMovingAverage(0.99, step)
maintain_average = ema.apply([v1])
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
print(sess.run([v1, ema.average(v1)])) # 初始的值都为0
sess.run(tf.assign(v1, 5)) # 把v1变为5
sess.run(maintain_average)
# “decay = min(0.99, 1/10) = 0.1”,“v1 = 0.1 * 0 + 0.9 * 5 = 4.5”
print(sess.run([v1, ema.average(v1)]))
sess.run(tf.assign(step, 10000)) # steps = 10000
sess.run(tf.assign(v1, 10)) # v1 = 10
sess.run(maintain_average)
# “decay = min(0.99, (1 + 10000)/(10 + 10000)) = 0.99”,“v1 = 0.99 * 4.5 + 0.01 * 10 = 4.555”
print(sess.run([v1, ema.average(v1)]))
sess.run(maintain_average)
# “decay = min(0.99, (1 + 10000)/(10 + 10000)) = 0.99”,“v1 = 0.99 * 4.555 + 0.01 * 10 = 4.6”
print(sess.run([v1, ema.average(v1)]))