深度學習中的Normalization模型

機器之心發表於2018-08-29

從 Mini-Batch SGD 說起

我們先從 Mini-Batch SGD 的優化過程講起,因為這是下一步理解 Batch Normalization 中 Batch 所代表具體含義的知識基礎。

我們知道,SGD 是無論學術圈寫文章做實驗還是工業界調參跑模型最常用的模型優化演算法,但是有時候容易被忽略的一點是:一般提到的 SGD 是指的 Mini-batch SGD,而非原教旨意義下的單例項 SGD。

深度學習中的Normalization模型

圖 1. Mini-Batch SGD 訓練過程(假設 Batch Size=2)

所謂「Mini-Batch」, 是指的從訓練資料全集 T 中隨機選擇的一個訓練資料子集合。假設訓練資料集合 T 包含 N 個樣本,而每個 Mini-Batch 的 Batch Size 為 b,於是整個訓練資料可被分成 N/b 個 Mini-Batch。在模型通過 SGD 進行訓練時,一般跑完一個 Mini-Batch 的例項,叫做完成訓練的一步(step), 跑完 N/b 步則整個訓練資料完成一輪訓練,則稱為完成一個 Epoch。完成一個 Epoch 訓練過程後,對訓練資料做隨機 Shuffle 打亂訓練資料順序,重複上述步驟,然後開始下一個 Epoch 的訓練,對模型完整充分的訓練由多輪 Epoch 構成(參考圖 1)。

在拿到一個 Mini-Batch 進行引數更新時,首先根據當前 Mini-Batch 內的 b 個訓練例項以及引數對應的損失函式的偏導數來進行計算,以獲得引數更新的梯度方向,然後根據 SGD 演算法進行引數更新,以此來達到本步(Step)更新模型引數並逐步尋優的過程。

深度學習中的Normalization模型

圖 2. Mini-Batch SGD 優化過程

具體而言,如果我們假設機器學習任務的損失函式是平方損失函式

深度學習中的Normalization模型

那麼,由 Mini-Batch 內訓練例項可得出 SGD 優化所需的梯度方向為:

深度學習中的Normalization模型

其中,<x_i,y_i>是 Mini-Batch 內第 i 個訓練例項對應的輸入 x_i 和值 y_i。h_θ是希望學習到的對映函式,其中θ是函式對應的當前引數值。深度學習中的Normalization模型代表了 Mini-Batch 中例項 i 決定的梯度方向,Batch 內所有訓練例項共同決定了本次引數更新的梯度方向。

根據梯度方向即可利用標準 SGD 來更新模型引數

深度學習中的Normalization模型

其中,η是學習率

由上述過程(參考圖 2)可以看出,對於 Mini-Batch SGD 訓練方法來說,為了能夠引數更新必須得先求出梯度方向,而為了能夠求出梯度方向,需要對每個例項得出當前引數對映函式的預測值 h_θ (x_i ),這意味著如果是用神經網路來學習對映函式 h_θ的話,Mini-Batch 內的每個例項需要走一遍當前的網路,產生當前引數神經網路的預測值,這點請注意,這是理解後續 Batch Normalization 的基礎。

至於 Batch Size 的影響,目前可以實驗證實的是:batch size 設定得較小訓練出來的模型相對大 batch size 訓練出的模型泛化能力更強,在測試集上的表現更好,而太大的 batch size 往往不太 Work,而且泛化能力較差。但是背後是什麼原因造成的,目前還未有定論,持不同看法者各持己見。因為這不是文字的重點,所以先略過不表。

Normalization 到底是在做什麼

Normalization 的中文翻譯一般叫做「規範化」,是一種對數值的特殊函式變換方法,也就是說假設原始的某個數值是 x,套上一個起到規範化作用的函式,對規範化之前的數值 x 進行轉換,形成一個規範化後的數值,即:

深度學習中的Normalization模型

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

其實我們生活中也有很多類似的規範化操作,知乎裡面有個熱帖,主題是:「為什麼人大附中的學生那麼愛穿校服?」,裡面有人打趣地問:「請問人大附中的學生洗澡的時候脫不脫校服?」。這個問題我回答不了,要我猜大概率夏天洗澡的時候是會脫的,要不然洗澡的時候天太熱人受不了,冬天則未必,穿著洗可能更保暖。跑題了,其實我想說的是:學校要求學生穿校服就是一種典型的規範化操作,學校的規範化目標是要求學生著裝整齊劃一,顯得幹練有風貌,所以定義了一個規範化函式:

深度學習中的Normalization模型

就是說不論哪個學生,不論你平常的著裝變數 x=」香奈兒」還是 x=「麻袋片」,經過這個規範化函式操作,統一都換成校服。這樣就達到了學校的規範化目的。

深度學習中的Normalization模型圖 3. 神經元

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

步驟一:對輸入資料進行線性變換,產生淨啟用值

深度學習中的Normalization模型

其中,x 是輸入,w 是權重引數,b 是偏置,w 和 b 是需要進過訓練學習的網路引數

步驟二:套上非線性啟用函式神經網路的非線效能力來自於此,目前深度學習最常用的啟用函式是 Relu 函式 x=Relu(a)。

如此一個神經元就完成了對輸入資料的非線性函式變換。這裡需要強調下,步驟一的輸出一般稱為淨啟用(Net Activation),第二步驟經過啟用函式後得到的值為啟用值。為了描述簡潔,本文後續文字中使用啟用的地方,其實指的是未經啟用函式的淨啟用值,而非一般意義上的啟用,這點還請注意。

至於深度學習中的 Normalization,因為神經網路裡主要有兩類實體:神經元或者連線神經元的邊,所以按照規範化操作涉及物件的不同可以分為兩大類,一類是對第 L 層每個神經元的啟用值或者說對於第 L+1 層網路神經元的輸入值進行 Normalization 操作,比如 BatchNorm/LayerNorm/InstanceNorm/GroupNorm 等方法都屬於這一類;另外一類是對神經網路中連線相鄰隱層神經元之間的邊上的權重進行規範化操作,比如 Weight Norm 就屬於這一類。廣義上講,一般機器學習裡看到的損失函式裡面加入的對引數的的 L1/L2 等正則項,本質上也屬於這第二類規範化操作。L1 正則的規範化目標是造成引數的稀疏化,就是爭取達到讓大量引數值取得 0 值的效果,而 L2 正則的規範化目標是有效減小原始引數值的大小。有了這些規範目標,通過具體的規範化手段來改變引數值,以達到避免模型過擬合的目的。

本文主要介紹第一類針對神經元規範化操作方法,這是目前 DNN 做 Normalization 最主流的做法。

深度學習中的Normalization模型

圖 4. Normalization 加入的位置

那麼對於第一類的 Normalization 操作,其在什麼位置發揮作用呢?目前有兩種在神經元中插入 Normalization 操作的地方(參考圖 4),第一種是原始 BN 論文提出的,放在啟用函式之前;另外一種是後續研究提出的,放在啟用函式之後,不少研究表明將 BN 放在啟用函式之後效果更好。本文在講解時仍然遵循 BN 原始論文,後續講解都可以看成是將 Normalization 操作放在啟用函式之前進行。

對於神經元的啟用值來說,不論哪種 Normalization 方法,其規範化目標都是一樣的,就是將其啟用值規整為均值為 0,方差為 1 的正態分佈。即規範化函式統一都是如下形式:

深度學習中的Normalization模型

寫成兩步的模式是為了方便講解,如果寫成一體的形式,則是如下形式:

深度學習中的Normalization模型

其中,a_i 為某個神經元原始啟用值,深度學習中的Normalization模型為經過規範化操作後的規範後值。整個規範化過程可以分解為兩步,第一步參考公式(1),是對啟用值規整到均值為 0,方差為 1 的正態分佈範圍內。其中,μ 是通過神經元集合 S(至於 S 如何選取讀者可以先不用關注,後文有述)中包含的 m 個神經元各自的啟用值求出的均值,即:

深度學習中的Normalization模型

σ_i 為根據均值和集合 S 中神經元各自啟用值求出的啟用值標準差:

深度學習中的Normalization模型

其中,ε 是為了增加訓練穩定性而加入的小的常量資料。

第二步參考公式(2),主要目標是讓每個神經元在訓練過程中學習到對應的兩個調節因子,對規範到 0 均值,1 方差的值進行微調。因為經過第一步操作後,Normalization 有可能降低神經網路的非線性表達能力,所以會以此方式來補償 Normalization 操作後神經網路的表達能力。

目前神經網路中常見的第一類 Normalization 方法包括 Batch Normalization/Layer Normalization/Instance Normalization 和 Group Normalization,BN 最早由 Google 研究人員於 2015 年提出,後面幾個演算法算是 BN 的改進版本。不論是哪個方法,其基本計算步驟都如上所述,大同小異,最主要的區別在於神經元集合 S 的範圍怎麼定,不同的方法採用了不同的神經元集合定義方法。

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

深度學習中的Normalization模型

圖 5. Normalization 具體例子

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

針對神經元的所有 Normalization 方法都遵循上述計算過程,唯一的不同在於如何劃定計算統計量所需的神經元集合 S 上。讀者可以自己思考下,如果你是 BN 或者其它改進模型的設計者,那麼你會如何選取集合 S?

Batch Normalization 如何做

我們知道,目前最常用的深度學習基礎模型包括前向神經網路(MLP),CNN 和 RNN。目前 BN 在這些基礎網路結構都有嘗試,總體而言,BN 在 MLP 和 CNN 是非常成功的,在 RNN 上效果不明顯。下面我們分述前向神經網路以及 CNN 中如何應用 BN,然後談談 BN 面臨的一些困境。正是這些困境引發了後續的一系列改進模型的提出。

3.1 前向神經網路中的 BN

深度學習中的Normalization模型

圖 6. 前向神經網路中的 BatchNorm

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

3.2 CNN 網路中的 BN

瞭解了前向神經網路中的 BatchNorm,接下來介紹 CNN 中的 BatchNorm,讀者可以先自行思考下如果由你來主導設計,在 CNN 中究竟應該如何確定神經元集合 S 的勢力範圍。


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

深度學習中的Normalization模型

圖 7. CNN 中的卷積核

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

深度學習中的Normalization模型

圖 8. CNN 中的 BatchNorm 過程

那麼在卷積層中,如果要對通道啟用二維平面中某個啟用值進行 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 的具體計算過程與前文所述計算過程一樣,採用公式 3 即可完成規範化操作。這樣即完成 CNN 卷積層的 BatchNorm 轉換過程。

深度學習中的Normalization模型

圖 9. CNN 中 Batch Norm 的另外一種角度的理解

描述起來似乎有些複雜,但是從概念上,其實可以把 CNN 中的卷積層想象成前向神經網路中的一個隱層,然後把對應的某個卷積核想象成 MLP 隱層中的一個神經元節點,無非其輸出是個二維啟用平面而不像 MLP 的神經元輸出是一個啟用值,另外一個不同是這個神經元覆蓋的輸入部分不同,CNN 的卷積核是區域性覆蓋輸入,通過滑動視窗來實現輸入的全覆蓋,而 MLP 的神經元則是一步到位全域性覆蓋輸入而已 (參考圖 9 示意)。如果從這個角度思考 CNN 和 MLP 中的 BatchNorm 的話,其實兩者的做法是一致的。

從理論上講,類似的 BatchNorm 操作也可以應用在 RNN 上,事實上也有不少研究做了嘗試,但是各種實驗證明其實這麼做沒什麼用,所以本文就不展開講 RNN 中的 BN 了。

BatchNorm 目前基本已經成為各種網路(RNN 除外)的標配,主要是因為效果好,比如可以加快模型收斂速度,不再依賴精細的引數初始化過程,可以調大學習率等各種方便,同時引入的隨機噪聲能夠起到對模型引數進行正則化的作用,有利於增強模型泛化能力。

但是,BatchNorm 這麼好用的大殺器,仍然存在很多問題。

3.3 Batch Norm 的四大罪狀

侷限 1:如果 Batch Size 太小,則 BN 效果明顯下降。

BN 是嚴重依賴 Mini-Batch 中的訓練例項的,如果 Batch Size 比較小則任務效果有明顯的下降。那麼多小算是太小呢?圖 10 給出了在 ImageNet 資料集下做分類任務時,使用 ResNet 的時候模型效能隨著 BatchSize 變化時的效能變化情況,可以看出當 BatchSize 小於 8 的時候開始對分類效果有明顯負面影響。之所以會這樣,是因為在小的 BatchSize 意味著資料樣本少,因而得不到有效統計量,也就是說噪音太大。這個很好理解,這就類似於我們國家統計局在做年均收入調查的時候,正好把你和馬雲放到一個 Batch 裡算平均收入,那麼當你為下個月房租發愁之際,突然聽到你所在組平均年薪 1 億美金時,你是什麼心情,那小 Mini-Batch 裡其它訓練例項就是啥心情。

深度學習中的Normalization模型

圖 10. BN 的 Batch Size 大小對 ImageNet 分類任務效果的影響(From GN 論文)

BN 的 Batch Size 大小設定是由調參師自己定的,調參師只要把 Batch Size 大小設定大些就可以避免上述問題。但是有些任務比較特殊,要求 batch size 必須不能太大,在這種情形下,普通的 BN 就無能為力了。比如 BN 無法應用在 Online Learning 中,因為線上模型是單例項更新模型引數的,難以組織起 Mini-Batch 結構。

侷限 2:對於有些畫素級圖片生成任務來說,BN 效果不佳;

對於圖片分類等任務,只要能夠找出關鍵特徵,就能正確分類,這算是一種粗粒度的任務,在這種情形下通常 BN 是有積極效果的。但是對於有些輸入輸出都是圖片的畫素級別圖片生成任務,比如圖片風格轉換等應用場景,使用 BN 會帶來負面效果,這很可能是因為在 Mini-Batch 內多張無關的圖片之間計算統計量,弱化了單張圖片本身特有的一些細節資訊。

侷限 3:RNN 等動態網路使用 BN 效果不佳且使用起來不方便

對於 RNN 來說,儘管其結構看上去是個靜態網路,但在實際執行展開時是個動態網路結構,因為輸入的 Sequence 序列是不定長的,這源自同一個 Mini-Batch 中的訓練例項有長有短。對於類似 RNN 這種動態網路結構,BN 使用起來不方便,因為要應用 BN,那麼 RNN 的每個時間步需要維護各自的統計量,而 Mini-Batch 中的訓練例項長短不一,這意味著 RNN 不同時間步的隱層會看到不同數量的輸入資料,而這會給 BN 的正確使用帶來問題。假設 Mini-Batch 中只有個別特別長的例子,那麼對較深時間步深度的 RNN 網路隱層來說,其統計量不方便統計而且其統計有效性也非常值得懷疑。另外,如果在推理階段遇到長度特別長的例子,也許根本在訓練階段都無法獲得深層網路的統計量。綜上,在 RNN 這種動態網路中使用 BN 很不方便,而且很多改進版本的 BN 應用在 RNN 效果也一般。

侷限 4:訓練時和推理時統計量不一致

對於 BN 來說,採用 Mini-Batch 內例項來計算統計量,這在訓練時沒有問題,但是在模型訓練好之後,線上推理的時候會有麻煩。因為線上推理或預測的時候,是單例項的,不存在 Mini-Batch,所以就無法獲得 BN 計算所需的均值和方差,一般解決方法是採用訓練時刻記錄的各個 Mini-Batch 的統計量的數學期望,以此來推算全域性的均值和方差,線上推理時採用這樣推匯出的統計量。雖說實際使用並沒大問題,但是確實存在訓練和推理時刻統計量計算方法不一致的問題。

上面所列 BN 的四大罪狀,表面看是四個問題,其實深入思考,都指向了幕後同一個黑手,這個隱藏在暗處的黑手是誰呢?就是 BN 要求計算統計量的時候必須在同一個 Mini-Batch 內的例項之間進行統計,因此形成了 Batch 內例項之間的相互依賴和影響的關係。如何從根本上解決這些問題?一個自然的想法是:把對 Batch 的依賴去掉,轉換統計集合範圍。在統計均值方差的時候,不依賴 Batch 內資料,只用當前處理的單個訓練資料來獲得均值方差的統計量,這樣因為不再依賴 Batch 內其它訓練資料,那麼就不存在因為 Batch 約束導致的問題。在 BN 後的幾乎所有改進模型都是在這個指導思想下進行的。

但是這個指導思路儘管會解決 BN 帶來的問題,又會引發新的問題,新的問題是:我們目前已經沒有 Batch 內例項能夠用來求統計量了,此時統計範圍必須侷限在一個訓練例項內,一個訓練例項看上去孤零零的無依無靠沒有組織,怎麼看也無法求統計量,所以核心問題是對於單個訓練例項,統計範圍怎麼算?

Layer Normalization、Instance Normalization 及 Group Normalization

4.1 Layer Normalization

為了能夠在只有當前一個訓練例項的情形下,也能找到一個合理的統計範圍,一個最直接的想法是:MLP 的同一隱層自己包含了若干神經元;同理,CNN 中同一個卷積層包含 k 個輸出通道,每個通道包含 m*n 個神經元,整個通道包含了 k*m*n 個神經元;類似的,RNN 的每個時間步的隱層也包含了若干神經元。那麼我們完全可以直接用同層隱層神經元的響應值作為集合 S 的範圍來求均值和方差。這就是 Layer Normalization 的基本思想。圖 11、圖 12 和圖 13 分示了 MLP、CNN 和 RNN 的 Layer Normalization 的集合 S 計算範圍,因為很直觀,所以這裡不展開詳述。

深度學習中的Normalization模型

圖 11. MLP 中的 LayerNorm

深度學習中的Normalization模型

圖 12. CNN 中的 LayerNorm

深度學習中的Normalization模型

圖 13. RNN 中的 LayerNorm

前文有述,BN 在 RNN 中用起來很不方便,而 Layer Normalization 這種在同隱層內計算統計量的模式就比較符合 RNN 這種動態網路,目前在 RNN 中貌似也只有 LayerNorm 相對有效,但 Layer Normalization 目前看好像也只適合應用在 RNN 場景下,在 CNN 等環境下效果是不如 BatchNorm 或者 GroupNorm 等模型的。從目前現狀看,動態網路中的 Normalization 機制是非常值得深入研究的一個領域。

4.2 Instance Normalization

從上述內容可以看出,Layer Normalization 在拋開對 Mini-Batch 的依賴目標下,為了能夠統計均值方差,很自然地把同層內所有神經元的響應值作為統計範圍,那麼我們能否進一步將統計範圍縮小?對於 CNN 明顯是可以的,因為同一個卷積層內每個卷積核會產生一個輸出通道,而每個輸出通道是一個二維平面,也包含多個啟用神經元,自然可以進一步把統計範圍縮小到單個卷積核對應的輸出通道內部。圖 14 展示了 CNN 中的 Instance Normalization,對於圖中某個卷積層來說,每個輸出通道內的神經元會作為集合 S 來統計均值方差。對於 RNN 或者 MLP,如果在同一個隱層類似 CNN 這樣縮小範圍,那麼就只剩下單獨一個神經元,輸出也是單值而非 CNN 的二維平面,這意味著沒有形成集合 S,所以 RNN 和 MLP 是無法進行 Instance Normalization 操作的,這個很好理解。

深度學習中的Normalization模型

圖 14 CNN 中的 Instance Normalization

我們回想下圖 8 代表的 CNN 中的 Batch Normalization,可以設想一下:如果把 BN 中的 Batch Size 大小設定為 1,此時和 Instance Norm 的圖 14 比較一下,是否兩者是等價的?也就是說,看上去 Instance Normalization 像是 Batch Normalization 的一種 Batch Size=1 的特例情況。但是仔細思考,你會發現兩者還是有區別的,至於區別是什麼讀者可自行思考。

Instance Normalization 對於一些圖片生成類的任務比如圖片風格轉換來說效果是明顯優於 BN 的,但在很多其它影象類任務比如分類等場景效果不如 BN。

4.3 Group Normalization

從上面的 Layer Normalization 和 Instance Normalization 可以看出,這是兩種極端情況,Layer Normalization 是將同層所有神經元作為統計範圍,而 Instance Normalization 則是 CNN 中將同一卷積層中每個卷積核對應的輸出通道單獨作為自己的統計範圍。那麼,有沒有介於兩者之間的統計範圍呢?通道分組是 CNN 常用的模型優化技巧,所以自然而然會想到對 CNN 中某一層卷積層的輸出或者輸入通道進行分組,在分組範圍內進行統計。這就是 Group Normalization 的核心思想,是 Facebook 何凱明研究組 2017 年提出的改進模型。

圖 15 展示了 CNN 中的 Group Normalization。理論上 MLP 和 RNN 也可以引入這種模式,但是還沒有看到相關研究,不過從道理上考慮,MLP 和 RNN 這麼做的話,分組內包含神經元太少,估計缺乏統計有效性,猜測效果不會太好。

深度學習中的Normalization模型

圖 15. CNN 中的 Group Normalization

Group Normalization 在要求 Batch Size 比較小的場景下或者物體檢測/視訊分類等應用場景下效果是優於 BN 的。

4.4 用一個故事來總結

為了能夠更直觀地理解四種 Normalization 的異同,大家可以體會下面的故事以做類比:

很久很久以前,在遙遠的 L 國內有一個神奇的理髮館,理髮館裡面有很多勤勞的理髮師,來這裡理髮的顧客也很奇特,他們所有人都會要求理髮師(神經元)理出和其他人差不多長的頭髮(求均值)。那麼和其他人差不多長究竟是多長呢?這可難不倒我們可愛又聰明的理髮師,於是理髮師把自己最近 24 個小時服務過的顧客(Mini-Batch)進入理髮店時的頭髮長度求個平均值,這個均值就是「和其他人差不多長」的長度。來這裡的每個顧客都很滿意,時間久了,人們尊稱這些理髮師為:BatchNorm 理髮師。

不幸總是突然的,有一天,理髮館裡發生了一件怪事,所有理髮師的記憶只能維持 1 分鐘,他們再也記不住過去 24 小時中發生的事情了,自然也記不住過去服務客人的頭髮長度。但是每個顧客仍然要求剪出和其他人差不多長的頭髮長度,這可怎麼辦?聰明的理髮師們又想出了一個辦法:他們相互大聲報出同一時刻在理髮館裡自己手上客人的頭髮長度,每個理髮師就可以用這些人的頭髮長度均值作為滿足自己手上客人條件的長度。儘管這是一群得了失憶綜合證的理髮師,但是顧客對他們的服務仍然非常滿意,於是人們改稱他們為:LayerNorm 理髮師。

不幸總是突然的,有一天,理髮館裡又發生了一件怪事,理髮師們不僅得了失憶症,這次都突然失聰,再也聽不到其它理髮師的口頭通知,而固執的客人仍然堅持要理出「和其他人差不多長」的頭髮。對了,忘了介紹了,理髮館是有隔間的,每個隔間有 K 個理髮師同時給顧客理髮,雖然我們可愛又聰明的理髮師現在失憶又失聰,但是再大的困難也難不倒也叫不醒這群裝睡的人,他們醒來後群策群力又發明了一個新方法:同一個隔間的理髮師通過相互打手勢來通知其它理髮師自己手上顧客的頭髮長度。於是同一個隔間的理髮師又可以剪出顧客滿意的頭髮了。人們稱這些身殘志堅的理髮師為:GroupNorm 理髮師。

不幸總是突然的,有一天,理髮館裡又發生了一件怪事,不過這次不是天災是人禍,理髮館老闆出於好心,給每位理髮師單獨開個辦公室給顧客理髮,但是好心辦了壞事,這樣一來,失憶失聰又無法相互打手勢的理髮師們怎麼應對頑固的顧客呢?怎樣才能繼續理出「和其他人差不多長」的頭髮呢?想必一般人這個時候基本無路可走了,但是我們可愛又聰明,同時失聰又失憶的理髮師仍然想出瞭解決辦法:他們看了看客人頭上的頭髮,發現不同地方有長有短,於是就把同一個客人所有頭髮的平均長度作為難題的答案(CNN 的 InstanceNorm)。聽起來這個解決方案匪夷所思,但是出人意料的是,有些客人居然仍然非常滿意。人們管這些傳說中的神奇理髮師為:InstanceNorm 理髮師。

Normalization 操作的 Re-Scaling 不變性

我們知道,當神經網路深度加深時,訓練有較大困難,往往其原因在於隨著網路加深,在反向傳播訓練模型時,存在梯度爆炸或者梯度消失問題,Loss 資訊不能有效傳導到低層神經網路引數,所以導致引數無法更新,模型無法收斂或者收斂速度慢。而很多環節可能導致梯度爆炸或者梯度消失問題,比如非線性函式及其導數是什麼形式以及網路引數是否過大過小等,以非線性函式來說,比如 RELU 是能極大緩解這個問題的(因為它的導數是個常數),這也是為何目前 RELU 大行其道的根本原因。從神經網路引數角度看,如果神經網路中的引數具備 Re-Scaling 不變性,意味著引數值過大或者過小對神經元輸出沒什麼影響,無疑這對緩解梯度爆炸或者梯度消失也有極大幫助作用,而 Normalization 確實具備幾個不同角度的 Re-Scaling 不變性,這也許是 Normalization 為何應用在深度學習有效的原因之一,雖然可能並非本質原因。本節即講述 Normalization 為何具備 Re-Scaling 不變性這種優良特性。

我們考慮神經網路中的三種 Re-Scaling 情形:權重向量(Weight Vector)Re-Scaling,資料 Re-Scaling 和權重矩陣(Weight Matrix)Re-Scaling。

深度學習中的Normalization模型

圖 16. 權重向量 Re-Scaling

對於網路中某個神經元 i 來說,其對應的邊權重向量假設為 W_i,所謂權重向量(Weight Vector)Re-Scaling,就是將 W_i 乘上一個縮放因子φ,如果神經元 i 在進行權重向量 Re-Scaling 之前和之後兩種不同情況下做 Normalization 操作,若 Normalization 之後神經元 i 對應的啟用值沒發生變化,我們就說這種 Normalization 具備權重向量 Re-Scaling 不變性(參考圖 16)。

深度學習中的Normalization模型

圖 17. 資料 Re-Scaling

所謂資料 Re-Scaling,指的是把輸入 X 乘上一個縮放因子φ,同樣的,如果對輸入做縮放前後兩種情況下進行 Normalization 操作,若 Normalization 之後所有隱層神經元對應的啟用值沒發生變化,我們說這種 Normalization 具備資料 Re-Scaling 不變性(參考圖 17)。

深度學習中的Normalization模型

圖 18. 權重矩陣 Re-Scaling

權重矩陣 Re-Scaling 指的是:對於某兩個隱層(L 層 vs L+1 層)之間的所有邊的權重引數 W_ij 同時乘上相同的縮放因子φ,如果在權重矩陣 Re-Scaling 之前和之後兩種情形下對 (L+1) 層隱層神經元Normalization 操作,若兩種情況下隱層所有神經元啟用值沒有變化,我們說這種 Normalization 具備權重矩陣 Re-Scaling 不變性(參考圖 18)。

在瞭解了三種 Re-Scaling 的含義及 Normalization 對應的三種不變性特性後,我們先歸納各種 Normalization 操作所對應的三種 Re-Scaling 的不變性特性如下表所示(Layer Normalization 原始論文分析了 LayerNorm 及 BatchNorm 的 Re-Scaling 不變性,本文作者補充了 InstanceNorm 及 GroupNorm 的情況以及細化了推導過程):

深度學習中的Normalization模型

由表中可見,這四種不同的 Normalization 操作都同時具備權重矩陣 Re-Scaling 不變性和資料 Re-Scaling 不變性,但是不同的操作在權重向量 Re-Scaling 不變性這方面有差異,Batch Norm 和 Instance Norm 具備權重向量 Re-Scaling 不變性,而另外兩種 Normalization 不具備這個特性。

我們以 Batch Normalization 為例來說明為何 BN 具備權重向量 Re-Scaling 不變性。

 對於某個神經元 i 的啟用 a 來說,其值為:

a_i=W_i∙X+b_i

(對於 MLP 和 CNN 來說,是一樣的,都是這個公式,區別在於 CNN 是區域性連線,MLP 是全域性連線,也就是說只有 W_i 的數量規模不同而已。)其中,W_i 是與神經元 i 相連的邊權重向量(Weight Vector),X 是輸入資料或是多層網路中前一層的輸出向量,b_i 是偏置。我們可以把偏置看作輸入資料值為 1 的特殊邊的權重,所以可以併入前項,簡寫上述公式為:

a_i=W_i∙X

現在假設我們開始 re-scale 邊權重向量 W_i,使得這些邊的權重縮放因子為φ,其對應的新的啟用得到相同的縮放比例:

深度學習中的Normalization模型

而邊的權重縮放後對應的均值變為:

深度學習中的Normalization模型

也就是說均值也被同比例縮放,這裡的關鍵是因為 BN 的統計量取值範圍是來自於同一個 Mini-Batch 的例項,所以經過的是用一個神經元,於是對應了相同的邊權重向量,那麼縮放因子相同,就可以提到求和公式之外。

類似的,如果我們忽略噪音因子,邊權重縮放後對應的方差變為:

深度學習中的Normalization模型

可見方差也被同比例縮放,因為

深度學習中的Normalization模型

這是為何說 BN 具備權重向量 Re-Scaling 不變性的原因。

類似的,BN 也具備資料 Re-Scaling 不變性,其推導過程與上述推導過程基本一樣。

因為如果將原始輸入 X 乘以縮放因子φ,等價於某個神經元 i 的啟用變為

深度學習中的Normalization模型

其餘推導類似上述的權重向量 ReScaling 的後續推導過程,其對應的均值和方差也會同比例縮放,於是得到了 BN 的資料 Re-Scaling 不變性。

同樣的,很容易推出 BN 也具備權重矩陣 Re-Scaling 不變性,因為權重矩陣中所有邊權重會使用相同的縮放因子φ,意味著某個隱層所有神經元對應的權重向量都使用相同的縮放因子,而在進行 BN 操作時,同隱層內的神經元相互獨立沒什麼關係,因為上面推導了對於某個神經元 i 來說,其具備權重向量 Re-Scaling 不變性, 所以對於所有隱層神經元來說,整個權重矩陣縮放後,任意神經元的啟用與未縮放時相同,所以 BN 具備權重矩陣 Re-Scaling 不變性。

對於其它三類 Normalization,也就是 Layer Norm/Instance Norm/Group Norm 來說,都同時具備權重矩陣 Re-Scaling 不變性及資料 Re-Scaling 不變性,推導過程也與上述推導過程類似,此處不贅述。

那麼為何 Layer Norm 不具備權重向量 Re-Scaling 不變性呢?因為 Layer Norm 是在同隱層的神經元之間求統計量,我們考慮一種比較極端的情況,假設 MLP 的隱層只包含兩個神經元神經元 i 和神經元 j,而神經元 i 對應的邊權重向量 W_i 縮放因子是φ_i,神經元 j 對應的邊權重向量 W_j 縮放因子是φ_j。於是得出各自經過縮放後的啟用值為:

深度學習中的Normalization模型

對應的縮放後的均值為:

深度學習中的Normalization模型

均值是無法提出公共縮放因子的,類似的方差也提不出公共縮放因子,所以不具備權重向量 Re-Scaling 不變性。那這又是為什麼呢?根本原因是要進行求統計量計算的範圍不是同一個神經元,而是不同的神經元,而每個神經元對應權重向量縮放因子不同,所以難以抽出公共縮放因子並相互抵消。除非同一隱層所有隱層神經元共享相同的縮放因子,這個情形其實就是權重矩陣 Re-Scaling 能夠滿足的條件,所以可以看出 Layer Norm 具備權重矩陣 Re-Scaling 不變性而不具備權重向量 Re-Scaling 不變性。Group Norm 也是類似情況。

Batch Normalization 為何有效

正如上文所述,BN 在提出後獲得了巨大的成功,目前在各種深度學習場景下廣泛應用,因為它能加快神經網路收斂速度,不再依賴精細的引數初始化過程,可以使用較大的學習率等很多好處,但是我們應該意識到,所講的這些好處僅僅是引用 BN 帶來的結果,那麼更深層次的問題是:為什麼 BN 能夠給深度學習帶來如此多的優點呢?它背後起作用的深層原因是什麼呢?上文儘管從 Normalization 操作的 Re-Scaling 不變性角度有所說明,但其實還有更深層或更本質的原因。

原始的 BN 論文給出的解釋是 BN 可以解決神經網路訓練過程中的 ICS(Internal Covariate Shift)問題,所謂 ICS 問題,指的是由於深度網路由很多隱層構成,在訓練過程中由於底層網路引數不斷變化,導致上層隱層神經元啟用值的分佈逐漸發生很大的變化和偏移,而這非常不利於有效穩定地訓練神經網路

深度學習中的Normalization模型

圖 19. BN 和 ICS 問題的關係

但是能夠解決 ICS 問題其實並不是 BN 為何有效背後真正的原因,最近有一些研究對此作了探討。那麼 ICS 問題真實存在嗎?ICS 問題在較深的網路中確實是普遍存在的,但是這並非導致深層網路難以訓練的根本原因。另外,BN 解決了 ICS 問題了嗎?其實也沒有。實驗一方面證明:即使是應用了 BN,網路隱層中的輸出仍然存在嚴重的 ICS 問題;另一方面也證明了:在 BN 層輸出後人工加入噪音模擬 ICS 現象,並不妨礙 BN 的優秀表現(參考圖 19)。這兩方面的證據互相佐證來看的話,其實側面說明了 BN 和 ICS 問題並沒什麼關係。

深度學習中的Normalization模型

圖 20. 損失曲面

那麼 BN 有效的真正原因到底是什麼呢?這還要從深度網路的損失曲面(Loss Surface)說起,在深度網路疊加大量非線性函式方式來解決非凸複雜問題時,損失曲面形態異常複雜,大量空間坑坑窪窪相當不平整(參考圖 20),也有很多空間是由平坦的大量充滿鞍點的曲面構成,訓練過程就是利用 SGD 在這個複雜平面上一步一步遊走,期望找到全域性最小值,也就是曲面裡最深的那個坑。所以在 SGD 尋優時,在如此複雜曲面上尋找全域性最小值而不是落入區域性最小值或者被困在鞍點動彈不得,可想而知難度有多高。

有了損失曲面的基本概念,我們回頭來看為何 BN 是有效的。研究表明,BN 真正的用處在於:通過上文所述的 Normalization 操作,使得網路引數重整(Reparametrize),它對於非線性非凸問題複雜的損失曲面有很好的平滑作用,引數重整後的損失曲面比未重整前的引數損失曲面平滑許多。我們可以用 L-Lipschitz 函式來評估損失曲面的平滑程度,L-Lipschitz 函式定義如下:

深度學習中的Normalization模型

含義也很直觀,對於定義區間內的任意取值 x_1 和 x_2,用它們的距離去和經過函式對映後的值(就是深度網路表達的損失函式)的距離進行比較,如果存在值 L 滿足上述公式條件,也就是說函式對映後的距離一定在任意兩個 x 差值的 L 倍以內,那麼這個函式稱為 L-Lipschitz 函式。而 L 的大小代表了函式曲面的平滑程度,很明顯,L 越小曲面越平滑,L 越大,則曲面越凹凸不平,時而高峰時而波谷不斷顛倒跳躍。舉個例子,假設你一出門邁出一步才 1 米深度學習中的Normalization模型,就突然掉到一個 100 米深的深溝深度學習中的Normalization模型,那麼要滿足公式條件,L 最小得是 100;而假設你一出門邁出一步深度學習中的Normalization模型踏上了一個 0.3 米的小臺階深度學習中的Normalization模型,那麼 L 最小等於 0.3 即可。

深度學習中的Normalization模型

圖 21. 帶 BN 與不帶 BN 操作的 L-Lipschitz 情況

圖 21 展示了用 L-Lipschitz 函式來衡量採用和不採用 BN 進行神經網路訓練時兩者的區別,可以看出未採用 BN 的訓練過程中,L 值波動幅度很大,而採用了 BN 後的訓練過程 L 值相對比較穩定且值也比較小,尤其是在訓練的初期,這個差別更明顯。這證明了 BN 通過引數重整確實起到了平滑損失曲面及梯度的作用。

前文提到了 Normalization引數的 Re-Scaling 不變性,這也是引數重整達到的效果之一,所以也許其 Re-Scaling 特性和 Loss 曲面平滑作用是 Normalization 的一體兩面,共同發揮作用或者其實本身是一回事。事實的真相很可能是:Normalization 通過對啟用值進行正態分佈化的引數重整,產生引數 Re-Scaling 不變的效果,因此緩解梯度消失或梯度爆炸問題,與其對應的重整後的損失曲面及梯度也因此變得更平滑,更有利於 SGD 尋優找到問題好的解決方案。當然這只是本文作者根據幾方面研究現狀做出的推測,目前並沒有相關實證研究,還請讀者謹慎對待此觀點。

結束語

本文歸納了目前深度學習技術中針對神經元進行 Normalization 操作的若干種模型,可以看出,所有模型都採取了類似的步驟和過程,將神經元的啟用值重整為均值為 0 方差為 1 的新數值,最大的不同在於計算統計量的神經元集合 S 的劃分方法上。BN 採用了同一個神經元,但是來自於 Mini-Batch 中不同訓練例項導致的不同啟用作為統計範圍。而為了克服 Mini-Batch 帶來的弊端,後續改進方法拋棄了 Mini-Batch 的思路,只用當前訓練例項引發的啟用來劃分集合 S 的統計範圍,概括而言,LayerNorm 採用同隱層的所有神經元;InstanceNorm 採用 CNN 中卷積層的單個通道作為統計範圍,而 GroupNorm 則折衷兩者,採用卷積層的通道分組,在劃分為同一個分組的通道內來作為通道範圍。

至於各種 Normalization 的適用場景,可以簡潔歸納如下:對於 RNN 的神經網路結構來說,目前只有 LayerNorm 是相對有效的;如果是 GAN 等圖片生成或圖片內容改寫型別的任務,可以優先嚐試 InstanceNorm;如果使用場景約束 BatchSize 必須設定很小,無疑此時考慮使用 GroupNorm;而其它任務情形應該優先考慮使用 BatchNorm。

看上去其實 Normalization 的各種改進模型思路都很直觀,問題是:還有其它劃分集合 S 的方法嗎?很明顯還有很多種其它方法,建議讀者可以仔細思考下這個問題,如果你能找到一種新的集合劃分方法且證明其有效,那麼恭喜你,這意味著你找到了一種新的 Normalization 模型。還等什麼,趕緊去發現它們吧。

參考文獻:

Sergey Ioffe etc. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift. 2015.

Jimmy Lei Ba etc. Layer Normalization. 2016.

Dmitry Ulyanov etc. Instance Normalization: The Missing Ingredient for Fast Stylization. 2016.

Yuxin Wu etc. Group Normalization.2018.

Tim Salimans etc. Weight Normalization: A Simple Reparameterization to Accelerate Training of Deep Neural Networks.2016.

Shibani Santurkar etc. How Does Batch Normalization Help Optimization? 2018.

Johan Bjorck etc. Understanding Batch Normalization. 2018

作者簡介:張俊林,中國中文資訊學會理事,目前在新浪微博 AI Lab 擔任資深演算法專家。在此之前,張俊林曾經在阿里巴巴任資深技術專家,以及在百度和用友擔任技術經理及技術總監等職務。同時他是技術書籍《這就是搜尋引擎:核心技術詳解》(該書榮獲全國第十二屆輸出版優秀圖書獎)、《大資料日知錄:架構與演算法》的作者。

相關文章