Normalization(歸一化)
寫這一篇的原因是以前只知道一個Batch Normalization,自以為懂了。結果最近看文章,又發現一個Layer Normalization,一下就懵逼了。搞不懂這兩者的區別。后來是不查不知道,一查嚇一跳,Normalization的方法五花八門,Batch Normalization, Layer Normalization, Weight Normalization, Cosine Normalization, Instance Normalization, Group Normlization, Switchable Normlization.... 估計我沒看到的還有很多。而且郁悶的是,感覺越看越不懂了...
這里簡單記錄一下目前的理解與問題。
白化
白化的目的是希望特征符合獨立同分布i.i.d條件。包括:
- 去除特征之間的相關性 —> 獨立;
- 使得所有特征具有相同的均值和方差 —> 同分布。
這里我有了第一個問題。什么叫做去除特征之間的相關性?
比如,有兩個輸入向量,X1=(x11,x12,x13,x14), X2=(x21,x22,x23,x24)
去除特征之間的相關性,只是去除x11,x12,x13,x14之間的相關性,還是去除x11和x21的相關性?
Normalization的好處
- 使得數據更加符合獨立同分布條件,減少internal corvariate shift導致的偏移
- 使數據遠離激活函數的飽和區,加快速度。(我理解是只對sigmoid這樣的激活函數有效,對relu則沒有加速作用了)
Normalization基本公式
\(\mu\):均值
\(\sigma\):方差根
\(b\): 再平移參數,新數據以\(b\)為均值
\(g\): 再縮放參數,新數據以\(g^2\)為方差
歸一化后的目標就是統一不同\(x\)之間的均值和方差
加入\(g\)和\(b\)的目的是使數據一定程度偏離激活函數的線性區,提高模型表達能力。因為均值是0的話正好落在sigmoid函數的線性部分。
第二個問題,g和b是根據什么確定的,是trainable的嗎?
Batch Normalization
Batch Normalization是針對不同batch導致的數據偏移做歸一化的方式。比如,一個batch有3個輸入,每個輸入是一個長度為4的向量。
\(X1=(x11,x12,x13,x14)\)
\(X2=(x21,x22,x23,x24)\)
\(X3=(x31,x32,x33,x34)\)
在上述條件下,歸一化時的均值是:
\(\mu=(\frac{x11+x21+x31}{3},\frac{x12+x22+x32}{3},\frac{x13+x23+x33}{3},\frac{x14+x24+x34}{3})\)
這里主要展示一下計算時的方向,即對於每個元素位置,對不同的輸入做歸一化。方差同理。
第三個問題,很多文章都說batch norm需要在batch size較大,不同batch之間均值方差相差不大的情況下效果好。
即batch的均值方差跟整體的均值方差一致時效果好。
這我就不懂了,無論之前每個batch的分布是怎樣的,經過歸一化,都已經是相同分布了。為什么一定要原始batch之間分布相似呢?
Batch norm有個缺點,即需要記錄每一個batch輸入的均值和方差,對於變長的RNN網絡來說計算麻煩。
第四個問題:為什么要記錄每個batch的均值和方差?對RNN效果不好僅僅因為麻煩嗎?
我個人理解BN在RNN上效果不好的原因是,雖然RNN訓練時網絡深度很深,但實際上只有一個神經元節點,相當於把所有層的神經元的均值和方差設定為相同的值了,導致效果不佳。
如果是圖像,則輸入是一個四維矩陣,(batch_size, channel_size, weight, height),此時batch norm是針對同一個batch的不同輸入中屬於同一通道的元素做歸一化。如下圖,是一個batch_size=2, channel_size=6, weight=5, height=3的例子。一次batch norm是對所有橙色部分元素做歸一化。

Layer Normalization
Layer Normalization是針對同一個輸入的不同維度特征的歸一化方式。還是用上面的例子。
對於\(X1\)來說,layer norm的歸一化均值是: \(\mu=\frac{x11+x12+x13+x14}{4}\)
對於圖像來說,則是對一個輸入的所有元素做歸一化。如下圖橙色部分:

Instance Norm
對一個輸入圖像的一個通道中的所有元素做歸一化。如下圖橙色部分:

Group Norm
對於一個輸入圖像的多個通道元素做歸一化。如下圖橙色部分:

Weight Norm
前面的歸一化方法都是從不同維度對輸入數據做歸一化,而weight norm則是對權重做歸一化。
Cosine Norm
拋棄了權重和輸入點積的計算方式,改用其他函數。
