深度學(xué)習(xí)各種 Normalization 方法小結(jié)
目前深度學(xué)習(xí)已經(jīng)徹底改變了很多研究領(lǐng)域,如自然語言處理、計(jì)算機(jī)視覺等。深度學(xué)習(xí)當(dāng)然涉及訓(xùn)練精心設(shè)計(jì)的深度神經(jīng)網(wǎng)絡(luò),而各種設(shè)計(jì)會影響這些深度網(wǎng)絡(luò)的訓(xùn)練機(jī)制。其中一些設(shè)計(jì)包括,
網(wǎng)絡(luò)中使用的網(wǎng)絡(luò)層類型,例如卷積層、循環(huán)層等,以及網(wǎng)絡(luò)應(yīng)該有多少層?
應(yīng)該使用什么樣的歸一化層?
待優(yōu)化的損失函數(shù)應(yīng)該是什么?
這些設(shè)計(jì)主要取決于我們試圖解決的基本任務(wù),并且需要對我們手頭不同選項(xiàng)有更深入的了解。這里我們主要關(guān)注第 2 點(diǎn),即深度學(xué)習(xí)中的不同 Normalization 層。
本文將介紹以下 Normalization 方法,
Batch Normalization
Weight Normalization
Layer Normalization
Group Normalization
Instance Normalization
Weight Standarization
1為什么要 Normalization
在深度神經(jīng)網(wǎng)絡(luò)中,存在一種內(nèi)部協(xié)變偏移(internal covariate shift)現(xiàn)象,它是由于訓(xùn)練過程中不斷變化的網(wǎng)絡(luò)參數(shù)導(dǎo)致網(wǎng)絡(luò)各層的輸入分布發(fā)生變化。
例如,輸入層中某些具有較高數(shù)值的特征可能會起到主導(dǎo)作用,從而在網(wǎng)絡(luò)中產(chǎn)生偏差,即只有這些特征對訓(xùn)練結(jié)果有貢獻(xiàn)。
Internal Covariate Shift簡稱 ICS,是由于訓(xùn)練過程中網(wǎng)絡(luò)參數(shù)的變化引起的網(wǎng)絡(luò)激活分布的變化。
網(wǎng)絡(luò)中的每一層的參數(shù)更新會導(dǎo)致本層的激活輸出的分布發(fā)生變化,也就是后面層的輸入的分布發(fā)生變化。而深度神經(jīng)網(wǎng)絡(luò)往往涉及到很多層的疊加,通過層層疊加,會引發(fā)后面層非常劇烈的變化,這就給深度模型的訓(xùn)練帶來了巨大挑戰(zhàn)。
由于上述原因,引入了稱為 normalization 的概念來解決這些問題。
Normalization 有很多優(yōu)點(diǎn),包括
減少內(nèi)部協(xié)變偏移以改善訓(xùn)練;
將每個特征縮放到相似的范圍以防止或減少網(wǎng)絡(luò)中的偏差;
通過防止權(quán)重在整個地方爆炸并將它們限制在特定范圍內(nèi)來加速優(yōu)化過程;
通過輔助正則化減少網(wǎng)絡(luò)中的過擬合。
Normalization 也可以結(jié)合概率論來解釋。一般來說,機(jī)器學(xué)習(xí)中的方法比較偏愛獨(dú)立同分布的數(shù)據(jù)。當(dāng)然并不是所有算法都有這個要求,但獨(dú)立同分布的數(shù)據(jù)往往可以簡化一般模型的訓(xùn)練,提升模型的預(yù)測能力。

在把數(shù)據(jù)輸入模型之前,對其經(jīng)過白化(whitening)處理是一個不錯的預(yù)處理步驟。
比如上圖(左)的數(shù)據(jù),先經(jīng)過零均值化以及去相關(guān)性操作,得到中間的形式,各個特征相互獨(dú)立;再讓所有特征具有單位標(biāo)準(zhǔn)差,最終得到獨(dú)立同分布的數(shù)據(jù)。
但深度學(xué)習(xí)中往往不直接使用白化操作,白化中間需要用到 PCA。如果對輸入數(shù)據(jù)作一次 PCA,那也僅僅是針對線性模型,但如果針對神經(jīng)網(wǎng)絡(luò)中的中間每一層在激活后再使用白化,那計(jì)算代價太過高昂。
那怎么辦呢?不妨模仿白化,但可以作一些簡化,比如不考慮去相關(guān)性,而是對各層的激活輸出在一定范圍內(nèi)作標(biāo)準(zhǔn)化處理,再加一定的縮放和偏移。這里的操作范圍可以不同,于是就有了一堆 Normalization 方法。
2Batch Normalization

Batch Normalization 側(cè)重于標(biāo)準(zhǔn)化任何特定層的輸入(即來自前一層的激活)。
下圖左邊網(wǎng)絡(luò)中沒有 BN 層,右邊網(wǎng)絡(luò)中在隱藏層后加入了 BN 層,即對影藏層的激活在小批次上作 Normalization。

標(biāo)準(zhǔn)化輸入意味著網(wǎng)絡(luò)中任何層的輸入都應(yīng)該近似零均值以及單位方差。簡單來說,BN 層通過減去當(dāng)前小批量中的輸入均值并除以標(biāo)準(zhǔn)差來變換當(dāng)前小批量中的每個輸入。
但是每一層不需要期望具有零均值和單位方差的輸入,相反,模型可能在其他均值和方差的情況下表現(xiàn)更好。因此,BN 層還引入了兩個可學(xué)習(xí)的參數(shù)
整個層操作如下。它接受輸入
輸入:一個 mini-batch 上
待學(xué)習(xí)參數(shù):
輸出:
mini-batch 均值
mini-batch 方差
標(biāo)準(zhǔn)化
縮放和偏移
那么 BN 到底是如何幫助神經(jīng)網(wǎng)絡(luò)訓(xùn)練呢?直觀地說,在梯度下降中,網(wǎng)絡(luò)根據(jù)任何層的當(dāng)前輸入計(jì)算梯度,并在梯度方向上更新權(quán)重。但是由于這些層一個接一個地堆疊起來,任何特定層的輸入數(shù)據(jù)分布會因?yàn)榍耙粚訖?quán)重的輕微更新而發(fā)生很大變化,因此當(dāng)前的梯度并不能為網(wǎng)絡(luò)提供最優(yōu)更新。
而 BN 將特定層的輸入數(shù)據(jù)(即來自前一層的激活)的分布作統(tǒng)一校正,這有助于網(wǎng)絡(luò)為權(quán)重更新產(chǎn)生更好的梯度。因此,BN 通常提供非常穩(wěn)定且高效的訓(xùn)練制度。
下面看一個隱藏層有 3 個神經(jīng)元的示例,批次大小為

總結(jié)一下:簡而言之,BN 使得梯度更具預(yù)測性,從而有效改善網(wǎng)絡(luò)訓(xùn)練。
下面,讓我們看看 BN 的一些優(yōu)點(diǎn):
BN 加速深度神經(jīng)網(wǎng)絡(luò)的訓(xùn)練。
對于每個輸入小批量,我們計(jì)算不同的統(tǒng)計(jì)量,這引入了某種正則化。正則化技術(shù)起到在訓(xùn)練期間限制深度神經(jīng)網(wǎng)絡(luò)復(fù)雜度的作用。
每個小批量都有不同的小分布,這些小分布之間的變化稱為內(nèi)部協(xié)變偏移,BN 被認(rèn)為消除了這種現(xiàn)象。
BN 對通過網(wǎng)絡(luò)的梯度流也提供了有利影響:它減少了梯度對參數(shù)尺度或其初始值的依賴性,從而使我們能夠使用更高的學(xué)習(xí)率。
然而,下面是批量標(biāo)準(zhǔn)化的幾個缺點(diǎn):
BN 在每次訓(xùn)練迭代中計(jì)算批次數(shù)據(jù)的統(tǒng)計(jì)量(Mini-batch 均值和方差),因此在訓(xùn)練時需要更大的批次大小,以便它可以有效地逼近來自 mini-batch 的總體均值和方差。這使得 BN 更難訓(xùn)練用于對象檢測、語義分割等應(yīng)用的網(wǎng)絡(luò),因?yàn)樗鼈兺ǔI婕案叻直媛?span style="color:#aaaaaa;">(通常高達(dá) 1024,2048 等)的輸入數(shù)據(jù),使用大批量進(jìn)行訓(xùn)練在計(jì)算上往往是不可行的。
BN 不適用于 RNN。問題是 RNN 與之前的時間戳具有循環(huán)連接,并且在 BN 層中的每個時間步長都需要單獨(dú)的
和 ,這反而增加了額外的復(fù)雜性并使 BN 與 RNN 一起使用變得更加困難。 不同的訓(xùn)練和測試計(jì)算:在測試(或推理)期間,BN 層不會從測試數(shù)據(jù) mini-batch(上面算法表中的步驟 1 和 2)計(jì)算均值和方差,而是使用固定均值和從訓(xùn)練數(shù)據(jù)計(jì)算的方差。這在使用 BN 時需要謹(jǐn)慎,并引入了額外的復(fù)雜性。在 pytorch 中,
model.eval()確保在評估模型中設(shè)置模型,因此 BN 層利用它來使用從訓(xùn)練數(shù)據(jù)預(yù)先計(jì)算的固定均值和方差。
3Weight Normalization
針對 BN 的缺點(diǎn),Saliman 等人提出了 WN。他們的想法是將權(quán)重向量的大小與方向解耦,從而重新參數(shù)化網(wǎng)絡(luò)以加快訓(xùn)練速度。
重新參數(shù)化是什么意思呢?
不是直接對激活值
WN 加速了類似于 BN 的訓(xùn)練,與 BN 不同的是,它也適用于 RNN。但是與 BN 相比,使用 WN 訓(xùn)練深度網(wǎng)絡(luò)的穩(wěn)定性較差,因此在實(shí)踐中并未得到廣泛應(yīng)用。
4Layer Normalization

受 BN 的啟發(fā),Hinton 等人提出的 Layer Normalization 沿特征方向而不是小批量方向?qū)せ钸M(jìn)行 normalization。這通過消除對批次的依賴來克服 BN 的缺點(diǎn),也使得 RNN 更容易應(yīng)用 BN。
與 BN 不同,LN 直接從整個隱藏層的神經(jīng)元的總輸入估計(jì)統(tǒng)計(jì)量,因此 normalization 不會在訓(xùn)練數(shù)據(jù)之間引入任何新的依賴關(guān)系。它適用于 RNN,并提高了幾個現(xiàn)有 RNN 模型的訓(xùn)練時間和泛化性能。最近,它還與 Transformer 模型一起配合使用。

注意上圖中的顏色走向,與 BN 有所不同,LN 對某一個層中所有特征進(jìn)行歸一化,而不是在小批量中對輸入特征進(jìn)行歸一化。
因此,當(dāng)處理批次大小(batch size)為
如果是 CV,那特征圖就是個 4D 張量,我們可以在空間維度和所有通道上取平均值,如下所示:
5Group Normalization

與 LN 類似,GN 也沿特征方向進(jìn)行操作,但與 LN 不同的是,它將特征劃分為若干組并分別對每個組進(jìn)行 normalization。在實(shí)踐中,GN 比 LN 常常表現(xiàn)得更好,它的參數(shù) num_groups 可以設(shè)為超參數(shù)。
如果覺得 BN、LN、GN 有點(diǎn)令人困惑,下圖給出了一個總結(jié)。給定形狀 (N, C, H, W) 的激活,BN 歸一化 N 方向,LN 和 GN 歸一化 C 方向,但 GN 額外地將 C 通道分組并單獨(dú) normalize 各個組。

batches、channels、height 和 width,BN 在
6Instance Normalization

上圖中,最后一個是 Instance Normalization 的示意圖。IN 僅僅在特征的空間維度上計(jì)算,因此它對于每個通道和樣本都是獨(dú)立的。
有趣的是,IN 中的仿射參數(shù)可以完全改變輸出圖像的風(fēng)格。與 BN 不同,IN 可以將每個單獨(dú)樣本的風(fēng)格歸一化為目標(biāo)風(fēng)格(由
.Adaptive Instance Normalization .
Normalization 和風(fēng)格遷移密切相關(guān)。如果
自適應(yīng) IN(AdaIN)接收輸入圖像
下圖中可以看到一個簡單的編碼器-解碼器網(wǎng)絡(luò)架構(gòu),帶有額外的 AdaIN 層用于樣式對齊。

7Weight Standardization
權(quán)重標(biāo)準(zhǔn)化是上述 WN 的變體。與關(guān)注激活的標(biāo)準(zhǔn)方法不同,WS 針對權(quán)重進(jìn)行平滑處理。
我們來簡述一下 WS 的操作流程。考慮一個標(biāo)準(zhǔn)卷積層,將其偏置項(xiàng)設(shè)置為
其中

以上圖為例,
其中,
分別計(jì)算每個輸出通道的均值和標(biāo)準(zhǔn)差,可以結(jié)合下圖來理解。

本質(zhì)上,WS 旨在單獨(dú)調(diào)控每個輸出通道的權(quán)重的一階統(tǒng)計(jì)量。通過這種方式,WS 在反向傳播期間對梯度進(jìn)行 normalization。
從理論上和實(shí)驗(yàn)上都驗(yàn)證了它通過標(biāo)準(zhǔn)化卷積層中的權(quán)重來平滑損失情況。
理論上,WS 減少了損失和梯度的 Lipschitz 常數(shù)。核心思想是將卷積權(quán)重保持在一個緊湊的空間中,從而平滑了損失并改進(jìn)了訓(xùn)練。
論文作者將 WS 與 GN 結(jié)合使用,取得了不錯效果。

在 ImageNet 和 COCO 上比較 normalization 方法,GN+WS 大大優(yōu)于單獨(dú)使用 BN 和 GN。
8小結(jié)
最后,為了便于比較和分析它們的工作原理,我們將上述幾種主要 normalization 方法匯聚在一個圖中。

當(dāng)在論文或具體網(wǎng)絡(luò)架構(gòu)中遇到這些名詞時,腦子中可以浮現(xiàn)出對應(yīng)的圖來輔助理解。
至于這些方法分別適合什么任務(wù),需要大家在實(shí)踐中不斷積累經(jīng)驗(yàn),也歡迎大家留言交流。
參考資料
https://theaisummer.com/normalization/
[2]https://ai-pool.com/a/s/normalization-in-deep-learning
[3]https://towardsdatascience.com/different-normalization-layers-in-deep-learning-1a7214ff71d6
[4]https://towardsdatascience.com/batch-normalization-in-3-levels-of-understanding-14c2da90a338
