tensorflow使用tf.train.ExponentialMovingAverage實現滑動平均模型,在使用隨機梯度下降方法訓練神經網絡時候,使用這個模型可以增強模型的魯棒性(robust),可以在一定程度上提高模型在測試數據集上的表現。
滑動平均模型為每個變量維護一個影子變量,其初始值是變量的初始值,每次變量更新時,影子變量的值會更新為:
shadow_variable = shadow_variable * decay + (1-decay) * variable
其中shadow_variable為影子變量,variable為初始變量,decay為衰減率。
decay決定了模型更新的速度,decay越大,模型跟新越慢,越穩定。實際工作中,decay一般設置為非常接近1的數(0.99或0.999之類),為了在訓練初期加快更新速度,可以提供num_steps參數,提供這個參數后,decay的取值變為:
min(decay, (1+num_step)/(10+num_step))
num_step表示實際的訓練步數。
如果提供了num_steps那么在num_step還比較小的時候,min()會取到右邊比較小的部分,也就是有一個比較小的decay,這個時候模型更新會很快,當step增大時,模型更新速度會逐漸降低。
在應用滑動平均模型后,並不會改變變量的值,但是會維護一個影子變量來記錄其滑動平均值,獲取變量的滑動平均值實際上就是獲取變量的影子變量的值,影子變量的值是當前值和更新后的值之間的一個值,相當與限制參數的更新速度,讓更新比較緩慢,比較穩妥,但是在訓練初期會導致更新比較慢,所以才有提供num_steps參數使之在訓練初期更新比較快。