【DL-CV】批量歸一化(BN算法)

【DL-CV】數據預處理&權重初始化<前篇---後篇>【DL-CV】正則化,Dropout算法

先來交代一下背景:在網絡訓練的過程當中,參數的更新會致使網絡的各層輸入數據的分佈不斷變化,那麼各層在訓練的過程當中就須要不斷的改變以適應這種新的數據分佈,從而形成網絡訓練困難,收斂變慢(並且網絡越深越難),在論文中這個問題被稱爲「Internal Covariate Shift」。爲了解決這個問題出現了批量歸一化的算法,他對每一層的輸入進行歸一化,保證每層的輸入數據分佈是穩定的,從而加速訓練segmentfault

批量歸一化(Batch Normalization/BN)

  • Normalization——「歸一化」
  • Batch——「批」,一批樣本輸入,batch_size=m,m個樣本

與激活函數層、卷積層(cnn)、全鏈接層(FC)、池化層同樣,批量歸一化也屬於網絡的一層,簡稱BN。BN一般用在FC/cnn以後,激活函數層以前,他對FC/cnn的輸出的每一維進行歸一化(歸一化至:均值0、方差爲1),而後變換重構後再把數據餵給下一層網絡。網絡

歸一化

對輸入數據的每一維xk(每一列)進行歸一化獲得$\hat{x}^{k}$
$$\hat{x}^{(k)} = \frac{x^{k} - E[x^{k}]}{\sqrt{Var[x^{k}]}}$$函數

clipboard.png

經過該公式咱們強行把數據歸一化,特徵分佈成功被壓縮至標準差爲1。但這種變化是有破壞性的,原來的特徵分佈都被搞亂了那還學個鬼?——爲了解決這一問題,咱們對歸一化後的數據再進行變換重構,以恢復原來的特徵學習

變換重構

對於歸一化後輸入$\hat{x}^{k}$,咱們再引入兩個可供學習的參數$\gamma$和$\beta$使
$$y^{k} = \gamma^{k}\hat{x}^{k}+\beta^{k}$$
注意若是$\gamma^{k}=\sqrt{Var[x^k]}$,$\beta^{k}=E[x^k]$時,是能夠恢復原有的特徵的。這就是引入這兩個參數的意義,雖然網絡不太可能學習到$\gamma^{k}=\sqrt{Var[x^k]}$,$\beta^{k}=E[x^k]$,可是好歹經過學習到這兩個參數儘量地回覆原有的特徵(實踐中的表現說明這是有用的)測試


最後總結BN操做:(m是mini batch size,根號中的ε是一個很小的數防止分母爲0)
clipboard.png
clipboard.pngspa

測試時!

上面講了這麼多其實都是訓練時的BN算法,訓練時是一個一個batch進去的,訓練完成後獲得$\gamma$和$\beta$。可是在測試時,咱們只是丟一個樣本進去讓網絡預測,試問一個樣本何來均值和方差?
均值和方差最好的來源是整個訓練集,可是整個訓練集每每太大,咱們不太想算。能不能從現成的 mini batch 的均值和方差(由於在訓練時算了出來)估計出整個訓練集的均值和方差呢——固然能夠,由於mini batch是隨機取樣的:
$$E[x] = E_B[\mu_B]$$
$$Var[x] = \frac{m}{m-1}E_B[\sigma_B^2]$$
即平均值爲全部mini-batch的平均值的平均值,而方差爲每一個batch的方差的無偏估計。當網絡訓練完後,咱們經過訓練時保存下來的每一個batch的均值與方差估算出全局均值與方差供測試時使用,也就是說當網絡訓練完後每一個BN層中的均值也和標準差也會隨之肯定。.net

BN好處有啥

  • 能選擇較大的初始學習率,提升訓練收斂速度
  • 你不再用去理會過擬閤中drop out、L2正則項參數的選擇問題,採用BN算法後,你能夠移除這兩項了參數,或者能夠選擇更小的L2正則約束參數了,由於BN自帶正則化的特性,能提升網絡泛化能力
  • 減小梯度爆炸/消失的出現,特別對於tanh,sigmoid這類會兩端飽和的激活函數
  • 減小對參數初始化的依賴,就算參數初始化得很差,在BN的加持下網絡仍是表現較好

雖然BN是2015才提出來的(看上去像個新米),可是他表現也超凡,BN算法已經被大量使用於深度學習中,真的是nborm

補充

相關文章
相關標籤/搜索