スライド平均モデル(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が毎回使用する減衰率は、m i n{d e c a y,(1+n u m u p d a t e s)/(10+n u m u p d a t e s)}min{decay,(1+num_updates)/(10+num_updates)}min{decay,(1+numu pdates)/(10+numu pdates)}
次のコードで使用方法を説明します.
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]