tensorflow的滑動平均模型
文章目錄
1. 什麼是滑動平均法
基本原理
滑動模型是一種簡單的平滑預測技術。當一組資料在變化中存在較大波動起伏較大,不易顯示出變化趨勢,影響預測函式的平滑度時,使用移動平均法可以消除這些因素的影響,顯示出事件的發展方向與趨勢(即趨勢線),然後依趨勢線分析預測序列的長期趨勢。
簡單滑動平均法
簡單移動平均的各元素的權重都相等。簡單的移動平均的計算公式如下: Ft=(At-1+At-2+At-3+…+At-n)/n式中,
·Ft–對下一期的預測值;
·n–移動平均的時期個數;
·At-1–前期實際值;
例子:
某類房地產2001年各月的價格如下表中第二列所示。由於各月的價格受某些不確定因素的影響,時高時低,變動較大。如果不予分析,不易顯現其發展趨勢。如果把每幾個月的價格加起來計算其移動平均數,建立一個移動平均數時間序列,就可以從平滑的發展趨勢中明顯地看出其發展變動的方向和程度,進而可以預測未來的價格。
加權滑動平均法
加權滑動平均模型給每個資料賦予不同的權重,將簡單的移動平均法換為求取加權平均。
2、tensorflow中的滑動平均模型
在tensorflow中,滑動平均相當於一個影子值(像是給引數加了影子,引數變化,影子隨之追隨逼近引數值),記錄了每個引數一段時間內過往值的平均,增加了模型的泛化性。滑動平均不僅表現了當前值,還表現了過去一段時間內的平均值。
滑動平均的計算
影子 = 衰減率x影子 +(1-衰減率)x 引數 (影子初值=引數初值, 衰減率一般設定為非常接近1的數,比如0.999,0.9999等)
衰減率=min{MOVING_AVERAGE_DECY,(1+輪數)/(10+輪數)})
具體使用示例:
import tensorflow as tf
# 1.定義變數及滑動平均類
# 定義一個32位浮點變數,初始值位0.0,這個程式碼就是不斷更新w1引數,優化w1,滑動平均做了一個w1的影子
w1 = tf.Variable(0, dtype=tf.float32)
# 定義num_updates(NN的迭代輪數),初始值為0,不可被優化,這個引數不訓練
global_step = tf.Variable(0, trainable=False)
# 例項化滑動平均類,設衰減率為0.99,當前輪數global_step
MOVING_AVERAGE_DECAY = 0.99
ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step)
# ema.apply後面的括號是更新列表,每次執行sess.run(ema_op)時,對更新列表求滑動平均值
# 在實際應用中會使tf.trainable_variables()自動將所有訓練的引數彙總為列表
# ema_op = ema.apply([w1])
ema_op = ema.apply(tf.trainable_variables())
# 2.檢視不同迭代中變數取值的變化
# 初始化變數,計算圖節點要運用的會話實現
with tf.Session() as sess:
# 初始化變數
init_op = tf.global_variables_initializer()
# 計算圖節點運算
sess.run(init_op)
# 用ema.average(w1)獲取w1滑動平均值
# 打印出當前引數w1和w1的滑動平均
print(sess.run([w1, ema.average(w1)]))
# 引數w1賦值為1
# tf.assign(A, new_number): 這個函式的功能主要是把A的值變為new_number
sess.run(tf.assign(w1, 1))
sess.run(ema_op)
print(sess.run([w1, ema.average(w1)]))
# 更新step和w1的值,模擬出100輪迭代後,引數w1變為10
sess.run(tf.assign(global_step,100))
sess.run(tf.assign(w1, 10))
sess.run(ema_op)
print(sess.run([w1, ema.average(w1)]))
# 複製貼上幾次執行滑動平均節點的操作
for i in range(100):
sess.run(ema_op)
print(sess.run([w1, ema.average(w1)]))
輸出結果
[0.0, 0.0]
[1.0, 0.9]
[10.0, 1.6445453]
[10.0, 2.3281732]
[10.0, 2.955868]
[10.0, 3.532206]
[10.0, 4.061389]
[10.0, 4.547275]
.
.
.
[10.0, 9.997882]
[10.0, 9.998055]
[10.0, 9.998215]
[10.0, 9.998361]
可以看到,在每次引數w1變化的時候,影子引數都會隨著迭代不斷地向變化後的引數逼近。
因為影子引數平均了以往的引數可以有效地消除數值波動的影響,所以在測試集中使用影子引數代替原始變數會使得模型在測試集上表現得更為健壯。