批标准归一化(Batch Normalization)解析
1,背景
網絡一旦train起來,那么參數就要發生更新,除了輸入層的數據外(因為輸入層數據,我們已經人為的為每個樣本歸一化),后面網絡每一層的輸入數據分布是一直在發生變化的,因為在訓練的時候,前面層訓練參數的更新將導致后面層輸入數據分布的變化。
以網絡第二層為例:網絡的第二層輸入,是由第一層的參數和input計算得到的,而第一層的參數在整個訓練過程中一直在變化,因此必然會引起后面每一層輸入數據分布的改變。我們把網絡中間層在訓練過程中,數據分布的改變稱之為:“Internal Covariate Shift”,批標準歸一化(Batch Normalization,BN)的提出,就是要解決在訓練過程中,中間層數據分布發生改變的情況。
通過使用BN,每個神經元的激活變得(或多或少)高斯分布,即它通常中等活躍,有時有點活躍,罕見非?;钴S。協變量偏移是不滿足需要的,因為后面的層必須保持適應分布類型的變化(而不僅僅是新的分布參數,例如高斯分布的新均值和方差值)。
神經網絡學習過程本質就是為了學習數據分布,一旦訓練數據與測試數據的分布不同,那么網絡的泛化能力也大大降低;另外一方面,一旦每批訓練數據的分布各不相同(batch 梯度下降),那么網絡就要在每次迭代都去學習適應不同的分布,這樣將會大大降低網絡的訓練速度,這也正是為什么我們需要對數據都要做一個歸一化預處理的原因。
深度網絡的訓練是復雜的過程,只要網絡的前面幾層發生微小的改變,那么后面幾層就會被累積放大下去。一旦網絡某一層的輸入數據的分布發生改變,那么這一層網絡就需要去適應學習這個新的數據分布,所以如果訓練過程中,訓練數據的分布一直在發生變化,那么將會影響網絡的訓練速度
2,原理簡介
Batch Normalization(簡稱BN)是對每一批數據進行歸一化,對于訓練中某一個batch的數據{x1,x2,…,xn},注意這個數據是可以輸入也可以是網絡中間的某一層輸出。在BN出現之前,我們的歸一化操作一般都在數據輸入層,對輸入的數據進行求均值以及求方差做歸一化,但是BN的出現打破了這一個規定,我們可以在網絡中任意一層進行歸一化處理,因為我們現在所用的優化方法大多都是min-batch SGD,所以我們的歸一化操作就成為Batch Normalization。
批量歸一化(Batch Normalization,BN)是神經網絡的標準化方法/層,通常BN神經網絡輸入被歸一化[0,1]或[-1,1]范圍,或者意味著均值為0和方差等于1,即BN對網絡的中間層執行白化。
如上圖所示,BN步驟主要分為4步:
(1) 求每一個訓練批次數據的均值
(2)求每一個訓練批次數據的方差
(3)使用求得的均值和方差對該批次的訓練數據做歸一化,獲得0-1分布。其中ε
是為了避免除數為0時所使用的微小正數。
(4)尺度變換和偏移(避免線性區):將xi乘以γ調整數值大小,再加上β增加偏移后得到yi,這里的γ是尺度因子,β是平移因子。這一步是BN的精髓,由于歸一化后的xi基本會被限制在正態分布下,使得網絡的表達能力下降。為解決該問題,我們引入兩個新的參數:γ,β。 γ和β是在訓練時網絡自己學習得到的。
一個標準的歸一化步驟就是減均值除方差,那這種歸一化操作有什么作用呢?我們觀察下圖:
a中左圖是沒有經過任何處理的輸入數據,曲線是sigmoid函數,如果數據在梯度很小的區域,那么學習率就會很慢甚至陷入長時間的停滯。減均值除方差后,數據就被移到中心區域如右圖所示,有效避免分布數據偏移,使其遠離導數飽和區。對于大多數激活函數而言,這個區域的梯度都是最大的或者是有梯度的(比如ReLU),這可以看做是一種對抗梯度消失的有效手段。對于一層如此,如果對于每一層數據都那么做的話,數據的分布總是在隨著變化敏感的區域,相當于不用考慮數據分布變化了,這樣訓練起來更有效率。
那么為什么要有第4步,不是僅使用減均值除方差操作就能獲得目的效果嗎?思考一個問題,減均值除方差得到的分布是正態分布,我們能否認為正態分布就是最好或最能體現我們訓練樣本的特征分布呢?不能,比如數據本身就很不對稱,或者激活函數未必是對方差為1的數據最好的效果,比如Sigmoid激活函數,在-1~1之間的梯度變化不大,那么非線性變換的作用就不能很好的體現,換言之就是,減均值除方差操作后可能會削弱網絡的性能!針對該情況,在前面三步之后加入第4步完成真正的batch normalization。
BN的本質就是利用學習優化,改變一下方差大小和均值位置,使得新的分布更切合數據的真實分布,保證模型的非線性表達能力。BN的極端的情況就是這兩個參數等于mini-batch的均值和方差,那么經過batch normalization之后的數據和輸入完全一樣,當然一般的情況是不同的。
3,BP對神經網絡的影響
3.1 激活函數
在所有情況下,BN都能顯著提高訓練速度,如果沒有BN,使用Sigmoid激活函數會有嚴重的梯度消失問題。
如下圖所示,激活函數sigmoid、tanh、relu在使用了BN后,準確度都有顯著的提高(虛線是沒有用BN的情況,實線是對應的使用BN的情況)
3.2 優化器
Adam是一個比較犀利的優化器,但是如果普通的優化器 ,比如隨機梯度下降法,加上BN后,其效果堪比Adam。
ReLU +Adam≈ReLU+ SGD + BN
所以說,使用BN,優化器的選擇不會產生顯著差異。
3.3 批量大小
對于小批量(即4),BN會降低性能,所以要避免太小的批量,才能保證批歸一化的效果。
3.4 數據不平衡
如果對于具有分布極不平衡的二分類測試任務(例如,99:1),BN破壞性能并不奇怪。也就是說,這種情況下不要使用BN。
3.5 梯度消失的問題
如下圖所求,BN很好地解決了梯度消失問題,這是由前邊說的減均值除方差保證的,把每一層的輸出均值和方差規范化,將輸出從飽和區拉倒了非飽和區(導數),很好的解決了梯度消失問題。下圖中對于第二層與第一層的梯度變化,在沒有使用BN時,sigmoid激活函數梯度消失5倍,使用BN時,梯度只消失33%;在使用BN時,relu激活函數梯度沒有消失。
3.6 模型正則化
BN算法后,參數進行了歸一化,不用太依賴drop out、L2正則化解決歸 一化,采用BN算法后可以選擇更小的L2正則約束參數,因為BN本身具有提高網絡泛化能力的特性。
4,模型預測時均值和方差求解
對于預測階段時所使用的均值和方差,其實也是來源于訓練集。比如我們在模型訓練時我們就記錄下每個batch下的均值和方差,待訓練完畢后,我們求整個訓練樣本的均值和方差期望值,作為我們進行預測時進行BN的的均值和方差:
最后測試階段,BN的使用公式就是:
關于BN的使用位置,在CNN中一般應作用與非線性激活函數之前,s型函數s(x)的自變量x是經過BN處理后的結果。因此前向傳導的計算公式就應該是:
其實因為偏置參數b經過BN層后其實是沒有用的,最后也會被均值歸一化,當然BN層后面還有個β參數作為偏置項,所以b這個參數就可以不用了。因此最后把BN層+激活函數層就變成了:
注意前面寫的都是對于一般情況,對于卷積神經網絡有些許不同。因為卷積神經網絡的特征是對應到一整張特征響應圖上的,所以做BN時也應以響應圖為單位而不是按照各個維度。比如在某一層,batch大小為m,響應圖大小為w×h,則做BN的數據量為m×w×h。
BN在深層神經網絡的作用非常明顯:若神經網絡訓練時遇到收斂速度較慢,或者“梯度爆炸”等無法訓練的情況發生時都可以嘗試用BN來解決。同時,常規使用情況下同樣可以加入BN來加速模型訓練,甚至提升模型精度。
總結
以上是生活随笔為你收集整理的批标准归一化(Batch Normalization)解析的全部內容,希望文章能夠幫你解決所遇到的問題。