神經網絡 BN

在學習Batch Normalization之前,我們來看一道某知名互聯網公司算法題。

以下關於batch normalization說法正確的是()

     A. normalization的均值⽅差計算是基於全部訓練數據的

     B. normalization的均值方差只基於當前的mini-batch

     C. normalization對輸入層的每一維單獨計算均值方差

     D. normalization的輸出分佈服從均值爲0,方差爲1的高斯分佈

對於這道題一下就知道 Batch Normalization,這篇博客就基本可以跳過去了,但對於還有疑惑的同學,我們可以帶着問題來進一步探索。

Batch Normalization

Batch Normalization是優化深度神經網絡中最激動人心的最新創新之一。實際上它並不是一個優化算法,而是一個自適應的重新參數化的方法,試圖克服神經網絡層數加深導致模型難以訓練。目前最常用的深度學習基礎模型包括前向神經網絡(MLP),CNN 和 RNN。 Batch Normalization 在這些基礎網絡結構中均有得到應用,大量數據表明,Batch Normalization 在 MLP 和 CNN 上效果很顯著的,但在 RNN 上效果不明顯。

Batch Normalization中文一般稱爲 “批標準化/規範化”,是一種對數值的特殊函數變換方法,也就是說假設原始的某個數值是 x,套上一個起到規範化作用的函數,對規範化之前的數值 x 進行轉換,形成一個規範化後的數值,即:

所謂規範化,是希望轉換後的數值 x ̂滿足一定的特性,至於對數值具體如何變換,跟規範化目標有關, f() 函數的具體形式,不同的規範化目標導致具體方法中函數所採用的形式不同。

在介紹深度學習 Normalization 前,我們先普及下神經元的活動過程。深度學習是由神經網絡來體現對輸入數據的函數變換的,而神經網絡的基礎單元就是網絡神經元,一個典型的神經元對數據進行處理時包含兩個步驟的操作(參考圖 1):

  1. 對輸入數據進行線性變換,產生淨激活值:

         

          其中,Xi 是輸入,Wi 是權重參數,b 是偏置,Wi 和 b 是需要進行訓練學習的網絡參數

      2. 加入非線性激活函數,神經網絡的非線性能力來自於此,目前深度學習最常用的激活函數是 Relu 函數 x=Relu(a)

這樣一個神經元就完成了對輸入數據的非線性函數變換。這裏需要強調下,步驟1 中的輸出一般稱爲淨激活(Net Activation),步驟2 經過激活函數後得到的值爲激活值。爲了描述簡潔,本文後續文字中使用激活的地方,其實指的是未經激活函數的淨激活值,而非一般意義上的激活,這點還請注意。

Normalization 操作方法

神經網絡裏主要有兩類實體:神經元連接神經元的邊,所以深度學習中的 Normalization,按照規範化操作涉及對象的不同可以分爲兩大類:

  • 一類是對第 L 層每個神經元的激活值或者說對於第 L+1 層網絡神經元的輸入值進行 Normalization 操作,比如 BatchNorm/LayerNorm/InstanceNorm/GroupNorm 等方法都屬於這一類;
  • 另外一類是對神經網絡中連接相鄰隱層神經元之間的邊上的權重進行規範化操作,比如 Weight Norm 就屬於這一類。廣義上講,一般機器學習裏看到的損失函數裏面加入的對參數的 L1/L2 等正則項,本質上也屬於這第二類規範化操作。L1 正則的規範化目標是造成參數的稀疏化,就是爭取達到讓大量參數值取得 0 值的效果,而 L2 正則的規範化目標是有效減小原始參數值的大小。有了這些規範目標,通過具體的規範化手段來改變參數值,以達到避免模型過擬合的目的。

那麼對於第一類的 Normalization 操作,其在什麼位置發揮作用呢?

目前有兩種在神經元中插入 Normalization 操作的地方(參考圖 2):

  • 第一種是最早由Google研究員在其論文中提出的Batch Normalization,放在激活函數之前
  • 另外一種是後續研究提出的,放在激活函數之後,不少研究表明將 BN 放在激活函數之後效果更好。本文在理解時仍然遵循 BN 原始論文,後續講解都可以看成是將 Normalization 操作放在激活函數之前進行

                                 圖 2. Normalization 加入的位置

對於神經元的激活值來說,不論哪種 Normalization 方法,其規範化目標都是一樣的,就是將其激活值規整爲 均值爲 0,方差爲 1 的正態分佈(本文開頭問題答案的既視感)。即規範化函數統一都是如下形式:

                         (1)

其中,ai 爲某個神經元原始激活值,ai^norm 爲經過規範化操作後的規範後值

整個規範化過程可以分解爲兩步,第一步參考公式(2),是將激活值規整到均值爲 0,方差爲 1 的正態分佈範圍內。

      (2)                 

       (3)

神經元在訓練過程中學習到對應的兩個調節因子,對規範到均值爲 0 ,方差爲1 的值進行微調。因爲經過第一步操作後,Normalization 有可能降低神經網絡的非線性表達能力,所以會以此方式來補償 Normalization 操作後神經網絡的表達能力。

其中,μ 是通過神經元集合 S(至於 S 如何選取讀者可以先不用關注,後文有述)中包含的 m 個神經元各自的激活值求出的均值,即:

σi 爲根據均值 μ 和神經元集合 S 中神經元各自激活值求出的激活值標準差:

     

其中,ε 是爲了增加訓練穩定性而加入的小的常量數據。

不論是早期提出的提出的 Batch Normalization,還是 Batch Normalization 的改進版本。其基本計算步驟都如上所述,大同小異,最主要的區別在於神經元集合 S 的範圍怎麼定,不同的方法採用了不同的神經元集合定義方法。

神經元集合 S 的範圍如何確定

爲什麼這些 Normalization 需要確定一個神經元集合 S 呢?原因很簡單,前面講過,這類深度學習的規範化目標是將神經元的激活值限定在均值爲 0 方差爲 1 的正態分佈中。而爲了能夠對網絡中某個神經元的激活值 a_i 規範到均值爲 0 和方差爲 1 的範圍,必須有一定的手段求出均值和方差,而均值和方差是個統計指標,要計算均值和方差這兩個指標一定要在一個集合範圍內纔可行,所以這就要求必須指定一個神經元組成的集合,利用這個集合裏每個神經元的激活來統計出所需的均值和方差,這樣才能達到預定的規範化目標。

                                   圖 3 Normalization 的一個計算過程

(參考圖 3) 給出了這類 Normalization 的一個計算過程的具體例子,例子中假設網絡結構是前向反饋網絡,對於隱層的三個節點來說,其原初的激活值爲 [0.4, -0.6, 0.7],爲了可以計算均值爲 0 方差爲 1 的正態分佈,劃定集合 S 中包含了這個網絡中的 6 個神經元,至於如何劃定集合 S 讀者可以先不用關心,此時其對應的激活值如圖中所示,根據這 6 個激活值,可以算出對應的均值和方差。有了均值和方差,可以利用公式(1)對原初激活值進行變換,設定兩個調節因子爲 1,那麼可以得到轉換後的激活值 [0.21,-0.75, 0.50],對於新的激活值經過非線性變換函數比如 RELU,則形成這個隱層的輸出值 [0.21, 0, 0.50]。這個例子中隱層的三個神經元在某刻進行 Normalization 計算的時候共用了同一個集合 S,在實際的計算中,隱層中的神經元可能共用同一個集合,也可能每個神經元採用不同的神經元集合 S,並非一成不變,這點還請留心與注意。

針對神經元的所有 Normalization 方法都遵循上述計算過程,唯一的不同在於如何劃定計算統計量所需的神經元集合 S

 前向神經網絡中的 Batch Normalization

圖 4  前向神經網絡 Batch Normalization

對於前向神經網絡來說,Batch Normalization 在計算隱層某個神經元 k 激活的規範值的時候,對應的神經元集合 S 範圍是如何劃定呢?(參考圖 4) 給出了示意,因爲對於 Mini-Batch 訓練方法來說,根據 Loss 更新梯度使用 Batch 中所有實例來做,所以對於神經元 k 來說,假設某個 Batch 包含 n 個訓練實例,那麼每個訓練實例在神經元 k 都會產生一個激活值,也就是說 Batch 中 n 個訓練實例分別通過同一個神經元 k 的時候產生了 n 個激活值,Batch Normalization的集合 S 選擇入圍的神經元就是這 n 個同一個神經元被 Batch 不同訓練實例激發的激活值。劃定集合 S 的範圍後,Normalization 的具體計算過程與前文所述計算過程一樣,採用公式(1) 即可完成規範化操作。

CNN 網絡中的 Batch Normalization

常規的 CNN 一般由卷積層、下采樣層及全連接層構成。全連接層形式上與前向神經網絡是一樣的,所以可以採取前向神經網絡中的 BatchNorm 方式,而下采樣層本身不帶參數所以可以忽略,所以 CNN 中主要關注卷積層如何計算 Batch Normalization。

圖 7  CNN 的卷積核

CNN 中的某個卷積層由 m 個卷積核構成,每個卷積覈對三維的輸入(通道數*長*寬)進行計算,激活及輸出值是個二維平面(長*寬),對應一個輸出通道(參考圖 7),由於存在 m 個卷積核,所以輸出仍然是三維的,由 m 個通道及每個通道的二維平面構成。

圖8 CNN 中的 BatchNorm 過程

在CNN卷積層中,如果要對通道激活二維平面中某個激活值進行 Normalization 操作,怎麼確定集合 S 的範圍呢?

圖 8 給出了示意圖。類似於前向神經網絡中的 BatchNorm 計算過程,對於 Mini-Batch 訓練方法來說,反向傳播更新梯度使用 Batch 中所有實例的梯度方向來進行,所以對於 CNN 某個卷積層對應的輸出通道 k 來說,假設某個 Batch 包含 n 個訓練實例,那麼每個訓練實例在這個通道 k 都會產生一個二維激活平面,也就是說 Batch 中 n 個訓練實例分別通過同一個卷積核的輸出通道 k 的時候產生了 n 個激活平面

假設激活平面長爲 5,寬爲 4,則激活平面包含 20 個激活值,n 個不同實例的激活平面共包含 20*n 個激活值。那麼 BatchNorm 的集合 S 的範圍就是由這 20*n 個同一個通道被 Batch 不同訓練實例激發的激活平面中包含的所有激活值構成(對應圖 8 中所有標爲藍色的激活值。劃定集合 S 的範圍後,激活平面中任意一個激活值都需進行 Normalization 操作,其 Normalization 的具體計算過程與前文所述計算過程一樣,採用公式(1) 即可完成規範化操作。這樣即完成 CNN 卷積層的 BatchNorm 轉換過程。

描述起來似乎有些複雜,但是從概念上,其實可以把 CNN 中的 卷積層 想象成前向神經網絡中的一個 隱層,然後把對應的某個卷積核 想象成 MLP 隱層中的一個神經元節點,兩者不同之處是:

  • CNN 輸出是個二維激活平面而 MLP 的神經元輸出是一個激活值
  • 另外一個不同是這個神經元覆蓋的輸入部分不同,CNN 的卷積核是局部覆蓋輸入,通過滑動窗口來實現輸入的全覆蓋,   而 MLP 的神經元則是一步到位全局覆蓋輸入 。如果從這個角度思考 CNN 和 MLP 中的 BatchNorm 的話,其實兩者的做法是一致的。

Batch Normalization 優點

  1. 可以加快模型 收斂速度 ,不再依賴精細的參數初始化過程,
  2. 可以調大 學習率 等,
  3. 同時引入的 隨機噪聲 能夠起到對模型參數進行 正則化 的作用,有利於增強模型泛化能力。

Batch Normalization 不足

  1. 如果 Batch Size 太小,則 BN 效果明顯下降。因爲在小的 BatchSize 意味着數據樣本少,因而得不到有效統計量,也就是說噪音太大。
  2. 對於有些像素級圖片生成任務來說,BN 效果不佳;對於圖片分類等任務,只要能夠找出關鍵特徵,就能正確分類,這算是一種粗粒度的任務,因爲在 Mini-Batch 內多張無關的圖片之間計算統計量,弱化了單張圖片本身特有的一些細節信息。
  3. RNN 等動態網絡使用 BN 效果不佳且使用起來不方便
  4. 訓練時和推理時統計量不一致

參考:

1. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

2. 深度學習中的Normalization模型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章