1. 程式人生 > >TensorFlow中滑動平均模型介紹

TensorFlow中滑動平均模型介紹

內容總結於《TensorFlow實戰Google深度學習框架》

不知道大家有沒有聽過一階滯後濾波法:

new_value=(1a)×value+a×old_value

其中a的取值範圍[0,1],具體就是:本次濾波結果=(1-a)本次取樣值+a上次濾波結果,採用此演算法的目的是:
1、降低週期性的干擾;
2、在波動頻率較高的場合有很好的效果。

而在TensorFlow中提供了tf.train.ExponentialMovingAverage 來實現滑動平均模型,在採用隨機梯度下降演算法訓練神經網路時,使用其可以提高模型在測試資料上的健壯性(robustness)。

TensorFlow下的 tf.train.ExponentialMovingAverage 需要提供一個衰減率decay。該衰減率用於控制模型更新的速度。該衰減率用於控制模型更新的速度,ExponentialMovingAverage 對每一個待更新的變數(variable)都會維護一個影子變數(shadow variable)。影子變數的初始值就是這個變數的初始值,

shadow_variable=decay×shadow_variable+(1decay)×var
iable

上述公式與之前介紹的一階滯後濾波法的公式相比較,會發現有很多相似的地方,從名字上面也可以很好的理解這個簡約不簡單演算法的原理:平滑、濾波,即使資料平滑變化,通過調整引數來調整變化的穩定性。

在滑動平滑模型中, decay 決定了模型更新的速度,越大越趨於穩定。實際運用中,decay 一般會設定為十分接近 1 的常數(0.999或0.9999)。為了使得模型在訓練的初始階段更新得更快,ExponentialMovingAverage 還提供了 num_updates 引數來動態設定 decay 的大小:

decay=min{decay,1+num_updates10+num_updates}

用一段書中程式碼帶解釋如何使用滑動平均模型:

import tensorflow as tf

v1 = tf.Variable(0, dtype=tf.float32)//初始化v1變數
step = tf.Variable(0, trainable=False) //初始化step為0
ema = tf.train.ExponentialMovingAverage(0.99, step) //定義平滑類,設定引數以及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)])

output:

[0.0, 0.0]
[5.0, 4.5]
[10.0, 4.5549998]
[10.0, 4.6094499]