在深度學習中,歸一化的手段可謂無處不在。

對神經網路的輸入進行歸一化,對每一層的歸一化(Batch Normalization、Layer Normalization),對權重的歸一化(Weight Normalization)都有效的提升了神經網路的表現。

這些歸一化手段是否有基於一些共同的想法?歸一化手段為什麼能對神經網路的訓練和表現帶來幫助?


BN最早被認為通過降低所謂Internal Covariate Shift,這種想法的出處可考至Understanding the difficulty of training deep feedforward neural networks,想必這也是batch norm作者這麼設計的初衷。但是這種想法並沒有過多實驗支持,比如說去年NeurlPS這篇paper作者做了實驗,在batch norm之後加上一些隨機擾動(non-zero mean and non-unit variance,人為引入covariate shift),發現效果仍然比不加好很多。為什麼放在batch norm layer之後而不是之前?因為為了證偽batch norm通過forward pass這一步降低covariate shift來提升網路訓練效率的。這樣說來故事就變得很有趣了,也就是說我們大概都理解一些BN對BN層之前網路噪音的好處,那麼能不能研究一下它對它後面layer的影響?所以這些研究從優化的角度,有如下幾種觀點。

  1. BN通過修改loss function, 可以令loss的和loss的梯度均滿足更強的Lipschitzness性質(即函數f滿足L-Lipschitz和 [公式] -smooth,令L和 [公式] 更小,後者其實等同於f Hessian的eigenvalue小於 [公式] ,可以作為光滑程度的度量,其實吧我覺得,一般convex optimization裏拿這個度量算convergence rate是神器,對於non-convex optimization,不懂鴨,paper裏好像也沒寫的樣子),這麼做的好處是當步子邁得大的時候,我們可以更自信地告訴自己計算出來的梯度可以更好地近似實際的梯度,因此也不容易讓優化掉進小坑裡。有意思的地方來了,是不是我在某些地方插入一個1/1000 layer,把梯度的L-Lipschitz變成1/1000L-Lipschitz就能讓函數優化的更好了呢?其實不是的,因為單純除以函數會改變整個優化問題,而BN做了不僅僅rescale這件事情,還讓原來近似最優的點在做完變化之後,仍然保留在原來不遠的位置。這也就是這篇文章的核心論點,BN做的是問題reparametrization而不是簡單的scaling。 [1]
  2. BN把優化這件事情分解成了優化參數的方向和長度兩個任務,這麼做呢可以解耦層與層之間的dependency因此會讓curvature結構更易於優化。這篇證了convergence rate,但由於沒有認真讀,所以感覺沒太多資格評價。[2]

歸一化手段是否殊途同歸?很可能是的,在[1]的3.3作者也嘗試了Lp normalization,也得到了和BN差不多的效果。至於Layer norm還是weight norm,可能都可以順著這個思路進行研究鴨,無論是通過[1]還是[2],可能今年的paper裏就見分曉了,lets see。

  1. How Does Batch Normalization Help Optimization?
  2. Exponential convergence rates for Batch Normalization: The power of length-direction decoupling in non-convex optimization


其實這個問題很難,很偏理論。

回顧一下圍繞normalization的一些工作(由最新到最舊的BatchNorm):

2019,Weight Standardization(沒有發表,但是有大佬Alan Yuille加持)

Weight Standardization 2019

WS叫權重標準化,建立在BN可以平滑損失landscape/BN可以平滑激活值這個觀點上,進一步提升GN的效果匹配到BN的水平上,針對GN在micro-batch訓練時性能不及BN。WS的原理是:減小損失和梯度的Lipschitz常數

2019,Dynamic Normalization

Differentiable Dynamic Normalization for Learning Deep Representation ICML 2019

跟SN類似,加入了GN。

2019,Switchable Normalization

Differentiable Learning-to-Normalize via Switchable Normalization ICLR 2019

SN是為每一層選擇/學習適當的歸一化層(IN、LN和BN),在ImageNet,COCO,CityScapes,ADE20K和Kinetics等數據集上進行實驗,應用涵蓋圖像分類、物體檢測、語義分割和視頻分類。

2019,Iterative Normalization(CVPR)

Iterative Normalization Beyond Standardization towards Efficient Whitening CVPR 2019

DBN的高效版本

2019,Spatially-Adaptive Normalization(CVPR)

Semantic Image Synthesis with Spatially-Adaptive Normalization CVPR 2019

用於圖像生成

2018,Gradient Normalization(ICML)

GradNorm Gradient Normalization for Adaptive Loss Balancing in Deep Multitask Networks ICML 2018

2018,Kalman Normalization

Kalman Normalization Normalizing Internal Representations Across Network Layers NIPS 2018

2018,Decorrelated Batch Normalization

Decorrelated Batch Normalization CVPR 2018

BN+白化

2018,Spectral Normalization(ICLR)

Spectral Normalization for Generative Adversarial Networks ICLR 2018

2018,Group Normalization(ECCV)

Group Normalization ECCV 2018

用於物體檢測和語義分割等batch size很小的時候

GroupNorm是InstanceNorm的變體。

2018,Batch-Instance Normalization

Batch-Instance Normalization for Adaptively Style-Invariant Neural Networks NIPS 2018

2018,Instance-Batch Normalization

Two at Once Enhancing Learning and Generalization Capacities via IBN-Net ECCV 2018

2016,Layer Normalization(沒有發表)

用於RNN

2016,Instance Normalization(沒有發表,但是經過了實踐檢驗)

用於風格遷移

2016,Weight Normalization(NIPS)

2015,Batch Normalization(ICML)

用於卷積網路ConvNet和圖像分類

逐篇看。。。總結歸納。。。需要時間。。。


以下摘自我的另一個回答,小蓮子:碎碎念:Transformer的細枝末節。原本是介紹 Layer Normalization 的。

所有的規範化技術,都可以概括為如下的公式:

[公式]

對於隱層中某個節點的輸出為對激活值 [公式] 進行非線性變換 [公式] 後的[公式] ,先使用均值 [公式] 和方差 [公式][公式] 進行分佈調整。如果將其理解成正態分佈,就是把「高瘦」和「矮胖」的都調整回正常體型(深粉色),把偏離x=0的拉回中間來(淡紫色)。

不同均值和方差下的正態分佈 | sigmoid函數

這樣做的第一個好處(平移)是,可以讓激活值落入 [公式]梯度敏感區間(紅色虛線的中間段)。梯度更新幅度變大,模型訓練加快第二個好處是,可以將每一次迭代的數據調整為相同分佈(相當於「白化」),消除極端值,提升訓練穩定性

然而,在梯度敏感區,隱層的輸出接近於「線性」,模型表達能力會大幅度下降。引入 gain 因子 [公式] 和 bias 因子 [公式] ,為規範化後的分佈再加入一點「個性」。需要注意的是, [公式][公式]作為模型參數訓練得到[公式][公式]在限定的數據範圍內統計得到。BN 和 LN 的差別就在這裡,前者在某一個 Batch 內統計某特定神經元節點的輸出分佈(跨樣本),後者在某一次迭代更新中統計同一層內的所有神經元節點的輸出分佈(同一樣本下)。盜用一張 @gylight 的圖:


Batch Normalizing是深度學習中最重要的技巧之一。是由Sergey Ioffe和Christian Szeged創建的。Batch Normalizing使超參數的搜索更加快速便捷,也使得神經網路魯棒性更好。

這裡有一個非常簡單但很容易理解的文章。

深度學習技巧之Batch Normalizing?

www.datalearner.com圖標

一般來說,在訓練類似邏輯回歸或者深度學習的演算法的時候,我們需要對輸入數據進行標準化,這樣可以保證輸入的數據均值為0,且輸入數據都在一定範圍內,這樣做主要原因是非標準化的數據優化的時候目標函數是一個扁平的結果,會影響學習的速度,而標準化之後的目標函數是接近圓形的結果,對於梯度下降求解來說能顯著加快找到最優值的速度。

既然如此,那麼對於深度神經網路來說,我們是否可以對每一層的輸出也做一個標準化,作為下一層的輸入以此來加快求解速度呢?答案是可以的,這就是Batch Normalizing。


舉個不是特別恰當但是能說明問題的例子,起起伏伏的路肯定沒有平坦的跑起來舒服,速度也會更慢,如果是有懸崖的登山之路一不小心就會摔死。訓練神經網路模型是類似的,歸一化了就相當於修了一個高速公路,把高速不平的路給壓平。


因為有可能兩個變數的數值上差距很大,圖形上就會很扁。一方面,各種數值計算時容易大數喫小數;另一方面,求梯度的時候某個軸會非常敏感。

歸一化把變數約束到一個差不多大的方盒子裏分析,扁平的圖形變得比較圓了。有很多好處。

相當於增加了一定的約束。

變數的權重更能體現歸一化後變數在系統內的貢獻,不像之前可能會非常大或非常小。

優化的過程更穩定,不同方向的步長也更「正常」了;不歸一化的話震蕩會更劇烈。

歸一化後,不同的問題都在差不多的空間裏解,很多性質和經驗可以借鑒。

歸一化在很多領域裡都有大量應用,基本目的就是為了大家在同一平臺上比較,不同變數間更「公平」。

甚至有些其他方法也是為了相同的目的;比如無量剛化,雷諾數就是流體力學中非常常用的概念,當然這些數是有物理意義的。


前面各位大佬理論上講得很細了,我這裡就說簡單點,給出一個較為全局的認識。

其實深度學習裏的正則化方法就是 通過把一部分不重要的複雜信息損失掉,以此來降低擬合難度以及過擬合的風險,從而加速了模型的收斂 。Normalization目的就是讓分佈穩定下來(降低各維度數據的方差)。

不同正則化方法的區別只是操作的信息維度不同,即選擇損失信息的維度不同。

在CV中常常使用BN,它是在NHW維度進行了歸一化,而Channel維度的信息原封不動,因為可以認為在CV應用場景中,數據在不同channel中的信息很重要,如果對其進行歸一化將會損失不同channel的差異信息。

而NLP中不同batch樣本的信息關聯性不大,而且由於不同的句子長度不同,強行歸一化會損失不同樣本間的差異信息,所以就沒在batch維度進行歸一化,而是選擇LN,只考慮的句子內部維度的歸一化。 可以認為NLP應用場景中一個樣本內部維度間是有關聯的,所以在信息歸一化時,對樣本內部差異信息進行一些損失,反而能降低方差。

選擇什麼樣的歸一化方式,取決於你關注數據的哪部分信息。如果某個維度信息的差異性很重要,需要被擬合,那就別在那個維度進行歸一化。

這些歸一化手段是否有基於一些共同的想法?歸一化手段為什麼能對神經網路的訓練和表現帶來幫助?看了這個回答,應該有些感覺了吧哈哈

過擬合其實就是擬合了數據過於複雜的細節,正則化方法是讓模型不去擬合這些數據細節。無論是通過消除這些影響泛化的差異信息,還是通過讓模型參數變得更簡單,根本出發點都是一樣的。


回答只是出於探討,如有不足還望指教。

簡單來說,歸一就是數據清洗的一部分,和調節圖像大小灰度、或者剔除離羣值一樣是一種優化的手段。同時是將數據映射到0-1的範圍內便於度量X矩陣或者說在ANN裏的input

那麼為什麼要用歸一化?我想有兩點。

其一,ANN模型參數普遍非常大,而且input在隱藏層或者池化或者卷積的過程中,參數一定是較小的,否則robust會大打折扣,而且較大的波動性在隱藏層縱向會導致部分神經元的收斂甚至消失,降低ANN的多元性和可預測性。

其二,歸一化有助於展現數據的特性。用softmax tanh sigmoid……的歸一方式,會得到不同特性的數據,根據不同特性的數據,optimizer的方式也會不同,例如常說的稀疏性,從而會影響擬合度的問題


水平不夠,讓各位見笑了,貼別人的回答過來。

https://zhuanlan.zhihu.com/p/33173246

------------

思想對應的論文都寫了,統一之處就是Batch Norm論文裏寫的,中間層的特徵分佈標準化之後訓練起來更容易


推薦閱讀:
相關文章