(Tensorflow之六)滑動平均模型ExponentialMovingAverage

1、計算方法

{a1,a2,a3,...,an} ,其衰減率爲decay ,對應的影子變量爲:
{m1,m2,m3,...,mn} ,則:

mn=decaymn1+(1decay)an

可以展開來分析:
m1=a1

m2=decaya1+(1decay)a2

m3=decaym2+(1decay)a3=decay2a1+(1decay)decaya2+(1decay)a3

m4=decaym3+(1decay)a4=decay3a1+(1decay)decay2a2+(1decay)decaya3+(1decay)a4

......

以其類推
mn=decaymn1+(1decay)an=decayn1a1+decayn2(1decay)+...+(1decay)an

一般而言,爲了使模型趨於收斂,會選擇decay爲接近1的數,例如:
decay = 0.99;
那麼:
m1=a1

m2=0.99a1+0.01a2

m3=0.99m2+0.01a3=0.992a1+0.010.99a2+0.01a3

我們發現初始值對後面影響非常大,若初始值與真實值偏差較大時,函數收斂速度非常慢;爲了解決該問題,tensorflow提供了num_updates參數來動態設置decay的大小;
decay=min{DECAY,1+num_updates10+num_updates}

例:
DECAY = 0.99
第一輪,先設num_updates = 0;
那麼:

decay=min{0.99,1+010+0}=0.1

則:
m1=a1

m2=0.1a1+0.9a2

第二輪,可設num_updates = 100
那麼:
decay=min{0.99,1+10110+100}=0.91

則:
m3=0.91m2+0.09a3

以此類推,從而可以動態調整decay值大小。
import tensorflow as tf

test1 = tf.Variable(0,dtype=tf.float32)
num_updates = tf.Variable(0,dtype=tf.float32)
DECAY = 0.99

Moving_average = tf.train.ExponentialMovingAverage(DECAY,num_updates)

#跟新test1
Moving_average_op = Moving_average.apply([test1])

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    #第一次打印出初始值,滑動平均值,輸出值應該爲[0,0]
    print(sess.run([test1,Moving_average.average(test1)]))

    #更新test1
    sess.run(tf.assign(test1,3))
    sess.run(Moving_average_op)
    #第二次打印初始值,滑動平均值,輸出值應該爲[3,0],滑動平均值計算0*0.1+0.9*3=2.7
    print(sess.run([test1,Moving_average.average(test1)]))

    #更新test2與num_updates
    sess.run(tf.assign(test1,5))
    sess.run(tf.assign(num_updates,90))
    sess.run(Moving_average_op)
    #第三次打印初始值,滑動平均值,輸出值應該爲[3,0],滑動平均值計算2.7*0.91+5*0.09
    print(sess.run([test1,Moving_average.average(test1)]))   

輸出值

[0.0, 0.0]
[3.0, 2.6999998]
[5.0, 2.9069998]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章