天天看點

深度學習之優化詳解:batch normalization 文章原标題《Intro to optimization in deep learning: Busting the myth about batch normalization》

深度學習之優化詳解:batch normalization 文章原标題《Intro to optimization in deep learning: Busting the myth about batch normalization》

認識上圖這些人嗎?這些人把自己叫做“The Myth Busters”,為什麼?在他們的啟發下,我們才會在Paperspace做類似的事情。我們要解決是Batch Normalization(BN)是否确實解決了Internal Covariate Shift的問題。雖然Batch Normalization已經存在了幾年,并且已經成為深度神經網絡的主要内容,但它仍然是深度學習中最容易被誤解的概念之一。

Batch

Normalization真的解決了Internal Covariate Shift問題了嗎?它是用來做什麼的?你所學的深度學習是真的嗎?我們來看看吧!

在開始之前

我們曾經讨論過:

1、如何利用随機梯度下降來解決深度學習中局部極小值和鞍點的問題。

2、Momentum(動量)和Adam(自适應矩估計)等優化算法如何增強梯度下降以解決優化曲面中的曲率問題。

3、如何使用不同的激活函數來解決梯度消失問題。

為了有效地學習神經網絡,神經網絡的每一層分布都應該:均值為0、始終保持相同的分布;第二個條件意味着通過批梯度下降輸入到網路層的資料分布不應該變化太多,并且随着訓練的進行它應該保持不變,而不是每一層的分布都在發生變化。

Internal Covariate Shift

 Batch Normalization:通過減少Internal Covariate Shift來加快深度網絡訓練,其前提是解決一個稱為Internal Covariate Shift的問題。

就像我們現在所稱的那樣,Internal Covariate Shift是指在訓練過程中,隐層的輸入分布老是變來變去,Internal指的是深層網絡的隐層,是發生在網絡内部的事情,Covariate指的是輸入分布被變化的權重參數化,Shift指分布正在發生變化。

是以,讓我們試着觀察這件事情怎樣發生的。再次,盡可能想象一下最簡單的神經網絡之一:線性堆疊的神經元,這樣你也可以通過替換神經元網絡層來擴充類比。

深度學習之優化詳解:batch normalization 文章原标題《Intro to optimization in deep learning: Busting the myth about batch normalization》

假設我們正在優化損失函數L,神經元d權重的更新規則是:

深度學習之優化詳解:batch normalization 文章原标題《Intro to optimization in deep learning: Busting the myth about batch normalization》

我們可以看到權重d的梯度取決于c的輸出,對于神經網絡中的任何層也是如此。神經元的權重梯度取決于它的輸入或者下一層的輸出。

然後梯度向着反方向更新權重,此過程一直重複,讓我們回到d層,因為我們對d進行了梯度更新,我們期望omega_d可以有更小的損失,然而并非如此,讓我們看一下原因。

我們從i開始進行初始疊代更新。假設輸出c在疊代i為p_c^i

,d層更新不妨假設c的輸入分布為p_c^i。在向下傳遞期間,c,omega_c的權重也會更新,這導緻c的輸出分布發生變化。在下一次疊代i+1中,假設z_c的分布已轉變到p_c^{i+1}。由于d層的權重是根據p_c^i更新的,現在d層對應輸入分布p_c^{i+1},這種差異可能導緻網絡層産生根本不會減少損失的輸出。

現在,我們可以提出兩個問題:

輸入分布的變化究竟如何使神經網絡層更難學習?

這種分布的變化是否足夠引起上述情況?

我們先回答第一個問題:

為什麼 造成上述情況?

神經網絡的作用是生成映射f,将輸入x映射到輸出y。x的分布發生變化,為什麼會使神經網絡層更難學習?

下圖為x标準分布圖:

深度學習之優化詳解:batch normalization 文章原标題《Intro to optimization in deep learning: Busting the myth about batch normalization》

x的非标準分布如下圖:

深度學習之優化詳解:batch normalization 文章原标題《Intro to optimization in deep learning: Busting the myth about batch normalization》

假設我們正在嘗試的映射是f=2x,如果x的分布在一個地方壓縮了很多密度,或者它是否均勻分布為什麼那麼重要?

事實證明,這很重要,現代精确的深層網絡,是非常強大的曲線拟合器。假設我們有一個l層,對應輸入為x,其分布如下。另外,我們假設,由層l學習的函數,由虛線表示:

深度學習之優化詳解:batch normalization 文章原标題《Intro to optimization in deep learning: Busting the myth about batch normalization》

i的疊代

假設在梯度更新之後,當到下一層網絡小批量梯度下降時,x的分布變為這樣:

深度學習之優化詳解:batch normalization 文章原标題《Intro to optimization in deep learning: Busting the myth about batch normalization》

i+1疊代

注意這個小批量梯度下降的損失與之前的損失相比更多,為什麼會這樣?讓我們回到我們之前的資料,我們最初學到的映射f可以很好地減少之前小批量梯度下降的損失。對于許多其他函數也是如此,在x不密集的區域中,這些函數差别很大。

深度學習之優化詳解:batch normalization 文章原标題《Intro to optimization in deep learning: Busting the myth about batch normalization》

适應相同輸入xi的不同函數

如果我們選擇紅色虛線給出的函數,下一個小批量梯度下降的損失也會很低。

深度學習之優化詳解:batch normalization 文章原标題《Intro to optimization in deep learning: Busting the myth about batch normalization》

更合适的另一個函數

現在明顯的問題是我們如何修改我們的算法,以便我們最終學習的映射對應紅色虛線的映射?沒有簡單的答案,對于這種情況更好的辦法是預防它們而不是等這種情況發生了再去解決它。

ICS最終搞砸我們學習的原因是我們的神經網絡總是在輸入分布的密集區域上表現更好。由于較密集區域中的資料點主導平均損失(我們試圖最小化),是以密集區域中點的損失減少得更多。

但是,如果ICS最終在訓練期間的後續批次中更改輸入分布的密集區域,則網絡在之前疊代期間學習的權重不再是最佳的。它可能需要非常仔細地調整超參數來獲得合理的學習。這就解釋了為什麼ICS會出現這樣的問題。

我們所說的是在小批量梯度下降中存在很大的方差。方差確定我們的映射不會在輸入分布的一個區域中過度專門化,我們也希望均值在零附近。

規範化輸入

解決此問題的一種方法是将輸入歸一化到神經網絡,以使輸入分布均值為0和方差為1。但是,這僅适用于網絡不夠深的情況。當網絡變得更深,比如20層或更多層時,即使輸入被歸一化,超過20多個層的權重的微小波動也會導緻輸入到更深層的輸入分布發生很大變化。

例如語言變化(不完全正确):我們旅行距離發生變化,語言也會發生變化。 但是,較短距離内的語言有很多相似之處。比如西班牙語和葡萄牙語,它們都源于史前印歐語言。印度斯坦語也是如此,印度語是8000公裡以外的地方。 但是,西班牙語和印度斯坦語之間的差異比西班牙語和葡萄牙語之間的差異要大得多。原因是小距離的微小變化已經放大了很多,深度網絡也是如此。

輸入批量歸一化

我們現在介紹批量歸一化的概念,它實際上規範了網絡層的輸出激活,然後做了更多的事情,下面是詳細的描述:

深度學習之優化詳解:batch normalization 文章原标題《Intro to optimization in deep learning: Busting the myth about batch normalization》

上述等式描述了BatchNorm的原理,2-4描述了某個神經元對應的原始的激活x通過減去mini-Batch内m個執行個體獲得的m個激活x求得的均值E(x)并除以求得的方差Var(x)來進行轉換,由此求出每一次小批量梯度下降激活的标準差。

等式5是中γ和β是所謂的批量歸一化層的超參數。式5的輸出具有β的平均值和γ的标準偏差。實際上,批量歸一化層有助于優化算法來控制層的輸出的均值和方差。

揭穿 ICS 的神秘面紗

Internal Covariate Shift是指我們訓練網絡時輸入分布的變化。Batch Norm具有超參gamma和beta,用于調整激活的均值和方差。但是當這些超參數被訓練時,它們也會發生變化,而BN導緻激活分布或ICS的變化。如果它能阻止ICS,超參數gamma和beta沒有任何意義。

Batch Norm 有效呢?

Ian Goodfellow,GANs的創始人,人工智能領域最重要的研究員之一,他在一個講座中給出了可能的解釋,在這一點上,我必須提醒你,除非我們通過具體證據支援,否則這隻是猜測,不管它可能來自現代深度學習中的重量級人物之一。Goodfellow認為關鍵是BN的兩個超參數。

讓我們再次考慮超級簡單的玩具網絡:

深度學習之優化詳解:batch normalization 文章原标題《Intro to optimization in deep learning: Busting the myth about batch normalization》

當我們對a的權重進行梯度更新時,我們隻計算 frac {\ partial {L}} {\ partial {a}},即損失函數相對于a的敏感度。但是,我們沒有考慮到改變a的權重也會改變更多層的輸出,如層b,c,d。

同樣,由于使用這些算法的計算難度,這實際上歸結為我們無法使用二階或更高階優化方法,梯度下降及其變型隻适用于一階。

深度神經網絡具有高階互相作用,這意味着除了損失函數之外,改變一個層的權重也可能影響其他層的統計。這些跨層在沒有列入考慮的情況下互動會導緻ICS。每次我們更新圖層的權重時,它都有可能以不好的方式影響神經網絡中圖層的統計。

在這種情況下,收斂可能需要仔細初始化,調整超參數和更長的訓練持續時間。但是,當我們在圖層之間BN圖層時,圖層的統計資訊僅受兩個超參數gamma和beta的影響。

現在,我們的優化算法隻必須僅兩個超參數來控制任何層的統計資料,而不是前一層中的權重,這極大地加速了收斂,并且避免了初始化和超參數調整的需要。是以,Batch Norm更像是一個檢查指向機制。

請注意,任意設定圖層均值和标準差的能力也意味着如果充分地進行正确地訓練,我們就可以恢複其原始分布。

激活前或激活後的 BatchNorm

理論上在激活函數之前應用BN更好,但實際上已經發現在激活之後應用BN會産生更好的結果。在BN之後進行激活,BN無法完全控制進入下一層的輸入的統計資料,因為BN的輸出必須經過激活,在激活後應用BN卻不是這種情況。

推論中的批量規範

在推理期間使用BN可能有點棘手,因為我們在推理期間可能并不總是有批處理。例如,在視訊上實時運作對象檢測器。一次處理一個幀,是以沒有批處理。

我們需要計算批處理的均值hat {x}和方差sigma

^ 2 來生成BN的輸出。在這種情況下,我們在訓練期間保持均值和方差的滑動平均,然後在推理期間将這些值插入均值和方差,這很重要,也是大多數深度學習庫采用的方法,可以開箱即用。

使用滑動平均的理由取決于大數定律。小批量的均值和方差是對真實均值和方差的非常粗糙的估計。批量估計稱為批量統計,均值和方差的真實值(我們未知)稱為人口統計。對于大量樣本,批量統計資料往往會收斂于人口的統計資料,這就是為什麼我們在訓練時使用滑動平均。 由于我們的優化算法的小批量特性,它還有助于我們除去平均估計産生的噪聲。

BNS 是正則化器:

Batch Norm其實是一個正規化器,每個批次估計的均值和方差是真實均值的噪聲版本,這在我們的最優搜尋中注入了随機性,有助于正規化。

結論:

雖然Batch Norm現已成為深層架構的标準元素,但直到最近,研究一直緻力于了解它是如何工作的。去年,我們還介紹了SELU或縮放指數線性機關激活函數,這些函數隐含地規範了通過它們的激活,這是通過BN明确完成的。

數十款阿裡雲産品限時折扣中,趕緊點選領券開始雲上實踐吧!

本文由北郵

@愛可可-愛生活

 老師推薦,

阿裡雲雲栖社群

組織翻譯。

文章原标題《Intro to optimization in deep learning: Busting the myth about batch normalization》

作者:paperspace

譯者:烏拉烏拉,審校:袁虎

文章為簡譯,更為詳細的内容,請檢視

原文文章

繼續閱讀