1. 程式人生 > >batch normalization 批歸一化 --- 一個硬幣的兩面

batch normalization 批歸一化 --- 一個硬幣的兩面

本文主要是對BN(batch normalization)這篇論文的摘錄,加上一些其他論文,輔助理解。

 

批歸一化是在Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 這篇論文中提出的,主要的思想就是要將每一個隱藏神經元的輸入變成是一個均值為0,方差為1的分佈,便於加快training過程。

----------------------------------作者這麼說----------------------------------------------------------------
具體實施是這樣的

 

對於每一次的mini-batch會去算一波均值和方差,當然,這些x是針對一個神經元的輸入了

在推斷的過程中,也要做歸一化,因為推斷的時候只有一個樣本輸入,方差和均值的計算其實是之前的若干個mini-batch的均值和方差的平均

這個地方需要注意的一點是,方差採用的是無偏估計,對每一個mini-batch,計算出來的方差用的是下面這個式子。不明白的是為什麼這個地方採用無偏估計,而之前不採用呢,估計是為了引入noise,有一個類似drop out的作用?

 

 

具體在使用的過程中,BN這一層呢,一般是加在非線性層之前,就是relu之類的之前。

對於CNN網路來說,BN是一個feature map共用一個gamma和beta,因為預設不光是一個神經元的輸入應該滿足同一個分佈,而是同一個feature map的都應該滿足,所以如果feature map是q*p的大小,對於大小為m的mini-batch而言,其實是計算m*p*q的整個的均值和方差,而不是像之前只要計算m個input值的。

--------------------------------------------其他論文這麼說-------------------------------------------------------------

 下面看到的這個段落來自super resolution中著名的網路

EDSR論文,在這篇論文中,作者沒有用到BN,他們的說法是因為BN層會讓特徵被歸一化,從而降低變化範圍的自由度。他們的實驗證明了去掉BN層會讓影象細節部分表現更好。並且,他們表示,去掉了BN層之後,GPU的記憶體使用也被極大地減小了,因為BN層和卷積層佔用一樣多的記憶體。