跨卡同步 Batch Normalization

一.爲什麼要跨卡同步 Batch Normalization

現有的標準 Batch Normalization 因爲使用數據並行(Data Parallel),是單卡的實現模式,只對單個卡上對樣本進行歸一化,相當於減小了批量大小(batch-size)。 對於比較消耗顯存的訓練任務時,往往單卡上的相對批量過小,影響模型的收斂效果。 之前在在圖像語義分割的實驗中,就發現使用大模型的效果反而變差,實際上就是BN在作怪。 跨卡同步 Batch Normalization 可以使用全局的樣本進行歸一化,這樣相當於‘增大‘了批量大小,這樣訓練效果不再受到使用 GPU 數量的影響。 最近在圖像分割、物體檢測的論文中,使用跨卡BN也會顯著地提高實驗效果,所以跨卡 BN 已然成爲競賽刷分、發論文的必備神器。

二. Batch Normalization

內部協轉移(Internal Covariate Shift):由於訓練時網絡參數的改變導致的網絡層輸出結果分佈的不同。這正是導致網絡訓練困難的原因。

因此提出了兩種簡化方式來加速收斂速度: 1)對特徵的每個維度進行標準化,忽略白化中的去除相關性; 2)在每個mini-batch中計算均值和方差來替代整體訓練集的計算。

BN前向過程如下:

                        

BN反向過程如下: 

                

BN 有效地加速了模型訓練,加大 learning rate,讓模型不再過度依賴初始化。它在訓練時在網絡內部進行歸一化(normalization), 爲訓練提供了有效的 regularization,抑制過擬合,用原作者的話是防止了協方差偏移。這裏上一張圖來展示訓練模式的BN:

                                                             

其中輸入樣本,其均值爲,方差爲, BN的輸出,是可學習對參數。 個人認爲,這種強大的效果其實來自於back-propagation時候,來自於均值和方差對輸入樣本的梯度( )。 這也是BN在訓練模式與其在測試模式的重要區別,在測試模式(evaluation mode)下, 使用訓練集上累積的均值和方差,在back-propagation的時候他們對輸入樣本沒有梯度(gradient)。 

在訓練時計算mini-batch的均值和標準差並進行反向傳播訓練,而測試時並沒有batch的概念,訓練完畢後需要提供固定的

                                                                                         

供測試時使用。論文中對所有的mini-batch的

                                                                                          2019-08-17-9

取了均值:

                                                                         

測試階段,同樣要進行歸一化和縮放平移操作,唯一不同之處是不計算均值和方差,而使用訓練階段記錄下來的 

                                                                                            

                                                    

Batch Norm優點:

  • 減輕過擬合
  • 改善梯度傳播(權重不會過高或過低)
  • 容許較高的學習率,能夠提高訓練速度。
  • 減輕對初始化權重的強依賴,使得數據分佈在激活函數的非飽和區域,一定程度上解決梯度消失問題。
  • 作爲一種正則化的方式,在某種程度上減少對dropout的使用。

 三.BN訓練與測試過程

BN層有4個參數,gamma、beta、moving mean、moving variance。其中gamma、beta爲學習參數,moving mean、moving variance爲數據集統計均值與方差,不可學習。在訓練過程中:

      

y爲BN層輸出,此時歸一化的均值與方差爲當前mini-batch的均值與方差。同時也記錄moving mean、moving variance的值,每訓練一個batch,moving mean、moving variance就更新一次。注意此參數更新過程不是學習過程,而是純粹的計算train-set在當前BN數據分佈過程,因此不能將算作是學習過程。decay爲一個接近於1的值,比如0.9997。

在測試過程中:

                                    

四.數據並行

深度學習平臺在多卡(GPU)運算的時候都是採用的數據並行(DataParallel),如下圖:

                                                 

每次迭代,輸入被等分成多份,然後分別在不同的卡上前向(forward)和後向(backward)運算,並且求出梯度,在迭代完成後合併梯度、更新參數,再進行下一次迭代。因爲在前向和後向運算的時候,每個卡上的模型是單獨運算的,所以相應的Batch Normalization 也是在卡內完成,所以實際BN所歸一化的樣本數量僅僅侷限於卡內,相當於批量大小(batch-size)減小了。

五.跨卡同步(Cross-GPU Synchronized)或 同步BN(SyncBN)

 跨卡同步BN的關鍵是在前向運算的時候拿到全局的均值和方差,在後向運算時候得到相應的全局梯度。 最簡單的實現方法是先同步求均值,再發回各卡然後同步求方差,但是這樣就同步了兩次。實際上只需要同步一次就可以,因爲總體batch_size對應的均值和方差可以通過每張GPU中計算得到的

                                                                                 

得到. 在反向傳播時也一樣需要同步一次梯度信息, 祥見論文Context Encoding for Semantic Segmentation :

                                                           

這樣在前向運算的時候,我們只需要在各卡上算出x_ix_i^2,再跨卡求出全局的和即可得到正確的均值和方差, 同理我們在後向運算的時候只需同步一次,求出相應的梯度與。 

有了跨卡BN我們就不用擔心模型過大用多卡影響收斂效果了,因爲不管用多少張卡只要全局的批量大小一樣,都會得到相同的效果。

六.總結

1.sync資源

  1. jianlong-yuan/syncbn-tensorflow重寫了TensorFlow的官方方法,可以做個實驗驗證一下。
  2. 曠視科技:CVPR 2018 曠視科技物體檢測冠軍論文——大型Mini-Batch檢測器MegDet
  3. tensorpack/tensorpack裏面有該論文的代碼實現。

2.some problems

爲什麼不用全局mean和var,能不能先把整個數據集的mean和var計算出來,在訓練的時候設置好mean和var並且不更新(use_global_states = True)?

不可以。因爲訓練過程中每一層的值都是在隨着權重參數的變換在動態變化的,這個時候每一層的mean 和var就會不斷變化 如果用global states的話就等價於對於原數據做了一個固定值偏移   相當於沒有batchnorm 

3.2 爲什麼不進行多卡同步?

現有框架BatchNorm的實現都是隻考慮了single gpu。也就是說BN使用的均值和標準差是單個gpu算的,相當於縮小了mini-batch size。至於爲什麼這樣實現,1)因爲沒有sync的需求,因爲對於大多數vision問題,單gpu上的mini-batch已經夠大了,完全不會影響結果。2)影響訓練速度,BN layer通常是在網絡結構裏面廣泛使用的,這樣每次都同步一下GPUs,十分影響訓練速度。

 

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