深度学习之优化详解: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指分布正在發生變化。
所以,讓我們試著觀察這件事情怎樣發生的。再次,盡可能想象一下最簡單的神經網絡之一:線性堆疊的神經元,這樣你也可以通過替換神經元網絡層來擴展類比。
?
假設我們正在優化損失函數L,神經元d權重的更新規則是:
我們可以看到權重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},這種差異可能導致網絡層產生根本不會減少損失的輸出。
現在,我們可以提出兩個問題:
輸入分布的變化究竟如何使神經網絡層更難學習?
這種分布的變化是否足夠引起上述情況?
我們先回答第一個問題:
為什么Internal Covariate Shift造成上述情況?
神經網絡的作用是生成映射f,將輸入x映射到輸出y。x的分布發生變化,為什么會使神經網絡層更難學習?
下圖為x標準分布圖:
x的非標準分布如下圖:
假設我們正在嘗試的映射是f=2x,如果x的分布在一個地方壓縮了很多密度,或者它是否均勻分布為什么那么重要?
事實證明,這很重要,現代精確的深層網絡,是非常強大的曲線擬合器。假設我們有一個l層,對應輸入為x,其分布如下。另外,我們假設,由層l學習的函數,由虛線表示:
i的迭代
假設在梯度更新之后,當到下一層網絡小批量梯度下降時,x的分布變為這樣:
i+1迭代
注意這個小批量梯度下降的損失與之前的損失相比更多,為什么會這樣?讓我們回到我們之前的數據,我們最初學到的映射f可以很好地減少之前小批量梯度下降的損失。對于許多其他函數也是如此,在x不密集的區域中,這些函數差別很大。
適應相同輸入xi的不同函數
如果我們選擇紅色虛線給出的函數,下一個小批量梯度下降的損失也會很低。
更合適的另一個函數
現在明顯的問題是我們如何修改我們的算法,以便我們最終學習的映射對應紅色虛線的映射?沒有簡單的答案,對于這種情況更好的辦法是預防它們而不是等這種情況發生了再去解決它。
ICS最終搞砸我們學習的原因是我們的神經網絡總是在輸入分布的密集區域上表現更好。由于較密集區域中的數據點主導平均損失(我們試圖最小化),因此密集區域中點的損失減少得更多。
但是,如果ICS最終在訓練期間的后續批次中更改輸入分布的密集區域,則網絡在之前迭代期間學習的權重不再是最佳的。它可能需要非常仔細地調整超參數來獲得合理的學習。這就解釋了為什么ICS會出現這樣的問題。
我們所說的是在小批量梯度下降中存在很大的方差。方差確保我們的映射不會在輸入分布的一個區域中過度專門化,我們也希望均值在零附近。
規范化輸入
解決此問題的一種方法是將輸入歸一化到神經網絡,以使輸入分布均值為0和方差為1。但是,這僅適用于網絡不夠深的情況。當網絡變得更深,比如20層或更多層時,即使輸入被歸一化,超過20多個層的權重的微小波動也會導致輸入到更深層的輸入分布發生很大變化。
例如語言變化(不完全正確):我們旅行距離發生變化,語言也會發生變化。?但是,較短距離內的語言有很多相似之處。比如西班牙語和葡萄牙語,它們都源于史前印歐語言。印度斯坦語也是如此,印度語是8000公里以外的地方。?但是,西班牙語和印度斯坦語之間的差異比西班牙語和葡萄牙語之間的差異要大得多。原因是小距離的微小變化已經放大了很多,深度網絡也是如此。
輸入批量歸一化
我們現在介紹批量歸一化的概念,它實際上規范了網絡層的輸出激活,然后做了更多的事情,下面是詳細的描述:
上述等式描述了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的兩個超參數。
?
讓我們再次考慮超級簡單的玩具網絡:
當我們對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明確完成的。
原文鏈接?
本文為云棲社區原創內容,未經允許不得轉載。
總結
以上是生活随笔為你收集整理的深度学习之优化详解:batch normalization的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 厉害了!阿里安全图灵实验室在ICDAR2
- 下一篇: Andrew Ng深度学习课程笔记