Batch Normalization原理與使用過程


  •  閱讀《Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising》時,開始接觸一些深度學習的知識
作者:張俊林,新浪微博AI Lab擔任資深算法專家

Batch Normalization(簡稱BN)自從提出之后,因為效果特別好,很快被作為深度學習的標准工具應用在了各種場合。BN大法雖然好,但是也存在一些局限和問題,
諸如當BatchSize太小時效果不佳、對RNN等動態網絡無法有效應用BN等。針對BN的問題,最近兩年又陸續有基於BN思想的很多改進Normalization模型被提出。
BN是深度學習進展中里程碑式的工作之一,無論是希望深入了解深度學習,還是在實踐中解決實際問題,BN及一系列改進Normalization工作都是繞不開的重要環節。
  • 2018-NIPS-How Does Batch Normalization Help Optimization : 論文鏈接:https://arxiv.org/pdf/1805.11604v3.pdf
摘要:批歸一化(BatchNorm)是一種廣泛采用的技術,用於更快速、更穩定地訓練深度神經網絡(DNN)。盡管應用廣泛,但 BatchNorm 有效的確切原因我們尚不清楚。
人們普遍認為,這種效果源於在訓練過程中控制層輸入分布的變化來減少所謂的「內部協方差偏移」。本文證明這種層輸入分布穩定性與 BatchNorm 的成功幾乎沒有關系。
相反,我們發現 BatchNorm 會對訓練過程產生更重要的影響:它使優化解空間更加平滑了。這種平滑使梯度更具可預測性和穩定性,從而使訓練過程更快。

 

Batch Normalization是由google提出的一種訓練優化方法。參考論文:Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift
個人覺得BN層的作用是加快網絡學習速率,論文中提及其它的優點都是這個優點的副產品。
網上對BN解釋詳細的不多,大多從原理上解釋,沒有說出實際使用的過程,這里從what, why, how三個角度去解釋BN。

What is BN

Normalization是數據標准化(歸一化,規范化),Batch 可以理解為批量,加起來就是批量標准化。
先說Batch是怎么確定的。在CNN中,Batch就是訓練網絡所設定的圖片數量batch_size。

Normalization過程,引用論文中的解釋:
這里寫圖片描述
輸入:輸入數據x1..xm(這些數據是准備進入激活函數的數據)
計算過程中可以看到,
1.求數據均值;
2.求數據方差;
3.數據進行標准化(個人認為稱作正態化也可以)
4.訓練參數γ,β
5.輸出y通過γ與β的線性變換得到原來的數值
在訓練的正向傳播中,不會改變當前輸出,只記錄下γ與β

在反向傳播的時候,根據求得的γ與β通過鏈式求導方式,求出學習速率以至改變權值
這里寫圖片描述

Why is BN

解決的問題是梯度消失與梯度爆炸。
關於梯度消失,以sigmoid函數為例子,sigmoid函數使得輸出在[0,1]之間。
這里寫圖片描述
事實上x到了一定大小,經過sigmoid函數的輸出范圍就很小了,參考下圖
這里寫圖片描述
如果輸入很大,其對應的斜率就很小,我們知道,其斜率(梯度)在反向傳播中是權值學習速率。所以就會出現如下的問題,
這里寫圖片描述
在深度網絡中,如果網絡的激活輸出很大,其梯度就很小,學習速率就很慢。假設每層學習梯度都小於最大值0.25,網絡有n層,因為鏈式求導的原因,第一層的梯度小於0.25的n次方,所以學習速率就慢,對於最后一層只需對自身求導1次,梯度就大,學習速率就快。
這會造成的影響是在一個很大的深度網絡中,淺層基本不學習,權值變化小,后面幾層一直在學習,結果就是,后面幾層基本可以表示整個網絡,失去了深度的意義。

關於梯度爆炸,根據鏈式求導法,
第一層偏移量的梯度=激活層斜率1x權值1x激活層斜率2x…激活層斜率(n-1)x權值(n-1)x激活層斜率n
假如激活層斜率均為最大值0.25,所有層的權值為100,這樣梯度就會指數增加。

How to use 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層在預測的作用體現在此處

def batch_norm(X, gamma, beta, moving_mean, moving_var, eps, momentum):
    # 通過 autograd 來判斷當前模式為訓練模式或預測模式。
    if not autograd.is_training():
        # 如果是在預測模式下,直接使用傳入的移動平均所得的均值和方差。
        X_hat = (X - moving_mean) / nd.sqrt(moving_var + eps)
    else:
        assert len(X.shape) in (2, 4)
        if len(X.shape) == 2:
            # 使用全連接層的情況,計算特征維上的均值和方差。
            mean = X.mean(axis=0)
            var = ((X - mean) ** 2).mean(axis=0)
        else:
            # 使用二維卷積層的情況,計算通道維上(axis=1)的均值和方差。這里我們需要
            # 保持 X 的形狀以便后面可以做廣播運算。
            mean = X.mean(axis=(0, 2, 3), keepdims=True)
            var = ((X - mean) ** 2).mean(axis=(0, 2, 3), keepdims=True)
        # 訓練模式下用當前的均值和方差做標准化。
        X_hat = (X - mean) / nd.sqrt(var + eps)
        # 更新移動平均的均值和方差。
        moving_mean = momentum * moving_mean + (1.0 - momentum) * mean
        moving_var = momentum * moving_var + (1.0 - momentum) * var
    Y = gamma * X_hat + beta  # 拉升和偏移。
    return Y, moving_mean, moving_var

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM