論文名字:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
論文地址:https://arxiv.org/abs/1502.03167
BN被廣泛應用於深度學習的各個地方,由於在實習過程中需要修改網絡,修改的網絡在訓練過程中無法收斂,就添加了BN層進去來替換掉LRN層,網絡可以收斂。現在就講一下Batch Normalization的工作原理。
BN層和卷積層,池化層一樣都是一個網絡層。
首先我們根據論文來介紹一下BN層的優點
1)加快訓練速度,這樣我們就可以使用較大的學習率來訓練網絡。
2)提高網絡的泛化能力。
3)BN層本質上是一個歸一化網絡層,可以替代局部響應歸一化層(LRN層)。
4)可以打亂樣本訓練順序(這樣就不可能出現同一張照片被多次選擇用來訓練)論文中提到可以提高1%的精度。
前向計算和反向求導
在前向傳播的時候:
從論文中給出的偽代碼可以看出來BN層的計算流程是:
1.計算樣本均值。
2.計算樣本方差。
3.樣本數據標准化處理。
4.進行平移和縮放處理。引入了γ和β兩個參數。來訓練γ和β兩個參數。引入了這個可學習重構參數γ、β,讓我們的網絡可以學習恢復出原始網絡所要學習的特征分布。
在反向傳播的時候,通過鏈式求導方式,求出γ與β以及相關權值
怎么使用BN層
先解釋一下對於圖片卷積是如何使用BN層。
這是文章卷積神經網絡CNN(1)中5x5的圖片通過valid卷積得到的3x3特征圖(粉紅色)。特征圖里的值,作為BN的輸入,也就是這9個數值通過BN計算並保存γ與β,通過γ與β使得輸出與輸入不變。假設輸入的batch_size為m,那就有m*9個數值,計算這m*9個數據的γ與β並保存。正向傳播過程如上述,對於反向傳播就是根據求得的γ與β計算梯度。
這里需要着重說明2個細節:
1.網絡訓練中以batch_size為最小單位不斷迭代,很顯然,新的batch_size進入網絡,即會有新的γ與β,因此,在BN層中,有總圖片數/batch_size組γ與β被保存下來。
2.圖像卷積的過程中,通常是使用多個卷積核,得到多張特征圖,對於多個的卷積核需要保存多個的γ與β。
結合論文中給出的使用過程進行解釋
輸入:待進入激活函數的變量
輸出:
1.對於K維的輸入,假設每一維包含m個變量,所以需要K個循環。每個循環中按照上面所介紹的方法計算γ與β。這里的K維,在卷積網絡中可以看作是卷積核個數,如網絡中第n層有64個卷積核,就需要計算64次。
需要注意,在正向傳播時,會使用γ與β使得BN層輸出與輸入一樣。
2.在反向傳播時利用γ與β求得梯度從而改變訓練權值(變量)。
3.通過不斷迭代直到訓練結束,求得關於不同層的γ與β。如網絡有n個BN層,每層根據batch_size決定有多少個變量,設定為m,這里的mini-batcherB指的是特征圖大小*batch_size,即m=特征圖大小*batch_size,因此,對於batch_size為1,這里的m就是每層特征圖的大小。
4.不斷遍歷訓練集中的圖片,取出每個batch_size中的γ與β,最后統計每層BN的γ與β各自的和除以圖片數量得到平均直,並對其做無偏估計直作為每一層的E[x]與Var[x]。
5.在預測的正向傳播時,對測試數據求取γ與β,並使用該層的E[x]與Var[x],通過圖中11:所表示的公式計算BN層輸出。
注意,在預測時,BN層的輸出已經被改變,所以BN層在預測的作用體現在此處
BN層原理分析
1 訓練數據為什么要和測試數據同分布?
看看下圖,如果我們的網絡在左上角的數據訓練的,已經找到了兩者的分隔面w,如果測試數據是右下角這樣子,跟訓練數據完全不在同一個分布上面,你覺得泛化能力能好嗎?
2 為什么白化訓練數據能夠加速訓練進程
如下圖,訓練數據如果分布在右上角,我們在初始化網絡參數w和b的時候,可能得到的分界面是左下角那些線,需要經過訓練不斷調整才能得到穿過數據點的分界面,這個就使訓練過程變慢了;如果我們將數據白化后,均值為0,方差為1,各個維度數據去相關,得到的數據點就是坐標上的一個圓形分布,如下圖中間的數據點,這時候隨便初始化一個w,b設置為0,得到的分界面已經穿過數據了,因此訓練調整,訓練進程會加快
3、為什么BN層可以改善梯度彌散
下面xhat到x的梯度公式,可以表示為正常梯度乘一個系數a,再加b,這里加了個b,整體給梯度一個提升,補償sigmod上的損失,改善了梯度彌散問題。
4、為什么BN層一般用在線性層和卷積層后面,而不是放在非線性單元后
原文中是這樣解釋的,因為非線性單元的輸出分布形狀會在訓練過程中變化,歸一化無法消除他的方差偏移,相反的,全連接和卷積層的輸出一般是一個對稱,非稀疏的一個分布,更加類似高斯分布,對他們進行歸一化會產生更加穩定的分布。其實想想也是的,像relu這樣的激活函數,如果你輸入的數據是一個高斯分布,經過他變換出來的數據能是一個什么形狀?小於0的被抑制了,也就是分布小於0的部分直接變成0了,這樣不是很高斯了。
5、BN起作用的原因
通過使得批量數據歸一化具有0均值1方差的統計分布,避免數據處於激活函數的飽和區,具有較大的梯度,從而加速網絡的訓練過程。
減少了網絡輸入變化過大的問題,使得網絡的輸入穩定,減弱了與前層參數關系之間的作用,使得當前層獨立於整個網絡
BN具有輕微正則化的效果,可以和dropout一起使用
主要是歸一化激活值前的隱藏單元來加速訓練,正則化是副作用
6、BN具有正則化效果的原因
每個批量的數據僅根據當前批量計算均值和標准差,然后縮放
這就為該批量的激活函數帶來了一些噪音,類似於dropout向每一層的激活函數帶來噪音
若使用了較大的batch_size如512,則減小了噪音,減少了正則化帶來的效果
參考文獻:
https://blog.csdn.net/donkey_1993/article/details/81871132
https://blog.csdn.net/qq_29573053/article/details/79878437
https://www.cnblogs.com/kk17/p/9693462.html
https://blog.csdn.net/u012151283/article/details/78154917