爲什麼需要Batch Normalization?
在深度學習中,因爲網絡的層數非常多,如果數據分佈在某一層開始有明顯的偏移,隨着網絡的加深這一問題會加劇(即internal covariate shift),進而導致模型優化的難度增加,甚至不能優化。BN與對輸入進行Normalization類似,只不過是Normalization網絡的中間層,從而使中間各層輸入值的分佈相對獨立,減小前層網絡對其的影響,從而加速學習的過程。(如果沒有進行BN操作,對於深層網絡,中間層輸入特徵分佈可能一直在變化,將會使後面的網絡很難對其進行學習。)
Batch Normalization算法
Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
由上圖可知,Batch Normalization(BN)算法總共有四行,分兩步。第一步是前三行,將激活值(原論文中進行BN的是激活函數的輸入值)轉換到均值爲0,方差爲1的分佈範圍內;第二步是第四行,爲了對進行Normalization操作後的激活值進行微調(Normalization操作後的激活值與),其中和是可學習的,以此來補償Normalization操作後神經網絡的非線性表達能力(對於sigmoid、tanh激活函數,如果輸入值都服從均值0,方差1的分佈,那麼絕大部分值將落在線性段,使神經網絡的非線性表達能力減弱。ReLu激活函數?)。
關於BN算法的幾個小問題
爲什麼用可學習的和對網絡激活值進行微調? -> 從某種意義上來說,和代表的其實是輸入數據分佈的方差和偏移。對於沒有BN的網絡,這兩個值與前一層網絡帶來的非線性性質有關,而經過變換後,就跟前面一層無關,變成了當前層的一個學習參數,這更加有利於優化並且不會降低網絡的能力。(深度學習中 Batch Normalization爲什麼效果好? )
進行BN的位置? -> 目前有兩種在神經元中插入Normalization操作的地方(參考下圖),第一種是原始BN論文提出的,放在激活函數之前;另外一種是後續研究提出的,放在激活函數之後,不少研究表明將BN放在激活函數之後效果更好。(深度學習中的Normalization模型)
對於MPL和CNN,需要Normalization的值有哪些? -> 對於多層感知器(MLP),如上圖,每個神經元輸出是一個激活值,對此激活值進行Normalization操作;對於卷積神經網絡(CNN),可以把卷積層想象成MLP中的一個隱藏層,然後把對應的某個卷積核想象成MLP隱層中的一個神經元,經過每個卷積核(神經元)輸出是一個激活平面,激活平面中任意一個激活值都需要進行Normalization操作。(深度學習中的Normalization模型)
Batch Normalization的缺點
上圖是BN的training過程,第10步計算了所有mini-batch的均值的期望,方差的無偏估計,以此作爲後續Inference時固定的均值和方差(第11步)。這一步默認了mini-batch與樣本整體服從同一分佈(即可以用計算的和代替樣本整體的和)。
當存在以下兩種情況:
- mini-batch的尺寸很小;
- mini-batch內數據不是獨立同分布。
以上兩種情況會使默認的條件不成立,因此需要尋找解決這個問題的辦法,即下面的Batch Renormalization。
Batch Renormalization算法
Batch Renormalization: Towards Reducing Minibatch Dependence in Batch-Normalized Models
通過對BN中Normalization後的值進行一步仿射變換(一個線性變換和一個平移,r和d不參與反向傳播),然後計算移動平均值,對和不斷更新,training結束時候的值作爲Inference時固定的均值和方差。這樣做的好處有以下兩個:
- 對於BN,在training中計算的移動平均值和,僅僅在Inference時使用;對於Batch Renormalizatiuon,計算的移動平均值和在訓練的時候就在不斷的修正,使和更加逼近樣本整體的均值和方差。
- 使用BN算法,在Training和Inference中進行Normalization後的均值和方差是不一樣的;而使用Batch Renormalization算法,在Training和Inference中進行Normalization後的均值和方差是一樣的(爲Inference時的固定的均值和方差)。
因此,當mini-batch足夠大(和可以代替和),使用BN和Batch Renormalization性能差別不大;當minibatch很小時(和噪聲很大,不能代替和),用Batch Renormalization會取得更好的性能。
ps:論文中指出,根據實驗的結果,在迭代初期僅使用BN而後逐步進行修正時效果較好,r和d施加了上下界的約束就是爲了實現這一點(?)。