歸一化/標準化 = 零均值化 + 方差歸一化(白化)
結(jié)果使得數(shù)據(jù)均變成均值為0方差為1
機器學(xué)習(xí)領(lǐng)域有個很重要的假設(shè):IID獨立同分布假設(shè),就是假設(shè)訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)是滿足相同分布的,這是通過訓(xùn)練數(shù)據(jù)獲得的模型能夠在測試集獲得好的效果的一個基本保障。而BatchNorm是干啥的呢?BatchNorm就是在深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程中使得每一層神經(jīng)網(wǎng)絡(luò)的輸入保持相同分布的。OK,BN講完了,再見。
在深層神經(jīng)網(wǎng)絡(luò)中,中間某一層的輸入是其之前的神經(jīng)層的輸出。因此,其之前的神經(jīng)層的參數(shù)變化會導(dǎo)致其輸入的分布發(fā)生較大的差異。在使用隨機梯度下降來訓(xùn)練網(wǎng)絡(luò)時,每次參數(shù)更新都會導(dǎo)致網(wǎng)絡(luò)中間每一層的輸入的分布發(fā)生改變。越深的層,其輸入的分布會改變得越明顯。就像一棟高樓,低樓層發(fā)生一個較小的偏移,都會導(dǎo)致高樓層較大的偏移。
解決梯度消失、梯度爆炸
我們知道
激活函數(shù)和
激活函數(shù)存在梯度飽和的區(qū)域,其原因是激活函數(shù)的輸入值過大或者過小,其得到的激活函數(shù)的梯度值會非常接近于0,使得網(wǎng)絡(luò)的收斂速度減慢。傳統(tǒng)的方法是使用不存在梯度飽和區(qū)域的激活函數(shù),例如
等。BN也可以緩解梯度飽和的問題,它的策略是在調(diào)用激活函數(shù)之前將
?的值歸一化到梯度值比較大的區(qū)域。BN應(yīng)在激活函數(shù)之前使用。

機器學(xué)習(xí)中常見的操作是批標準化(Batch Normalization、BN),有專門的BN層
這種表示會對模型的收斂有幫助,但是也可能破壞已經(jīng)學(xué)習(xí)到的特征。為了解決這個問題,BN添加了兩個可以學(xué)習(xí)的變量
和??用于控制網(wǎng)絡(luò)能夠表達直接映射,也就是能夠還原BN之前學(xué)習(xí)到的特征。
下圖中m是批總數(shù)、
是第i個批(batch)、
是標準化后的批(normalized batch)、
,
是需要學(xué)習(xí)的兩個參數(shù)
當
并且
時,
BN層輸入等于輸出

BN的測試過程
在訓(xùn)練的時候,我們可以獲得該批量中樣本的均值和方差。但是在測試的時候,數(shù)據(jù)都是以單個樣本的形式輸入到網(wǎng)絡(luò)中的。在計算BN層的輸出的時候,我們需要獲取的均值和方差是通過訓(xùn)練集統(tǒng)計得到的。具體的講,我們會從訓(xùn)練集中隨機取多個批量的數(shù)據(jù)集,每個批量的樣本數(shù)是?
?,測試的時候使用的均值和方差是這些批量的均值。


上面的過程明顯非常耗時,更多的開源框架是在訓(xùn)練的時候,順便就把采樣到的樣本的均值和方差保留了下來。
卷積中的BN
我們知道,常規(guī)的CNN一般由卷積層、下采樣層及全連接層構(gòu)成。全連接層形式上與前向神經(jīng)網(wǎng)絡(luò)是一樣的,所以可以采取前向神經(jīng)網(wǎng)絡(luò)中的BatchNorm方式,而下采樣層本身不帶參數(shù)所以可以忽略,所以CNN中主要關(guān)注卷積層如何計算BatchNorm。
CNN中的某個卷積層由m個卷積核構(gòu)成,每個卷積核對三維的輸入(通道數(shù)*長*寬)進行計算,激活及輸出值是個二維平面(長*寬),對應(yīng)一個輸出通道(參考圖7),由于存在m個卷積核,所以輸出仍然是三維的,由m個通道及每個通道的二維平面構(gòu)成。


????????那么在卷積層中,如果要對通道激活二維平面中某個激活值進行Normalization操作,怎么確定神經(jīng)元集合S的勢力范圍呢?圖8給出了示意圖。類似于前向神經(jīng)網(wǎng)絡(luò)中的BatchNorm計算過程,對于Mini-Batch訓(xùn)練方法來說,反向傳播更新梯度使用Batch中所有實例的梯度方向來進行。
????????所以對于CNN某個卷積層對應(yīng)的輸出通道k來說,假設(shè)某個Batch包含n個訓(xùn)練實例,那么每個訓(xùn)練實例在這個通道k都會產(chǎn)生一個二維激活平面,也就是說Batch中n個訓(xùn)練實例分別通過同一個卷積核的輸出通道k的時候產(chǎn)生了n個激活平面(Feature Map)。假設(shè)激活平面長為5,寬為4,則激活平面包含20個激活值,n個不同實例的激活平面共包含20*n個激活值。
????????那么BatchNorm的集合S的范圍就是由這20*n個同一個通道被Batch不同訓(xùn)練實例激發(fā)的激活平面中包含的所有激活值構(gòu)成(對應(yīng)圖8中所有標為藍色的激活值)。劃定集合S的范圍后,激活平面中任意一個激活值都需進行Normalization操作,其Normalization的具體計算過程與前文所述計算過程一樣,采用公式3即可完成規(guī)范化操作。這樣即完成CNN卷積層的BatchNorm轉(zhuǎn)換過程。

CNN中Batch Norm的另外一種角度的理解:

描述起來似乎有些復(fù)雜,但是從概念上,其實可以把CNN中的卷積層想象成前向神經(jīng)網(wǎng)絡(luò)中的一個隱層,然后把對應(yīng)的某個卷積核想象成MLP隱層中的一個神經(jīng)元節(jié)點,無非其輸出是個二維激活平面而不像MLP的神經(jīng)元輸出是一個激活值,另外一個不同是這個神經(jīng)元覆蓋的輸入部分不同,CNN的卷積核是局部覆蓋輸入,通過滑動窗口來實現(xiàn)輸入的全覆蓋,而MLP的神經(jīng)元則是一步到位全局覆蓋輸入而已(參考圖9示意)。如果從這個角度思考CNN和MLP中的BatchNorm的話,其實兩者的做法是一致的。

在圖2中,假設(shè)一個批量有
個樣本,F(xiàn)eature Map的尺寸是pxq,通道數(shù)是
,在卷積網(wǎng)絡(luò)的中,BN的操作是以Feature Map為單位的,因此一個BN要統(tǒng)計的數(shù)據(jù)個數(shù)為 mxpxq,每個Feature Map使用一組?
和
。
最后
BN是深度學(xué)習(xí)調(diào)參中非常好用的策略之一(另外一個可能就是Dropout),當你的模型發(fā)生梯度消失/爆炸或者損失值震蕩比較嚴重的時候,在BN中加入網(wǎng)絡(luò)往往能取得非常好的效果。
BN也有一些不是非常適用的場景,在遇見這些場景時要謹慎的使用BN:
?受制于硬件限制,每個Batch的尺寸比較小,這時候謹慎使用BN;
?在類似于RNN的動態(tài)網(wǎng)絡(luò)中謹慎使用BN;
?訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集方差較大的時候。


綜上歸一化的優(yōu)點是:讓梯度下降等優(yōu)化算法速度更快。
我們知道數(shù)據(jù)預(yù)處理做標準化可以加速收斂,同理,在神經(jīng)網(wǎng)絡(luò)使用標準化也可以加速收斂,而且還有如下好處:
?具有正則化的效果(Batch Normalization regularizes the model)
提高模型的泛化能力(Be advantageous to the generalization of network)
允許更高的學(xué)習(xí)速率從而加速收斂(Batch Normalization enables higher learning rates)
酷文章:
深度學(xué)習(xí)中的Normalization模型--張俊林
模型優(yōu)化之BatchNomalization-劉巖