深度學習中的Normalization

思想概述

  深度學習算法,尤其是在CV上一般都需要對數據做歸一化,大家很多人都慣於如此,但是搞清楚其中的原理也是必要的。
  事實上歸一化操作從機器學習的研究開始就非常常用了,但是那個時候主要是爲了解決不同特徵的取值不在同一個量級,這樣損失函數就會有所側重,在各個特徵方向上的學習率也就難以統一。這裏的歸一化就可以是根據特徵的最大值和最小值把屬性映射到[0,1][0,1]的區間,x=xxminxmaxxminx'=\frac{x-x_{min}}{x_{max}-x_{min}}。或者通過一種叫Z-Score的方式,將數據映射爲均值0,標準差爲1的分佈。z=xμσz=\frac{x- \mu }{\sigma}。這樣使得數據在不同特徵上的尺度大致相近,數據分佈也就會比歸一化之前更圓。
歸一化對數據分佈的變動,圖片來源於Ng課程筆記
  還需要清楚的一點就是,深度學習的基礎思想就是通過卷積網絡擬合一個複雜的函數,這個函數其實就是數據的分佈。但是這個分佈可能非常複雜,甚至於說,在訓練的時候,使用數據批量(batch)輸入,但是很可能整個批量的數據和整體分佈式具有差異的,而不同批量的數據之間也是具有差異的,上一個批量代表的分佈和下一個批量代表的分佈也可能具有巨大差異。這樣就會給學習過程帶來巨大的困難。此外,經過神經網絡一層層的運算,分佈也在變化,如果這個變化的分佈也會導致差異的累積,這個現象就稱爲Internal Convariate Shift,具體表現就是不同批量的數據不再是獨立同分布。
  解決這個問題的方式有很多,在歸一化之前的策略是使用較小的學習率,和小心初始化參數,歸結起來都是治標不治本。還有對數據做白化操作的,但是白化操作的代價高昂,而且不可微。而歸一化操作實際上可以看做是白化操作的簡化操作。

通用框架

  深度學習中的所有的歸一化操作,可以通過一個通用框架來涵蓋,y=f(γxμσ+β)y=f\left(\gamma ·\frac{x-\mu}{\sigma} + \beta \right),這個公式中,可以看到首先還是對x做了一個Z-Score,使得數據的分佈映射爲0均值,1標準差。這個操作可以爲大部分數據映射到激活函數的非飽和去奠定了基礎。這也是爲什麼使用了歸一化之後算法不容易梯度消失和彌散的原因。
  但是在這標準化之後又重新對數據縮放了一次,乘以再縮放係數γ\gamma,然後加上再平移參數β\beta,可以將數據再次映射回一個一致的分佈。這樣數據的新的均值僅有再平移參數β\beta決定,減弱了不同層之間的聯繫,而網絡不同層之間的聯繫,是難以學習的一個重要原因。在舊的模型中,數據的均值取決於下層神經網絡的複雜關聯(條件概率),dropout也是打破這種關聯的重要手段。同時這種再縮放平移可以使得模型更好的學習數據的整體特徵,而不是徹底改變分佈之後的特徵,同時又能對數據的分佈起到約束作用,而不是使其任意變化。
  由於一系列的原因,最終總的歸一化操作使得算法更加魯棒,簡化了對學習率的選擇。
  如果對比傳統機器學習的歸一化,數據應該是在輸入的時候歸一化,也就是在下一層輸入之前歸一化,但是事實上歸一化都是在激活層之前,猜想重要的原因就是上面提到的能夠讓激活函數容易維持在非飽和區。
  總結起來,感覺歸一化和變分自編碼器中的再參數化技巧極其相似,說不定再努力一把,以下具體的歸一化算法可能就是變分自編碼器的作者提出的。

BatchNorm

  歸一化是一個batch一個batch計算的,所以得名,但是要注意做歸一化不是針對batch的。直接看算法。
BN算法圖,圖片來源於網絡
  首先就是對數據進行均值和方差了,圖片裏的計算均值和方差只突出了一個批量,事實上如果一個數據的輸入是(N,C,H,W)(N,C,H,W),則計算均值的時候是對N,H,W維度上都計算均值的,也就是算出來的均值實際上是把這三個維度加起來,最後就只剩下了C了,均值和方差一起就是2C個參數。
  接下來就是使用計算出來的均值和方差對數據做Z-Score歸一化了,減均值除標準差,這裏分母加上ε\varepsilon主要是爲了數值穩定,防止分母爲0或者極其接近0。同樣是每一個通道使用各自通道的參數操作。
  最後就是再放縮平移了,使用可學習參數γ\gammaβ\beta對歸一化的數據再做一次映射,作用,之前也都說過了。
  再有就是預測和訓練過程的差異了,預測的時候,數據一般沒有批量這個概念,但是使用單個數據的均值和方差去映射數據又過於不可靠,所以預測的時候,仍然需要對數據進行映射,這個時候就只能保存訓練時候的結果了,也就是上面提到的2C個均值和方差,這個均值和方差也就是所有訓練數據累積的計算結果,實現的時候一般採用的都是滑動均值。這裏的歸一化都是可以使用反向傳播的,具體公式推導就不寫啦。
  總結一下特點,和框架裏的特點會有重複
優點:

  1. 使用BN的話可以使用大的學習率配上較大的學習率衰減,不用很小心的調參,導致更快的收斂
  2. bn降低了數據之間的絕對差異,有去相關的性質,更多的考慮了相對差異性,因此更適合分類
  3. BN對每一個batch的統計量進行估計,要求數據應該是同分布的,分佈差距較小的可以看做是爲模型訓練引入了噪聲, 增加模型的魯棒性,分佈差別很大,則會增加模型的訓練難度
  4. 一定程度上緩解了梯度消失,加速了模型收斂,降低了神經網絡模型訓練調參的複雜度
  5. BN訓練過程中由於使用mini-batch的mean/variance每次都不同,引入了隨機噪聲,在一定程度上對模型起到了正則化的效果

缺點:

  1. 每次是在一個batch上計算均值、方差,依賴batch大小的選取
    • 如果batch size太小,則計算的均值、方差不足以代表整個數據分佈。
    • batch size太大:會超過內存容量;需要跑更多的epoch,導致總訓練時間變長
  2. 每個運行過程需要計算統計量,因此不適用於動態的網絡結果和RNN
  3. BN的實現是針對單卡的,多卡的話就需要對同一個batch的數據估計量進行同步,技術細節比較複雜

LayerNorm

  在序列數據中,可能每個數據的長度都不一樣,所代表的特徵也不一樣,這個時候對數據整體求個均值就不那麼具有代表性,所以BN在序列數據的網絡上就效果不太好。LayerNorm就是爲了解決這個問題。不需要對每個數據也就是Batch維度上求統計量了,數據仍然認爲是(N,C,H,W)(N,C,H,W),此時不對N求統計量了,對剩下三個維度求。對通道求均值就意味着對該層網絡所有的神經元都求了均值。但是不對batch的樣本數量N求,意味着LayerNorm可以適應動態數據和小Batch的情況。甚至單條數據就可以歸一化。
  LN是一種橫向的規範化,思路是綜合考慮一層所有維度的輸入,計算深度網絡的某一層的所有神經元的輸入的輸入均值和方差,然後用同一個規範化操作來轉換各個維度的輸入,所有輸入共享一個規範變化,避免了受batch數據分佈影響的問題,可以用於小batch場景,動態網絡和RNN。但是缺點就是在於對所有的輸入共享同一個規劃變化,很難適應所有的數據。
  估計量計算公式:
均值計算公式

方差計算公式

InstanceNorm

  常見於生成模型之中,各個通道的均值和方差會影響最終圖像生成的風格,所以求放棄對通道求均值,只在單個圖像的像素之上做歸一化。
  估計量計算公式:
在這裏插入圖片描述
在這裏插入圖片描述

GroupNorm

  BN在小批量上效果不佳,而圖像分割這類問題,因爲使用顯存較大,基本都是小批量操作,還想使用歸一化,這個時候就需要在LN和BN之間找尋一個折中。在通道維度,先定義組的概念,然後再組內做歸一化,與批量的N脫鉤。但是也不是想LN那樣對所有的通道求統計量,也不是BN那樣不對通道求統計量。
  一共CC個通道,分成GG個組,每組可以分C/GC/G個通道,在每個組內求統計量,公式如下:
在這裏插入圖片描述
在這裏插入圖片描述
  以上幾種方法都是對輸入的特徵數據X做的歸一化變換,在我們的整體框架中,除了特徵數據x做變換,還可以在特徵映射上做文章,使用線性變換,則需要對變換的數據乘以一個權重W,如果對權重W做文章的話就能得到Weight Normalization。還可以不適用線性變換,可以使用一個權重矩陣W和特徵數據X之間做餘弦度量,得到Cosine Normalization。但是這些使用的不是特別多,這裏不過多贅述。
  最後放一張幾個特徵變換的示意圖說明一下這幾種歸一化的差別。圖片來自於論文截圖。下圖中把HW放在一個維度,然後藍色的部分表示求統計量的方式。
在這裏插入圖片描述
  內容很多,僅挑重點的寫了,後面會根據情況再做補充。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章