tf moving average

tf中用到movingaverage的主要有兩處,一個是數據的批處理,更新均值和方差時一個是對訓練參數的更新時

 

1數據批處理

每一層數據的批處理,批處理的對象是每一層,一層中的某個特徵向量作爲一個特徵點
對批處理時,會有一個均值與方差參數,對均值與方差的更新不是簡單的使用取均值,而是前後均值之間通過指數衰減函數來進行更新
另外,個人對於批處理大小的設置的一點建議,通常來說,在電腦顯存或內存允許的情況下,批處理大小大點好,但是
當資源有限時,而對於你的訓練樣本,比如說一個類別的樣本不多,只有50個時,最好將批的大小設置成50的整數倍比較好

tensorflow中有一個函數是對數據進行批處理的:
tf.nn.batch_normalization
其函數定義是:
def batch_normalization(x, mean, variance, offset, scale, variance_epsilon, name=None):
mean與variance好理解,是均值和方差
offset是偏移,scale是尺度,對數據進行均值與方差進行歸一化後,還要乘以尺度,再加上偏移,這個尺度與偏移是可訓練的參數

在對數據進行歸一化後,還需要對求得的均值與方差進行指數衰減更新,如果單純的使用上面的更新也可以,但是效果可能比加了指數更新的
要差,另外,對均值和方差進行指數滑動平均時,有一個衰減係數,這個衰減係數通常設置成接近1,典型的設置範圍是0.999-0.99-0.9
如果訓練時出現訓練樣本結果好,測試樣本差(過擬合),可以嘗試將這個衰減係數的值降低,將tf.nn.batch_normalization包裝起來加入moving average
的函數是slim.batch_norm()
使用這個函數需要輸入批處理參數,下面只列舉了這個函數參數的一部分:
 

 batch_norm_params = {
    # Decay for the moving averages.
    'decay': 0.995,
    # epsilon to prevent 0s in variance.,就是在歸一化時,除以方差時,防止方差爲0而加上的一個數
    'epsilon': 0.001,
    # force in-place updates of mean and variance estimates
    'updates_collections': None,
    # Moving averages ends up in the trainable variables collection
    'variables_collections': [ tf.GraphKeys.TRAINABLE_VARIABLES ],
    #是否是在訓練模式,如果是在訓練階段,將會使用指數衰減函數(衰減係數爲上面指定的decay),
    #對moving_mean和moving_variance進行統計特性的動量更新,也就是進行使用指數衰減函數對均值和方差進行更新
    #而如果是在測試階段,均值和方差就是固定不變的,是在訓練階段就求好的,在訓練階段,每個批的均值和方差的更新是
    #加上了一個指數衰減函數,而最後求得的整個訓練樣本的均值和方差就是所有批的均值的均值,和所有批的方差的無偏估計,具體公式見下面
    'is_training':True,
    #如果爲True,將會創建一個新的變量對 'moving_mean/biased' and 'moving_mean/local_step',默認設置爲False,
    #將其設爲True可以增加穩定性
    'zero_debias_moving_mean':True,

  }


關於批處理更詳細好理解的鏈接:
http://blog.csdn.net/hjimce/article/details/50866313
http://www.jianshu.com/p/0312e04e4e83

 

2 訓練參數更新時的moving average

        而使用指數衰減函數進行處理的除了在批處理中對批均值和方差進行處理,還有對可訓練參數的更新時,也使用這個函數,這個函數
個人的理解就是結合上一次參數梯度的更新方向與這一次根據loss求得的梯度的更新方向,得到本次梯度應該更新的方向,說到底就是爲了
加速收斂,而在實踐中對參數使用指數衰減函數有時會產生相當好的結果(相比於不使用這個函數)

tf.train.ExponentialMovingAverage


這個函數的apply方法增加了對訓練了的變量的淺層複製,以及根據上一次複製的變量值和當前變量值的進行滑動平均的操作。
這個滑動平均的操作通常在每個訓練步完成後進行,變量更新的公式:

shadow_variable = decay * shadow_variable + (1 - decay) * variable


shadow_variable是上一次進行滑動平均後更新的變量,variable是當前的變量

該函數的官方定義:

http://wiki.jikexueyuan.com/project/tensorflow-zh/api_docs/python/train.html#ExponentialMovingAverage

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