知乎:詳解深度學習中的Normalization,BN/LN/WN
一、兩個概念
獨立同分布(independent and identically distributed)
獨立同分布的數據可以簡化常規機器學習模型的訓練、提升機器學習模型的預測能力
白化(whitening)
去除特征之間的相關性 —> 獨立;
使得所有特征具有相同的均值和方差 —> 同分布。
二、問題
1、抽象程度高的層難以訓練
深度神經網絡涉及到很多層的疊加,而每一層的參數更新會導致上層的輸入數據分布發生變化,通過層層疊加,高層(抽象程度高)的輸入分布變化會非常劇烈,這就使得高層需要不斷去重新適應底層的數據更新
Google 將這一現象總結為 Internal Covariate Shif:
統計機器學習中的一個經典假設是“源空間(source domain)和目標空間(target domain)的數據分布(distribution)是一致的”。如果不一致,那么就出現了新的機器學習問題,如 transfer learning / domain adaptation 等。
而 covariate shift 就是分布不一致假設之下的一個分支問題,它是指源空間和目標空間的條件概率是一致的,但是其邊緣概率不同,即:對所有
,
但是
大家細想便會發現,的確,對於神經網絡的各層輸出,由於它們經過了層內操作作用,各層的輸入信號的分布顯然不同,而且差異會隨着網絡深度增大而增大,可是它們所能“指示”的樣本標記(label)仍然是不變的,這便符合了covariate shift的定義。由於是對層間信號的分析,也即是“internal”的來由。
問題描述簡而言之,每個神經元的輸入數據不再是“獨立同分布”。
其一,上層參數需要不斷適應新的輸入數據分布,降低學習速度。
其二,下層輸入的變化可能趨向於變大或者變小,導致上層落入飽和區,使得學習過早停止。
其三,每層的更新都會影響到其它層,因此每層的參數更新策略需要盡可能的謹慎。
2、問題挑戰
我們以神經網絡中的一個普通神經元為例。神經元接收一組輸入向量
通過某種運算后,輸出一個標量值:
由於 ICS 問題的存在, 對於某一特定層,不同批次的輸入 的分布可能相差很大。
要解決獨立同分布的問題,“理論正確”的方法就是對每一層的數據都進行白化操作。然而標准的白化操作代價高昂,特別是我們還希望白化操作是可微的,保證白化操作可以通過反向傳播來更新梯度。
三、解決思路:BN
1、通用框架
在將 送給神經元之前,先對其做平移和伸縮變換, 將
的分布規范化成在固定區間范圍的標准分布。
通用變換框架就如下所示:
(1) 是平移參數(shift parameter),
是縮放參數(scale parameter)。通過這兩個參數進行 shift 和 scale 變換:
得到的數據符合均值為 0、方差為 1 的標准分布。
(2) 是再平移參數(re-shift parameter),
是再縮放參數(re-scale parameter)。將 上一步得到的
進一步變換為:
最終得到的數據符合均值為 、方差為
的分布。
2、第二次變換的目的
1、目的一
第一次變換得到均值為 0、方差為 1 的標准分布,表達能力有限,下層神經元可能很努力地在學習,但不論其如何變化,其輸出的結果在交給上層神經元進行處理之前,將被粗暴地重新調整到這一固定范圍。為了更好的應用底層神經網絡的學習結果,我們將規范化后的數據進行再平移和再縮放,使得每個神經元對應的輸入范圍是針對該神經元量身定制的一個確定范圍(均值為 、方差為
)。rescale 和 reshift 的參數都是可學習的,這就使得 Normalization 層可以學習如何去適應底層的學習結果。
2、目的二
除了充分利用底層學習的能力,另一方面的重要意義在於保證獲得非線性的表達能力。
Sigmoid 等激活函數在神經網絡中有着重要作用,通過區分飽和區和非飽和區,使得神經網絡的數據變換具有了非線性計算能力。而第一步的規范化會將幾乎所有數據映射到激活函數的非飽和區(線性區),僅利用到了線性變化能力,從而降低了神經網絡的表達能力。而進行再變換,則可以將數據從線性區變換到非線性區,恢復模型的表達能力。
3、優勢
不添加正則化, 的均值取決於下層神經網絡的復雜關聯;添加本層后,取值
僅由
來確定,去除了與下層計算的密切耦合。新參數很容易通過梯度下降來學習,簡化了神經網絡的訓練。
4、問題
a)BN的實際作用
標准白化操作的目的是“獨立同分布”。獨立就不說了,暫不考慮。變換為均值為 、方差為
的分布,也並不是嚴格的同分布,只是映射到了一個確定的區間范圍而已(所以,這個問題仍然有研究空間)。
另外有人提出:BN其優勢並非解決了獨立同分布的問題(實際上它也沒解決),其最大意義在於解決了梯度彌散問題,見論文:How Does Batch Normalization Help Optimization?(知乎上的一篇閱讀筆記:為什么Batch Normalization那么有用?)。文章結論如下:
- 沒有證據表明BN的work,是因為減少了ICS(Interval Covariate Shift)。
- BN work的根本原因,是因為在網絡的訓練階段,其能夠讓優化空間(optimization landscape)變的平滑。
- 其他的normalization技術也能夠像BN那樣對於網絡的訓練起到作用。
其作用為防止梯度爆炸或彌散、可以提高訓練時模型對於不同超參(學習率、初始化)的魯棒性、可以讓大部分的激活函數能夠遠離其飽和區域。
b) BN對小批次訓練效果不好
當單個小批次(minibatch)的數據不能代表整個數據的分布時,BN的表現就會不盡如人意,這意味着忘記將輸入隨機打亂順序的情況下使用批歸一化是很危險的,實際上batch過小的時候就不太適合開放BN的可訓練性。具體討論見論文:Batch Normalization: Accelerating Deep Network Training by Reducing。
BN訓練時為什么不使用全局均值/方差?
使用 BN 的目的就是為了保證每批數據的分布穩定,使用全局統計量反而違背了這個初衷;
BN 的作者認為在訓練時采用移動平均可能會與梯度優化存在沖突
四、主流 Normalization 方法梳理

BatchNorm:batch方向做歸一化,算N*H*W的均值
LayerNorm:channel方向做歸一化,算C*H*W的均值
InstanceNorm:一個channel內做歸一化,算H*W的均值
GroupNorm:將channel方向分group,然后每個group內做歸一化,算(C//G)*H*W的均值
https://zhuanlan.zhihu.com/p/69659844
1、Batch Normalization
於2015年由 Google 提出,BN 獨立地規范化每一個層不同批次的 ,但規范化的參數是一個 mini-batch 的一階統計量和二階統計量。這就要求 每一個 mini-batch 的統計量是整體統計量的近似估計,或者說每一個 mini-batch 彼此之間,以及和整體數據,都應該是近似同分布的。分布差距較小的 mini-batch 可以看做是為規范化操作和模型訓練引入了噪聲,可以增加模型的魯棒性;但如果每個 mini-batch的原始分布差別很大,那么不同 mini-batch 的數據將會進行不一樣的數據變換,這就增加了模型訓練的難度。訓練時,網絡會記錄每一個batch滑動平均的均值和方差,訓練結束的時候這四個參數就固定了供測試時直接加載使用。
BN 比較適用的場景是:每個 mini-batch 比較大,數據分布比較接近。在進行訓練之前,要做好充分的 shuffle,否則效果會差很多。
另外,由於 BN 需要在運行過程中統計每個 mini-batch 的一階統計量和二階統計量,因此不適用於 動態的網絡結構 和 RNN 網絡。不過,也有研究者專門提出了適用於 RNN 的 BN 使用方法,這里先不展開了。
2、Layer Normalization
LN 針對單個訓練樣本進行,不依賴於其他數據,因此可以避免 BN 中受 mini-batch 數據分布影響的問題,可以用於 小 mini-batch 場景、動態網絡場景和 RNN,特別是自然語言處理領域。此外,LN 不需要保存 mini-batch 的均值和方差,節省了額外的存儲空間。
但是,BN 的轉換是針對單個神經元可訓練的——不同神經元的輸入經過再平移和再縮放后分布在不同的區間,而 LN 對於一整層的神經元訓練得到同一個轉換——所有的輸入都在同一個區間范圍內。如果不同輸入特征不屬於相似的類別(比如顏色和大小),那么 LN 的處理可能會降低模型的表達能力。
3、Instance Normalization
在GAN和style transfer的任務中,目前的IN norm要好於BN,IN主要用於對單張圖像的數據做處理,而BN主要是對Bacth的數據做處理。由於BN在訓練時每個batch的均值和方差會由於shuffle都會改變,所以可以理解為一種數據增強,而IN可以理解為對數據做一個歸一化的操作。
換句話說,BN的計算是要受其他樣本影響的,由於每個batch的均值和標准差不穩定,對於單個數據而言,相對於是引入了噪聲,但在分類這種問題上,結果和數據的整體分布有關系,因此需要通過BN獲得數據的整體分布。而instance norm的信息都是來自於自身的圖片,相當於對全局信息做了一次整合和調整,在圖像轉換這種問題上,BN獲得的整體信息不會帶來任何收益,帶來的噪聲反而會弱化實例之間的獨立性:這類生成式方法,每張圖片自己的風格比較獨立不應該與batch中其他的樣本產生太大聯系。
4、Group Normalization
group normalization是2018年3月份何愷明大神的又一力作,優化了BN在比較小的mini-batch情況下表現不太好的劣勢。批量維度進行歸一化會帶來一些問題——批量統計估算不准確導致批量變小時,BN 的誤差會迅速增加。在訓練大型網絡和將特征轉移到計算機視覺任務中(包括檢測、分割和視頻),內存消耗限制了只能使用小批量的BN。事實上,GN的極端情況就是LN和IN,分別對應G等於C和G等於1。
tf實現並不復雜,如下
def GroupNorm(x,G=16,eps=1e-5): N,H,W,C=x.shape x=tf.reshape(x,[tf.cast(N,tf.int32), tf.cast(H,tf.int32), tf.cast(W,tf.int32), tf.cast(G,tf.int32), tf.cast(C//G,tf.int32)]) mean,var=tf.nn.moments(x,[1,2,4],keep_dims=True) x=(x-mean)/tf.sqrt(var+eps) x=tf.reshape(x,[tf.cast(N,tf.int32), tf.cast(H,tf.int32), tf.cast(W,tf.int32), tf.cast(C,tf.int32)]) gamma = tf.Variable(tf.ones(shape=[1,1,1,tf.cast(C,tf.int32)]), name="gamma") beta = tf.Variable(tf.zeros(shape=[1,1,1,tf.cast(C,tf.int32)]), name="beta") return x*gamma+beta
在深度學習沒有火起來之前,提取特征通常是使用SIFT,HOG和GIST特征,這些特征有一個共性,都具有按group表示的特性,每一個group由相同種類直方圖的構建而成,這些特征通常是對在每個直方圖(histogram)或每個方向(orientation)上進行組歸一化(group-wise norm)而得到。
從深度學習上來講,完全可以認為卷積提取的特征是一種非結構化的特征或者向量,拿網絡的第一層卷積為例,卷積層中的的卷積核filter1和此卷積核的其他經過transform過的版本filter2(transform可以是horizontal flipping等),在同一張圖像上學習到的特征應該是具有相同的分布,那么,具有相同的特征可以被分到同一個group中,按照個人理解,每一層有很多的卷積核,這些核學習到的特征並不完全是獨立的,某些特征具有相同的分布,因此可以被group。