對於深度學習中 Batch Normallization (BN) 和 Batch Renormalization 的理解

爲什麼需要Batch Normalization?

在深度學習中,因爲網絡的層數非常多,如果數據分佈在某一層開始有明顯的偏移,隨着網絡的加深這一問題會加劇(即internal covariate shift),進而導致模型優化的難度增加,甚至不能優化。BN與對輸入進行Normalization類似,只不過是Normalization網絡的中間層,從而使中間各層輸入值的分佈相對獨立,減小前層網絡對其的影響,從而加速學習的過程。(如果沒有進行BN操作,對於深層網絡,中間層輸入特徵分佈可能一直在變化,將會使後面的網絡很難對其進行學習。)

Batch Normalization算法

Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
BN Transform

由上圖可知,Batch Normalization(BN)算法總共有四行,分兩步。第一步是前三行,將激活值(原論文中進行BN的是激活函數的輸入值)轉換到均值爲0,方差爲1的分佈範圍內;第二步是第四行,爲了對進行Normalization操作後的激活值進行微調(Normalization操作後的激活值與),其中β\betaγ\gamma是可學習的,以此來補償Normalization操作後神經網絡的非線性表達能力(對於sigmoid、tanh激活函數,如果輸入值都服從均值0,方差1的分佈,那麼絕大部分值將落在線性段,使神經網絡的非線性表達能力減弱。ReLu激活函數?)。

關於BN算法的幾個小問題

爲什麼用可學習的β\betaγ\gamma對網絡激活值進行微調? -> 從某種意義上來說,γ\gammaβ\beta代表的其實是輸入數據分佈的方差和偏移。對於沒有BN的網絡,這兩個值與前一層網絡帶來的非線性性質有關,而經過變換後,就跟前面一層無關,變成了當前層的一個學習參數,這更加有利於優化並且不會降低網絡的能力。(深度學習中 Batch Normalization爲什麼效果好? )

進行BN的位置? -> 目前有兩種在神經元中插入Normalization操作的地方(參考下圖),第一種是原始BN論文提出的,放在激活函數之前;另外一種是後續研究提出的,放在激活函數之後,不少研究表明將BN放在激活函數之後效果更好。(深度學習中的Normalization模型
BN_position

對於MPL和CNN,需要Normalization的值有哪些? -> 對於多層感知器(MLP),如上圖,每個神經元輸出是一個激活值,對此激活值進行Normalization操作;對於卷積神經網絡(CNN),可以把卷積層想象成MLP中的一個隱藏層,然後把對應的某個卷積核想象成MLP隱層中的一個神經元,經過每個卷積核(神經元)輸出是一個激活平面,激活平面中任意一個激活值都需要進行Normalization操作。(深度學習中的Normalization模型

Batch Normalization的缺點

Training BN

上圖是BN的training過程,第10步計算了所有mini-batch的均值μB\mu_\Beta的期望E[x]E[x],方差σB2\sigma_\Beta^2的無偏估計Var[x]Var[x],以此作爲後續Inference時固定的均值E[x]E[x]和方差Var[x]Var[x](第11步)。這一步默認了mini-batch與樣本整體服從同一分佈(即可以用計算的E[x]E[x]Var[x]Var[x]代替樣本整體的μall\mu_{all}σall2\sigma^2_{all}
當存在以下兩種情況:

  1. mini-batch的尺寸很小;
  2. mini-batch內數據不是獨立同分布。

以上兩種情況會使默認的條件不成立,因此需要尋找解決這個問題的辦法,即下面的Batch Renormalization。

Batch Renormalization算法

Batch Renormalization: Towards Reducing Minibatch Dependence in Batch-Normalized Models
Batch Renormalization

通過對BN中Normalization後的值進行一步仿射變換(一個線性變換r=σBσr=\frac{\sigma_\Beta}{\sigma}和一個平移d=μBμσd=\frac{\mu_\Beta-\mu}{\sigma},r和d不參與反向傳播),然後計算移動平均值,對μ\muσ\sigma不斷更新,training結束時候的值作爲Inference時固定的均值和方差。這樣做的好處有以下兩個:

  1. 對於BN,在training中計算的移動平均值μ\muσ\sigma,僅僅在Inference時使用;對於Batch Renormalizatiuon,計算的移動平均值μ\muσ\sigma在訓練的時候就在不斷的修正,使μ\muσ\sigma更加逼近樣本整體的均值和方差
  2. 使用BN算法,在Training和Inference中進行Normalization後的均值和方差是不一樣的;而使用Batch Renormalization算法,在Training和Inference中進行Normalization後的均值和方差是一樣的(μσ\mu,\sigma爲Inference時的固定的均值和方差)。
    xi^=xiμBσBμ:=μ+αμBσ:=σ+ασBBatchNormalizationxi^=xiμBσr+d=xiμσμ:=μ+α(μBμ)σ:=σ+α(σBσ)BatchRenormalization \hat{x_i}=\frac{x_i-\mu_\Beta}{\sigma_\Beta} \quad \mu:=\mu+\alpha\mu_\Beta \quad \sigma:=\sigma+\alpha\sigma_\Beta \quad BatchNormalization \\ \hat{x_i}=\frac{x_i-\mu_\Beta}{\sigma}r+d=\frac{x_i-\mu}{\sigma} \quad \mu:=\mu+\alpha(\mu_\Beta-\mu)\quad \sigma:=\sigma+\alpha(\sigma_\Beta-\sigma) \quad BatchRenormalization

因此,當mini-batch足夠大(μB\mu_\BetaσB\sigma_\Beta可以代替μ\muσ\sigma),使用BN和Batch Renormalization性能差別不大;當minibatch很小時(μB\mu_\BetaσB\sigma_\Beta噪聲很大,不能代替μ\muσ\sigma),用Batch Renormalization會取得更好的性能。

ps:論文中指出,根據實驗的結果,在迭代初期僅使用BN而後逐步進行修正時效果較好,r和d施加了上下界的約束就是爲了實現這一點(?)。

主要參考

  1. 深度學習中 Batch Normalization爲什麼效果好?
  2. 深度學習中的Normalization模型
  3. 如何評價batch renormalization?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章