詳解深度學習中的 Normalization,不只是 BN
本文作者Juliuszh,本文首發於知乎專欄【機器學習煉丹記】,AI 研習社獲其授權轉載。
深度神經網路模型訓練之難眾所周知,其中一個重要的現象就是 Internal Covariate Shift. Batch Norm 大法自 2015 年由 Google 提出之後,就成為深度學習必備之神器。自 BN 之後, Layer Norm / Weight Norm / Cosine Norm 等也橫空出世。本文從 Normalization 的背景講起,用一個公式概括 Normalization 的基本思想與通用框架,將各大主流方法一一對號入座進行深入的對比分析,並從參數和數據的伸縮不變性的角度探討 Normalization 有效的深層原因。
本文繼續沿襲上一個專題(Adam 那麼棒,為什麼還對 SGD 念念不忘 —— 一個框架看懂優化演算法)的寫作思路,先提煉一個通用的分析框架,然後再對號入座式地梳理各大主流演算法,便於我們分析比較。
目錄
1. 為什麼需要 Normalization
——深度學習中的 Internal Covariate Shift 問題及其影響
2. Normalization 的通用框架與基本思想
——從主流 Normalization 方法中提煉出的抽象框架
3. 主流 Normalization 方法梳理
——結合上述框架,將 BatchNorm / LayerNorm / WeightNorm / CosineNorm 對號入座,各種方法之間的異同水落石出。
4. Normalization 為什麼會有效?
——從參數和數據的伸縮不變性探討 Normalization 有效的深層原因。
以下是正文,enjoy.
1. 為什麼需要 Normalization
1.1 獨立同分布與白化
機器學習界的煉丹師們最喜歡的數據有什麼特點?竊以為,莫過於 「獨立同分布」 了,即independent and identically distributed,簡稱為i.i.d.獨立同分布並非所有機器學習模型的必然要求(比如 Naive Bayes 模型就建立在特徵彼此獨立的基礎之上,而 Logistic Regression 和 神經網路 則在非獨立的特徵數據上依然可以訓練出很好的模型),但獨立同分布的數據可以簡化常規機器學習模型的訓練、提升機器學習模型的預測能力,已經是一個共識。
因此,在把數據餵給機器學習模型之前,「白化(whitening)」 是一個重要的數據預處理步驟。白化一般包含兩個目的:
(1)去除特徵之間的相關性—> 獨立;
(2)使得所有特徵具有相同的均值和方差—> 同分布。
白化最典型的方法就是 PCA,可以參考閱讀 PCAWhitening(http://t.cn/R9xZyMG)。
1.2 深度學習中的 Internal Covariate Shift
深度神經網路模型的訓練為什麼會很困難?其中一個重要的原因是,深度神經網路涉及到很多層的疊加,而每一層的參數更新會導致上層的輸入數據分布發生變化,通過層層疊加,高層的輸入分布變化會非常劇烈,這就使得高層需要不斷去重新適應底層的參數更新。為了訓好模型,我們需要非常謹慎地去設定學習率、初始化權重、以及儘可能細緻的參數更新策略。
Google 將這一現象總結為 Internal Covariate Shift,簡稱 ICS. 什麼是 ICS 呢?@魏秀參 (http://t.cn/R8tNCtF)在一個回答(http://t.cn/RGJST79)中做出了一個很好的解釋:
大家都知道在統計機器學習中的一個經典假設是 「源空間(source domain)和目標空間(target domain)的數據分布(distribution)是一致的」。如果不一致,那麼就出現了新的機器學習問題,如 transfer learning / domain adaptation 等。而 covariate shift 就是分布不一致假設之下的一個分支問題,它是指源空間和目標空間的條件概率是一致的,但是其邊緣概率不同,即:對所有,
但是
大家細想便會發現,的確,對於神經網路的各層輸出,由於它們經過了層內操作作用,其分布顯然與各層對應的輸入信號分布不同,而且差異會隨著網路深度增大而增大,可是它們所能 「指示」 的樣本標記(label)仍然是不變的,這便符合了 covariate shift 的定義。由於是對層間信號的分析,也即是 「internal」 的來由。
1.3 ICS 會導致什麼問題?
簡而言之,每個神經元的輸入數據不再是 「獨立同分布」。
其一,上層參數需要不斷適應新的輸入數據分布,降低學習速度。
其二,下層輸入的變化可能趨向於變大或者變小,導致上層落入飽和區,使得學習過早停止。
其三,每層的更新都會影響到其它層,因此每層的參數更新策略需要儘可能的謹慎。
2. Normalization 的通用框架與基本思想
我們以神經網路中的一個普通神經元為例。神經元接收一組輸入向量
通過某種運算後,輸出一個標量值:
由於 ICS 問題的存在,x 的分布可能相差很大。要解決獨立同分布的問題,「理論正確」 的方法就是對每一層的數據都進行白化操作。然而標準的白化操作代價高昂,特別是我們還希望白化操作是可微的,保證白化操作可以通過反向傳播來更新梯度。
因此,以 BN 為代表的 Normalization 方法退而求其次,進行了簡化的白化操作。基本思想是:在將 x 送給神經元之前,先對其做平移和伸縮變換, 將 x 的分布規範化成在固定區間範圍的標準分布。
通用變換框架就如下所示:
我們來看看這個公式中的各個參數。
(1)μ 是平移參數(shift parameter),σ 是縮放參數(scale parameter)。通過這兩個參數進行 shift 和 scale 變換:
得到的數據符合均值為 0、方差為 1 的標準分布。
(2)b 是再平移參數(re-shift parameter),g 是再縮放參數(re-scale parameter)。將 上一步得到的進一步變換為:
最終得到的數據符合均值為 b、方差為的分布。
奇不奇怪?奇不奇怪?
說好的處理 ICS,第一步都已經得到了標準分布,第二步怎麼又給變走了?
答案是——為了保證模型的表達能力不因為規範化而下降。
我們可以看到,第一步的變換將輸入數據限制到了一個全局統一的確定範圍(均值為 0、方差為 1)。下層神經元可能很努力地在學習,但不論其如何變化,其輸出的結果在交給上層神經元進行處理之前,將被粗暴地重新調整到這一固定範圍。
沮不沮喪?沮不沮喪?
難道我們底層神經元人民就在做無用功嗎?
所以,為了尊重底層神經網路的學習結果,我們將規範化後的數據進行再平移和再縮放,使得每個神經元對應的輸入範圍是針對該神經元量身定製的一個確定範圍(均值為 b、方差為)。rescale 和 reshift 的參數都是可學習的,這就使得 Normalization 層可以學習如何去尊重底層的學習結果。
除了充分利用底層學習的能力,另一方面的重要意義在於保證獲得非線性的表達能力。Sigmoid 等激活函數在神經網路中有著重要作用,通過區分飽和區和非飽和區,使得神經網路的數據變換具有了非線性計算能力。而第一步的規範化會將幾乎所有數據映射到激活函數的非飽和區(線性區),僅利用到了線性變化能力,從而降低了神經網路的表達能力。而進行再變換,則可以將數據從線性區變換到非線性區,恢復模型的表達能力。
那麼問題又來了——
經過這麼的變回來再變過去,會不會跟沒變一樣?
不會。因為,再變換引入的兩個新參數 g 和 b,可以表示舊參數作為輸入的同一族函數,但是新參數有不同的學習動態。在舊參數中,x 的均值取決於下層神經網路的複雜關聯;但在新參數中,僅由 b 來確定,去除了與下層計算的密切耦合。新參數很容易通過梯度下降來學習,簡化了神經網路的訓練。
那麼還有一個問題——
這樣的 Normalization 離標準的白化還有多遠?
標準白化操作的目的是 「獨立同分布」。獨立就不說了,暫不考慮。變換為均值為 b、方差為的分布,也並不是嚴格的同分布,只是映射到了一個確定的區間範圍而已。(所以,這個坑還有得研究呢!)
3. 主流 Normalization 方法梳理
在上一節中,我們提煉了 Normalization 的通用公式:
對照於這一公式,我們來梳理主流的四種規範化方法。
3.1 Batch Normalization —— 縱向規範化
Batch Normalization 於 2015 年由 Google 提出,開 Normalization 之先河。其規範化針對單個神經元進行,利用網路訓練時一個 mini-batch 的數據來計算該神經元的均值和方差, 因而稱為 Batch Normalization。
其中 M 是 mini-batch 的大小。
按上圖所示,相對於一層神經元的水平排列,BN 可以看做一種縱向的規範化。由於 BN 是針對單個維度定義的,因此標準公式中的計算均為 element-wise 的。
BN 獨立地規範化每一個輸入維度,但規範化的參數是一個 mini-batch 的一階統計量和二階統計量。這就要求 每一個 mini-batch 的統計量是整體統計量的近似估計,或者說每一個 mini-batch 彼此之間,以及和整體數據,都應該是近似同分布的。分布差距較小的 mini-batch 可以看做是為規範化操作和模型訓練引入了雜訊,可以增加模型的魯棒性;但如果每個 mini-batch 的原始分布差別很大,那麼不同 mini-batch 的數據將會進行不一樣的數據變換,這就增加了模型訓練的難度。
因此,BN 比較適用的場景是:每個 mini-batch 比較大,數據分布比較接近。在進行訓練之前,要做好充分的 shuffle. 否則效果會差很多。
另外,由於 BN 需要在運行過程中統計每個 mini-batch 的一階統計量和二階統計量,因此不適用於 動態的網路結構 和 RNN 網路。不過,也有研究者專門提出了適用於 RNN 的 BN 使用方法,這裡先不展開了。
3.2 Layer Normalization —— 橫向規範化
層規範化就是針對 BN 的上述不足而提出的。與 BN 不同,LN 是一種橫向的規範化,如圖所示。它綜合考慮一層所有維度的輸入,計算該層的平均輸入值和輸入方差,然後用同一個規範化操作來轉換各個維度的輸入。
其中 i 枚舉了該層所有的輸入神經元。對應到標準公式中,四大參數 μ,σ,g,b 均為標量(BN 中是向量),所有輸入共享一個規範化變換。
LN 針對單個訓練樣本進行,不依賴於其他數據,因此可以避免 BN 中受 mini-batch 數據分布影響的問題,可以用於 小 mini-batch 場景、動態網路場景和 RNN,特別是自然語言處理領域。此外,LN 不需要保存 mini-batch 的均值和方差,節省了額外的存儲空間。
但是,BN 的轉換是針對單個神經元可訓練的——不同神經元的輸入經過再平移和再縮放後分布在不同的區間,而 LN 對於一整層的神經元訓練得到同一個轉換——所有的輸入都在同一個區間範圍內。如果不同輸入特徵不屬於相似的類別(比如顏色和大小),那麼 LN 的處理可能會降低模型的表達能力。
3.3 Weight Normalization —— 參數規範化
前面我們講的模型框架
中,經過規範化之後的 y 作為輸入送到下一個神經元,應用以 w 為參數的函數定義的變換。最普遍的變換是線性變換,即。
BN 和 LN 均將規範化應用於輸入的特徵數據 x,而 WN 則另闢蹊徑,將規範化應用於線性變換函數的權重 w,這就是 WN 名稱的來源。
具體而言,WN 提出的方案是,將權重向量 w 分解為向量方向和向量模 g 兩部分:
其中 v 是與 w 同維度的向量,是歐氏範數,因此是單位向量,決定了 w 的方向;g 是標量,決定了 w 的長度。由於,因此這一權重分解的方式將權重向量的歐氏範數進行了固定,從而實現了正則化的效果。
乍一看,這一方法似乎脫離了我們前文所講的通用框架?
並沒有。其實從最終實現的效果來看,異曲同工。我們來推導一下看。
對照一下前述框架:
我們只需令:
就完美地對號入座了!
回憶一下,BN 和 LN 是用輸入的特徵數據的方差對輸入數據進行 scale,而 WN 則是用 神經元的權重的歐氏範式對輸入數據進行 scale。雖然在原始方法中分別進行的是特徵數據規範化和參數的規範化,但本質上都實現了對數據的規範化,只是用於 scale 的參數來源不同。
另外,我們看到這裡的規範化只是對數據進行了 scale,而沒有進行 shift,因為我們簡單地令。但事實上,這裡留下了與 BN 或者 LN 相結合的餘地——那就是利用 BN 或者 LN 的方法來計算輸入數據的均值 μ。
WN 的規範化不直接使用輸入數據的統計量,因此避免了 BN 過於依賴 mini-batch 的不足,以及 LN 每層唯一轉換器的限制,同時也可以用於動態網路結構。
3.4 Cosine Normalization —— 餘弦規範化
Normalization 還能怎麼做?
我們再來看看神經元的經典變換。
對輸入數據 x 的變換已經做過了,橫著來是 LN,縱著來是 BN。
對模型參數 w 的變換也已經做過了,就是 WN。
好像沒啥可做的了。
然而天才的研究員們盯上了中間的那個點,對,就是
他們說,我們要對數據進行規範化的原因,是數據經過神經網路的計算之後可能會變得很大,導致數據分布的方差爆炸,而這一問題的根源就是我們的計算方式——點積,權重向量 w 和 x 特徵數據向量 的點積。向量點積是無界(unbounded)的啊!
那怎麼辦呢?我們知道向量點積是衡量兩個向量相似度的方法之一。哪還有沒有其他的相似度衡量方法呢?有啊,很多啊!夾角餘弦就是其中之一啊!而且關鍵的是,夾角餘弦是有確定界的啊,[-1, 1] 的取值範圍,多麼的美好!彷彿看到了新的世界!
於是,Cosine Normalization 就出世了。他們不處理權重向量 w,也不處理特徵數據向量 x ,就改了一下線性變換的函數:
其中 θ 是 w 和 x 的夾角。然後就沒有然後了,所有的數據就都是 [-1, 1] 區間範圍之內的了!
不過,回過頭來看,CN 與 WN 還是很相似的。我們看到上式中,分子還是 w 和 x 的內積,而分母則可以看做用 w 和 x 二者的模之積進行規範化。對比一下 WN 的公式:
一定程度上可以理解為,WN 用 權重的模對輸入向量進行 scale,而 CN 在此基礎上用輸入向量的模對輸入向量進行了進一步的 scale.
CN 通過用餘弦計算代替內積計算實現了規範化,但成也蕭何敗蕭何。原始的內積計算,其幾何意義是 輸入向量在權重向量上的投影,既包含 二者的夾角信息,也包含 兩個向量的 scale 信息。去掉 scale 信息,可能導致表達能力的下降,因此也引起了一些爭議和討論。具體效果如何,可能需要在特定的場景下深入實驗。
現在,BN, LN, WN 和 CN 之間的來龍去脈是不是清楚多了?
4. Normalization 為什麼會有效?
我們以下面這個簡化的神經網路為例來分析。
4.1 Normalization 的權重伸縮不變性
權重伸縮不變性(weight scale invariance)指的是,當權重 W 按照常量 λ 進行伸縮時,得到的規範化後的值保持不變,即:
其中。
上述規範化方法均有這一性質,這是因為,當權重 W 伸縮時,對應的均值和標準差均等比例伸縮,分子分母相抵。
權重伸縮不變性可以有效地提高反向傳播的效率。
由於
因此,權重的伸縮變化不會影響反向梯度的 Jacobian 矩陣,因此也就對反向傳播沒有影響,避免了反向傳播時因為權重過大或過小導致的梯度消失或梯度爆炸問題,從而加速了神經網路的訓練。
權重伸縮不變性還具有參數正則化的效果,可以使用更高的學習率。
由於
因此,下層的權重值越大,其梯度就越小。這樣,參數的變化就越穩定,相當於實現了參數正則化的效果,避免參數的大幅震蕩,提高網路的泛化性能。
4.2 Normalization 的數據伸縮不變性
數據伸縮不變性(data scale invariance)指的是,當數據 x 按照常量 λ 進行伸縮時,得到的規範化後的值保持不變,即:
其中。
數據伸縮不變性僅對 BN、LN 和 CN 成立。因為這三者對輸入數據進行規範化,因此當數據進行常量伸縮時,其均值和方差都會相應變化,分子分母互相抵消。而 WN 不具有這一性質。
數據伸縮不變性可以有效地減少梯度彌散,簡化對學習率的選擇。
對於某一層神經元而言,展開可得
每一層神經元的輸出依賴於底下各層的計算結果。如果沒有正則化,當下層輸入發生伸縮變化時,經過層層傳遞,可能會導致數據發生劇烈的膨脹或者彌散,從而也導致了反向計算時的梯度爆炸或梯度彌散。
加入 Normalization 之後,不論底層的數據如何變化,對於某一層神經元而言,其輸入永遠保持標準的分布,這就使得高層的訓練更加簡單。從梯度的計算公式來看:
數據的伸縮變化也不會影響到對該層的權重參數更新,使得訓練過程更加魯棒,簡化了對學習率的選擇。
參考文獻
[1] Sergey Ioffe and Christian Szegedy. Accelerating Deep Network Training by Reducing Internal Covariate Shift.(https://arxiv.org/abs/1502.03167)
[2] Jimmy L. Ba, Jamie R. Kiros, Geoffrey E. Hinton. [1607.06450] Layer Normalization.(https://arxiv.org/abs/1607.06450)
[3] Tim Salimans, Diederik P. Kingma. A Simple Reparameterization to Accelerate Training of Deep Neural Networks.(https://arxiv.org/abs/1602.07868)
[4] Chunjie Luo, Jianfeng Zhan, Lei Wang, Qiang Yang. Using Cosine Similarity Instead of Dot Product in Neural Networks.(https://arxiv.org/abs/1702.05870)
本文在寫作過程中,參考了以下各位的回答,特此致謝。
@魏秀參 的回答: 深度學習中 Batch Normalization 為什麼效果好?(http://t.cn/RGJST79)
@孔濤 的回答: 深度學習中 Batch Normalization 為什麼效果好?(http://t.cn/R8tmxMJ)
@王峰 的回答: 深度學習中 Batch Normalization 為什麼效果好?(http://t.cn/R8tm6Dy)
@lqfarmer 的回答: Weight Normalization 相比 batch Normalization 有什麼優點呢?(http://t.cn/R8tmKXx)
@Naiyan Wang 的回答: Batch normalization 和 Instance normalization 的對比?(http://t.cn/R8tmQzx)
@YJango 的文章: YJango 的 Batch Normalization-- 介紹(http://t.cn/RKH7G8Z)
作者簡介
@Juliuszh
PhD 畢業於 THU 計算機系。
現在 Tencent AI Lab 從事機器學習和個性化推薦研究與 AI 平台開發工作。
專欄簡介
機器學習煉丹記
※如何用 Python 和深度神經網路發現即將流失的客戶?
※FCN 的簡單實現
TAG:AI研習社 |