深度學習加速策略BN、WN和LN的聯繫與區別,各自的優缺點和適用的場景?

BN、WN、LN分別是Batch Normalization、Weight Normalization和Layer Normalization的縮寫


Weight Normalization和Layer Normalization 都是Batch Normalization的變體。Batch Normalization和Weight Normalization都是屬於參數重寫(Reparameterization)的方法,Layer Normalization不是。

1、Weight Normalization與Batch Normalization對比

Weight Normalization和Batch Normalization都屬於參數重寫(Reparameterization)的方法,只是採用的方式不同,Weight Normalization是對網路權值W進行normalization(L2 norm),因此也稱為Weight Normalization;Batch Normalization是對網路某一層輸入數據進行normalization。。Weight Normalization相比Batch Normalization有以下三點優勢:

1、Weight Normalization通過重寫深度學習網路的權重W的方式來加速深度學習網路參數收斂,沒有引入minbatch的依賴,適用於RNN(LSTM)網路(Batch Normalization不能直接用於RNN,進行normalization操作,原因在於:1、RNN處理的Sequence是變長的;2、RNN是基於time step計算,如果直接使用Batch Normalization處理,需要保存每個time step下,mini btach的均值和方差,效率低且占內存)。

2、Batch Normalization基於一個mini batch的數據計算均值和方差,而不是基於整個Training set來做,相當於進行梯度計算式引入雜訊。因此,Batch Normalization不適用於對雜訊敏感的強化學習、生成模型(Generative model:GAN,VAE)使用。相反,Weight Normalization對通過標量g和向量v對權重W進行重寫,重寫向量v是固定的,因此,基於Weight Normalization的Normalization可以看做比Batch Normalization引入更少的雜訊。

3、不需要額外的存儲空間來保存mini batch的均值和方差,同時實現Weight Normalization時,對深度學習網路進行正向信號傳播和反向梯度計算帶來的額外計算開銷也很小。因此,要比採用Batch Normalization進行normalization操作時,速度快。

但是, Weight Normalization不具備Batch Normalization把網路每一層的輸出Y固定在一個變化範圍的作用。因此,採用Weight Normalization進行Normalization時需要特別注意參數初始值的選擇。

2、Layer Normalization與Batch Normalization對比:

BN針對一個minibatch的輸入樣本,計算均值和方差,基於計算的均值和方差來對某一層神經網路的輸入X中每一個case進行歸一化操作。但BN有兩個明顯不足:1、高度依賴於mini-batch的大小,實際使用中會對mini-Batch大小進行約束,不適合類似在線學習(mini-batch為1)情況;2、不適用於RNN網路中normalize操作:BN實際使用時需要計算並且保存某一層神經網路mini-batch的均值和方差等統計信息,對於對一個固定深度的前向神經網路(DNN,CNN)使用BN,很方便;但對於RNN來說,sequence的長度是不一致的,換句話說RNN的深度不是固定的,不同的time-step需要保存不同的statics特徵,可能存在一個特殊sequence比其的sequence長很多,這樣training時,計算很麻煩。但LN可以有效解決上面這兩個問題。

LN適用於LSTM的加速,但用於CNN加速時並沒有取得比BN更好的效果。

針對LN、BN和WN更多實現細節,可以掃描我的頭像二維碼 、或微信搜索公眾號「深度學習與NLP」 ,添加關注後,通過往期內容查看。希望對大家有用。


normalization按大類分可以分三類,一是對參數做歸一化,二是對輸出特徵做歸一化。

歸一化的手段可以多種多樣,最基本的是instance級別的 l2 norm,也可以是batchnorm,也可以是其他的。

bn是使用batchnorm手段的 特徵歸一化。目前是訓練深度網路的必備利器

ln是使用一種類似bn的方法對特徵歸一化,在rnn模型里效果較好

wn是使用l2norm的參數歸一化

此外,還有一種cosine norm的方法,同時對參數和特徵做l2norm歸一化,似乎效果也不錯

最後,對參數做batchnorm不知道會怎麼樣


我的天。。後面兩個聽起來好厲害


深度神經網路模型訓練之難眾所周知,其中一個重要的現象就是 Internal Covariate Shift. Batch Norm 大法自 2015 年由Google 提出之後,就成為深度學習必備之神器。自 BN 之後, Layer Norm / Weight Norm / Cosine Norm 等也橫空出世。在我的專欄文章 【知乎專欄:機器學習煉丹記】詳解深度學習中的Normalization,不只是BN 中,從 Normalization 的背景講起,用一個公式概括 Normalization 的基本思想與通用框架,將各大主流方法一一對號入座進行深入的對比分析,並從參數和數據的伸縮不變性的角度探討了 Normalization 有效的深層原因。

這裡摘錄文章的第 3 部分,作為對這個問題的直接回答。

在 專欄文章 詳解深度學習中的Normalization,不只是BN 第2部分中,我們提煉了 Normalization 的通用公式:

h=fleft(old{g}cdotfrac{old{x}-old{mu}}{old{sigma}}+old{b}
ight)

對照於這一公式,我們來梳理主流的四種規範化方法。

3.1 Batch Normalization —— 縱向規範化

Batch Normalization 於2015年由 Google 提出,開 Normalization 之先河。其規範化針對單個神經元進行,利用網路訓練時一個 mini-batch 的數據來計算該神經元 x_i 的均值和方差,因而稱為 Batch Normalization。

mu_i = frac{1}{M}sum{x_i}, quad sigma_i= sqrt{frac{1}{M}sum{(x_i-mu_i)^2}+epsilon }

其中 M 是 mini-batch 的大小。

按上圖所示,相對於一層神經元的水平排列,BN 可以看做一種縱向的規範化。由於 BN 是針對單個維度定義的,因此標準公式中的計算均為 element-wise 的。

BN 獨立地規範化每一個輸入維度 x_i ,但規範化的參數是一個 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 是一種橫向的規範化,如圖所示。它綜合考慮一層所有維度的輸入,計算該層的平均輸入值和輸入方差,然後用同一個規範化操作來轉換各個維度的輸入。

mu = sum_i{x_i}, quad sigma= sqrt{sum_i{(x_i-mu)^2}+epsilon }

其中 i 枚舉了該層所有的輸入神經元。對應到標準公式中,四大參數 old{mu}, old{sigma}, old{g}, old{b} 均為標量(BN中是向量),所有輸入共享一個規範化變換。

LN 針對單個訓練樣本進行,不依賴於其他數據,因此可以避免 BN 中受 mini-batch 數據分布影響的問題,可以用於 小mini-batch場景、動態網路場景和 RNN,特別是自然語言處理領域。此外,LN 不需要保存 mini-batch 的均值和方差,節省了額外的存儲空間。

但是,BN 的轉換是針對單個神經元可訓練的——不同神經元的輸入經過再平移和再縮放後分布在不同的區間,而 LN 對於一整層的神經元訓練得到同一個轉換——所有的輸入都在同一個區間範圍內。如果不同輸入特徵不屬於相似的類別(比如顏色和大小),那麼 LN 的處理可能會降低模型的表達能力。

3.3 Weight Normalization —— 參數規範化

前面我們講的模型框架 h=fleft(old{g}cdotfrac{old{x}-old{mu}}{old{sigma}}+old{b}
ight)中,經過規範化之後的old{y} 作為輸入送到下一個神經元,應用以 old{w} 為參數的f_old{w}(cdot) 函數定義的變換。最普遍的變換是線性變換,即 f_old{w}(old{x})=old{w}cdotold{x}.

BN 和 LN 均將規範化應用於輸入的特徵數據 old{x} ,而 WN 則另闢蹊徑,將規範化應用於線性變換函數的權重 old{w} ,這就是 WN 名稱的來源。

具體而言,WN 提出的方案是,將權重向量 old{w} 分解為向量方向 hat{old{v}} 和向量模 g 兩部分

{old{w}} = gcdothat{old{v}} = gcdotfrac{old{v}}{old{||v||}}

其中 old{v} 是與 old{w} 同維度的向量, old{||v||}是歐氏範數,因此hat{old{v}} 是單位向量,決定了 old{w} 的方向;g 是標量,決定了 old{w} 的長度。由於 ||{old{w}}|| equiv |g| ,因此這一權重分解的方式將權重向量的歐氏範數進行了固定,從而實現了正則化的效果。

乍一看,這一方法似乎脫離了我們前文所講的通用框架?

並沒有。其實從最終實現的效果來看,異曲同工。我們來推導一下看。  f_old{w}(WN(old{x}))=old{w}cdot WN(old{x}) = gcdotfrac{old{v}}{old{||v||}} cdotold{x} \= old{v}cdot gcdotfrac{old{x}}{old{||v||}}=f_old{v}(gcdotfrac{old{x}}{old{||v||}})

對照一下前述框架:

h=fleft(old{g}cdotfrac{old{x}-old{mu}}{old{sigma}}+old{b}
ight)

我們只需令:

old{sigma} = old{||v||}, quad old{mu}=0, quad old{b}=0

就完美地對號入座了!

回憶一下,BN 和 LN 是用輸入的特徵數據的方差對輸入數據進行 scale,而 WN 則是用 神經元的權重的歐氏範式對輸入數據進行 scale。雖然在原始方法中分別進行的是特徵數據規範化和參數的規範化,但本質上都實現了對數據的規範化,只是用於 scale 的參數來源不同。

另外,我們看到這裡的規範化只是對數據進行了 scale,而沒有進行 shift,因為我們簡單地令 old{mu}=0. 但事實上,這裡留下了與 BN 或者 LN 相結合的餘地——那就是利用 BN 或者 LN 的方法來計算輸入數據的均值 old{mu}

WN 的規範化不直接使用輸入數據的統計量,因此避免了 BN 過於依賴 mini-batch 的不足,以及 LN 每層唯一轉換器的限制,同時也可以用於動態網路結構。

3.4 Cosine Normalization —— 餘弦規範化

Normalization 還能怎麼做?

我們再來看看神經元的經典變換 f_old{w}(old{x})=old{w}cdotold{x}.

對輸入數據 old{x} 的變換已經做過了,橫著來是 LN,縱著來是 BN。

對模型參數 old{w} 的變換也已經做過了,就是 WN。

好像沒啥可做的了。

然而天才的研究員們盯上了中間的那個點,對,就是cdot

他們說,我們要對數據進行規範化的原因,是數據經過神經網路的計算之後可能會變得很大,導致數據分布的方差爆炸,而這一問題的根源就是我們的計算方式——點積,權重向量 old{w} 和 特徵數據向量 old{x} 的點積。向量點積是無界(unbounded)的啊!

那怎麼辦呢?我們知道向量點積是衡量兩個向量相似度的方法之一。哪還有沒有其他的相似度衡量方法呢?有啊,很多啊!夾角餘弦就是其中之一啊!而且關鍵的是,夾角餘弦是有確定界的啊,[-1, 1] 的取值範圍,多麼的美好!彷彿看到了新的世界!

於是,Cosine Normalization 就出世了。他們不處理權重向量 old{w} ,也不處理特徵數據向量 old{x} ,就改了一下線性變換的函數:

f_old{w}(old{x})=cos 	heta = frac{old{w}cdotold{x}}{old{||w||}cdotold{||x||}}

其中 	hetaold{w}old{x} 的夾角。然後就沒有然後了,所有的數據就都是 [-1, 1] 區間範圍之內的了!

不過,回過頭來看,CN 與 WN 還是很相似的。我們看到上式中,分子還是 old{w}old{x} 的內積,而分母則可以看做用 old{w}old{x} 二者的模之積進行規範化。對比一下 WN 的公式:

 f_old{w}(WN(old{x}))=f_old{v}(gcdotfrac{old{x}}{old{||v||}})

一定程度上可以理解為,WN 用 權重的模 old{||v||} 對輸入向量進行 scale,而 CN 在此基礎上用輸入向量的模 old{||x||} 對輸入向量進行了進一步的 scale.

CN 通過用餘弦計算代替內積計算實現了規範化,但成也蕭何敗蕭何。原始的內積計算,其幾何意義是 輸入向量在權重向量上的投影,既包含 二者的夾角信息,也包含 兩個向量的scale信息。去掉scale信息,可能導致表達能力的下降,因此也引起了一些爭議和討論。具體效果如何,可能需要在特定的場景下深入實驗。

現在,BN, LN, WN 和 CN 之間的來龍去脈是不是清楚多了?


歡迎移步閱讀全文:【機器學習煉丹記】詳解深度學習中的Normalization,不只是BN

1. 為什麼需要 Normalization

——深度學習中的 Internal Covariate Shift 問題及其影響

2. Normalization 的通用框架與基本思想

——從主流 Normalization 方法中提煉出的抽象框架

3. 主流 Normalization 方法梳理

——結合上述框架,將 BatchNorm / LayerNorm / WeightNorm / CosineNorm 對號入座,各種方法之間的異同水落石出。

4. Normalization 為什麼會有效?

——從參數和數據的伸縮不變性探討Normalization有效的深層原因。


作者簡介:

@Juliuszh

PhD 畢業於 THU 計算機系。

現在 Tencent AI Lab 從事機器學習和個性化推薦研究與 AI 平台開發工作。

歡迎關注我的微信公眾號 Julius-AI 一起交流。

專欄簡介:

機器學習煉丹記

一個機器學習從業者的思考和札記。囿於才疏學淺,難免有所謬誤,還望不吝指正。


推薦閱讀:

[5] Python注釋
這段MIPS程序的CPI如何計算?
帶你了解機器學習(一): 機器學習中的「哲學」
《三體》中人列計算機是否有可能性?
操作系統的時間函數是怎麼實現的?

TAG:自然語言處理 | 計算機科學 | 深度學習DeepLearning | 強化學習ReinforcementLearning | 生成對抗網路GAN |