深度學習中的多種Normalization模型

知識圖譜,【A】深度學習中的Normalization模型

轉載算法

做者 :張俊林網絡

架構

張俊林,中國中文信息學會理事,中科院軟件所博士,目前在新浪微博AI Lab擔任資深算法專家。在此以前,張俊林曾經在阿里巴巴任資深技術專家並負責新技術團隊,以及在百度和用友擔任技術經理及技術總監等職務。同時他是技術書籍《這就是搜索引擎:核心技術詳解》(該書榮獲全國第十二屆輸出版優秀圖書獎)、《大數據日知錄:架構與算法》的做者。框架

機器學習

編者按函數

無論是傳統機器學習,仍是當前火熱的的深度學習,Normalization技術都是可以提高算法性能的大殺器。本文以很是宏大和透徹的視角分析了深度學習中的多種Normalization模型,包括你們熟悉的Batch Normalization (BN)和可能不那麼熟悉 的Layer Normalization (LN)、Instance Normalization (IN) 及Group Normalization (GN)模型;用生動形象的例子闡述了這些Normalization模型之間的區別和聯繫;並在一個統一的數學框架下分析了它們的性質;最後從一個新的數學視角分析了BN算法爲何有效。性能

文章轉自做者知乎專欄學習

1測試

從Mini-Batch SGD提及大數據

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

咱們知道,SGD是不管學術圈寫文章作實驗仍是工業界調參跑模型最經常使用的模型優化算法,可是有時候容易被忽略的一點是:通常提到的SGD是指的Mini-batch SGD,而非原教旨意義下的單實例SGD。

知識圖譜,【A】深度學習中的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)更新模型參數並逐步尋優的過程。

知識圖譜,【A】深度學習中的Normalization模型圖2. Mini-Batch SGD優化過程

具體而言,若是咱們假設機器學習任務的損失函數是平方損失函數:

知識圖譜,【A】深度學習中的Normalization模型

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

知識圖譜,【A】深度學習中的Normalization模型

知識圖譜,【A】深度學習中的Normalization模型

根據梯度方向便可利用標準SGD來更新模型參數:

知識圖譜,【A】深度學習中的Normalization模型

其中,知識圖譜,【A】深度學習中的Normalization模型是學習率。

由上述過程(參考圖2)能夠看出,對於Mini-Batch SGD訓練方法來講,爲了可以參數更新必須得先求出梯度方向,而爲了可以求出梯度方向,須要對每一個實例得出當前參數下映射函數的預測值,這意味着若是是用神經網絡來學習映射函數的話,Mini-Batch內的每一個實例須要走一遍當前的網絡,產生當前參數下神經網絡的預測值,這點請注意,這是理解後續Batch Normalization的基礎。

至於Batch Size的影響,目前能夠實驗證明的是:batch size 設置得較小訓練出來的模型相對大batch size訓練出的模型泛化能力更強,在測試集上的表現更好,而太大的batch size每每不太Work,並且泛化能力較差。可是背後是什麼緣由形成的,目前還未有定論,持不一樣見解者各持己見。由於這不是文本的重點,因此先略過不表。

2

Normalization究竟是在作什麼

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

知識圖譜,【A】深度學習中的Normalization模型

所謂規範化,是但願轉換後的數值知足必定的特性,至於對數值具體如何變換,跟規範化目標有關,也就是說f()函數的具體形式,不一樣的規範化目標緻使具體方法中函數所採用的形式不一樣。

其實咱們生活中也有不少相似的規範化操做,知乎裏面有個熱帖,主題是:「爲何人大附中的學生那麼愛穿校服?」,裏面有人打趣地問:「請問人大附中的學生洗澡的時候脫不脫校服?」。這個問題我回答不了,要我猜大機率夏天洗澡的時候是會脫的,要否則洗澡的時候天太熱人受不了,冬天則未必,穿着洗可能更保暖。跑題了,其實我想說的是:學校要求學生穿校服就是一種典型的規範化操做,學校的規範化目標是要求學生着裝整齊劃一,顯得幹練有風貌,因此定義了一個規範化函數:

知識圖譜,【A】深度學習中的Normalization模型

就是說不論哪一個學生,不論你日常的着裝變量x=」香奈兒」仍是x=「麻袋片」,通過這個規範化函數操做,統一都換成校服。這樣就達到了學校的規範化目的。

知識圖譜,【A】深度學習中的Normalization模型圖3. 神經元

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

步驟一:對輸入數據進行線性變換,產生淨激活值

知識圖譜,【A】深度學習中的Normalization模型

其中,x是輸入,w是權重參數,b是偏置,w和b是須要進過訓練學習的網絡參數。

步驟二:套上非線性激活函數,神經網絡的非線性能力來自於此,目前深度學習最經常使用的激活函數是Relu函數

知識圖譜,【A】深度學習中的Normalization模型

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

至於深度學習中的Normalization,由於神經網絡裏主要有兩類實體:神經元或者鏈接神經元的邊,因此按照規範化操做涉及對象的不一樣能夠分爲兩大類,一類是對第L層每一個神經元的激活值或者說對於第L+1層網絡神經元的輸入值進行Normalization操做,好比BatchNorm/LayerNorm/InstanceNorm/GroupNorm等方法都屬於這一類;另一類是對神經網絡中鏈接相鄰隱層神經元之間的邊上的權重進行規範化操做,好比Weight Norm就屬於這一類。廣義上講,通常機器學習裏看到的損失函數裏面加入的對參數的的L1/L2等正則項,本質上也屬於這第二類規範化操做。L1正則的規範化目標是形成參數的稀疏化,就是爭取達到讓大量參數值取得0值的效果,而L2正則的規範化目標是有效減少原始參數值的大小。有了這些規範目標,經過具體的規範化手段來改變參數值,以達到避免模型過擬合的目的。

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

知識圖譜,【A】深度學習中的Normalization模型圖4. Normalization加入的位置

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

對於神經元的激活值來講,不論哪一種Normalization方法,其規範化目標都是同樣的,就是將其激活值規整爲均值爲0,方差爲1的正態分佈。即規範化函數統一都是以下形式:

知識圖譜,【A】深度學習中的Normalization模型

寫成兩步的模式是爲了方便講解,若是寫成一體的形式,則是以下形式:

知識圖譜,【A】深度學習中的Normalization模型

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

知識圖譜,【A】深度學習中的Normalization模型

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

知識圖譜,【A】深度學習中的Normalization模型

其中,知識圖譜,【A】深度學習中的Normalization模型是爲了增長訓練穩定性而加入的小的常量數據。

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

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

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

知識圖譜,【A】深度學習中的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?

3

Batch Normalization如何作

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

3.1

前向神經網絡中的BN

知識圖譜,【A】深度學習中的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。

知識圖譜,【A】深度學習中的Normalization模型圖7. CNN中的卷積核

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

知識圖譜,【A】深度學習中的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轉換過程。

知識圖譜,【A】深度學習中的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裏其它訓練實例就是啥心情。

知識圖譜,【A】深度學習中的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內實例可以用來求統計量了,此時統計範圍必須侷限在一個訓練實例內,一個訓練實例看上去孤零零的無依無靠沒有組織,怎麼看也沒法求統計量,因此核心問題是對於單個訓練實例,統計範圍怎麼算?

4

Layer Normalization、Instance Normalization及Group Normalization

4.1

Layer Normalization

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

知識圖譜,【A】深度學習中的Normalization模型圖11. MLP中的LayerNorm

知識圖譜,【A】深度學習中的Normalization模型圖12. CNN中的LayerNorm

知識圖譜,【A】深度學習中的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操做的,這個很好理解。

知識圖譜,【A】深度學習中的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這麼作的話,分組內包含神經元太少,估計缺少統計有效性,猜想效果不會太好。

知識圖譜,【A】深度學習中的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理髮師。

5

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。

知識圖譜,【A】深度學習中的Normalization模型圖16. 權重向量Re-Scaling

對於網絡中某個神經元i來講,其對應的邊權重向量假設爲,所謂權重向量(Weight Vector)Re-Scaling,就是將乘上一個縮放因子,若是神經元i在進行權重向量 Re-Scaling以前和以後兩種不一樣狀況下作Normalization操做,若Normalization以後神經元i對應的激活值沒發生變化,咱們就說這種Normalization具有權重向量Re-Scaling不變性(參考圖16)。

知識圖譜,【A】深度學習中的Normalization模型圖17. 數據Re-Scaling

所謂數據Re-Scaling,指的是把輸入X乘上一個縮放因子,一樣的,若是對輸入作縮放先後兩種狀況下進行Normalization操做,若Normalization以後全部隱層神經元對應的激活值沒發生變化,咱們說這種Normalization具有數據Re-Scaling不變性(參考圖17)。

知識圖譜,【A】深度學習中的Normalization模型圖18. 權重矩陣 Re-Scaling

而權重矩陣 Re-Scaling指的是:對於某兩個隱層(L層vs L+1層)之間的全部邊的權重參數同時乘上相同的縮放因子,若是在權重矩陣 Re-Scaling以前和以後兩種情形下對(L+1)層隱層神經元作Normalization操做,若兩種狀況下隱層全部神經元激活值沒有變化,咱們說這種Normalization具有權重矩陣 Re-Scaling不變性(參考圖18)。

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

知識圖譜,【A】深度學習中的Normalization模型

由表中可見,這四種不一樣的Normalization操做都同時具有權重矩陣Re-Scaling不變性和數據Re-Scaling不變性,可是不一樣的操做在權重向量Re-Scaling不變性這方面有差別,Batch Norm和Instance Norm具有權重向量Re-Scaling不變性,而另外兩種Normalization不具有這個特性。

知識圖譜,【A】深度學習中的Normalization模型

咱們以Batch Normalization爲例來講明爲什麼BN具有權重向量Re-Scaling不變性。

對於某個神經元i的激活a來講,其值爲:

(對於MLP和CNN來講,是同樣的,都是這個公式,區別在於CNN是局部鏈接,MLP是全局鏈接,也就是說只有知識圖譜,【A】深度學習中的Normalization模型的數量規模不一樣而已。)

其中,知識圖譜,【A】深度學習中的Normalization模型是與神經元i相連的邊權重向量(Weight Vector),X是輸入數據或是多層網絡中前一層的輸出向量,知識圖譜,【A】深度學習中的Normalization模型是偏置。咱們能夠把偏置看做輸入數據值爲1的特殊邊的權重,因此能夠併入前項,簡寫上述公式爲:

知識圖譜,【A】深度學習中的Normalization模型

如今假設咱們開始re-scale邊權重向量知識圖譜,【A】深度學習中的Normalization模型,使得這些邊的權重縮放因子爲知識圖譜,【A】深度學習中的Normalization模型,其對應的新的激活獲得相同的縮放比例:

知識圖譜,【A】深度學習中的Normalization模型

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

知識圖譜,【A】深度學習中的Normalization模型

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

相似的,若是咱們忽略噪音因子,邊權重縮放後對應的方差變爲:

知識圖譜,【A】深度學習中的Normalization模型

可見方差也被同比例縮放,由於:

知識圖譜,【A】深度學習中的Normalization模型

這是爲什麼說BN具有權重向量Re-Scaling不變性的緣由。

相似的,BN也具有數據Re-Scaling不變性,其推導過程與上述推導過程基本同樣。由於若是將原始輸入X乘以縮放因子,等價於某個神經元i的激活變爲

知識圖譜,【A】深度學習中的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對應的邊權重向知識圖譜,【A】深度學習中的Normalization模型縮放因子是知識圖譜,【A】深度學習中的Normalization模型,神經元j對應的邊權重向量知識圖譜,【A】深度學習中的Normalization模型縮放因子是知識圖譜,【A】深度學習中的Normalization模型。因而得出各自通過縮放後的激活值爲:

知識圖譜,【A】深度學習中的Normalization模型

對應的縮放後的均值爲:

知識圖譜,【A】深度學習中的Normalization模型

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

6

Batch Normalization爲什麼有效

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

原始的BN論文給出的解釋是BN能夠解決神經網絡訓練過程當中的ICS(Internal Covariate Shift)問題,所謂ICS問題,指的是因爲深度網絡由不少隱層構成,在訓練過程當中因爲底層網絡參數不斷變化,致使上層隱層神經元激活值的分佈逐漸發生很大的變化和偏移,而這很是不利於有效穩定地訓練神經網絡。

知識圖譜,【A】深度學習中的Normalization模型圖19. BN和ICS問題的關係

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

知識圖譜,【A】深度學習中的Normalization模型圖20. 損失曲面

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

有了損失曲面的基本概念,咱們回頭來看爲什麼BN是有效的。研究代表,BN真正的用處在於:經過上文所述的Normalization操做,使得網絡參數重整(Reparametrize),它對於非線性非凸問題複雜的損失曲面有很好的平滑做用,參數重整後的損失曲面比未重整前的參數損失曲面平滑許多。咱們能夠用L-Lipschitz函數來評估損失曲面的平滑程度,L-Lipschitz函數定義以下:

知識圖譜,【A】深度學習中的Normalization模型

含義也很直觀,對於定義區間內的任意取值知識圖譜,【A】深度學習中的Normalization模型知識圖譜,【A】深度學習中的Normalization模型,用它們的距離去和通過函數映射後的值(就是深度網絡表達的損失函數)的距離進行比較,若是存在值L知足上述公式條件,也就是說函數映射後的距離必定在任意兩個x差值的L倍之內,那麼這個函數稱爲L-Lipschitz函數。而L的大小表明了函數曲面的平滑程度,很明顯,L越小曲面越平滑,L越大,則曲面越凹凸不平,時而高峯時而波谷不斷顛倒跳躍。舉個例子,假設你一出門邁出一步才1米

知識圖譜,【A】深度學習中的Normalization模型

就忽然掉到一個100米深的深溝

知識圖譜,【A】深度學習中的Normalization模型

那麼要知足公式條件,L最小得是100;而假設你一出門邁出一步

知識圖譜,【A】深度學習中的Normalization模型

踏上了一個0.3米的小臺階

知識圖譜,【A】深度學習中的Normalization模型

那麼L最小等於0.3便可。

知識圖譜,【A】深度學習中的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尋優找到問題好的解決方案。固然這只是本文做者根據幾方面研究現狀作出的推測,目前並無相關實證研究,還請讀者謹慎對待此觀點。

7

結束語

本文概括了目前深度學習技術中針對神經元進行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模型。還等什麼,趕忙去發現它們吧。

參考文獻:

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

  2. Jimmy Lei Ba etc. Layer Normalization. 2016.

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

  4. Yuxin Wu etc. Group Normalization.2018.

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

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

  7. Johan Bjorck etc. Understanding Batch Normalization. 2018

來源商業新知網,原標題:【A】深度學習中的Normalization模型

相關文章
相關標籤/搜索