[深度学习] Normalization 模型
目錄
一? Batch Normalization
“Internal Covariate Shift”問題
訓(xùn)練階段如何做BatchNorm
BatchNorm的好處
二 LayerNormalization
一? Batch Normalization
BatchNormalization的出現(xiàn)無疑是廣大AI調(diào)參俠的福音,將大家從繁瑣的權(quán)重初始化、學(xué)習(xí)率調(diào)節(jié)中釋放出來。它不僅能夠大大加快收斂速度,還自帶正則化功能,是Google 2015年提出的。
如何理解BatchNorm?
請參考論文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
“Internal Covariate Shift”問題
從論文名字可以看出,BN是用來解決“Internal Covariate Shift”問題的,那么首先得理解什么是“Internal Covariate Shift”?
機器學(xué)習(xí)的一個重要的假設(shè)是:數(shù)據(jù)是獨立同分布的。訓(xùn)練集合測試集的數(shù)據(jù)是同分布的,這樣模型才有好的泛化效果。神經(jīng)網(wǎng)絡(luò)其實也是在學(xué)習(xí)這個分布。在這個假設(shè)前提下,一旦我們知道了(x,y)的聯(lián)合分布,很多問題就能通過條件概率P(x|y)P(x|y)計算出來了。但是在實際訓(xùn)練過程中,數(shù)據(jù)經(jīng)過前一個隱藏層向后一個隱藏層傳播(線性+非線性運算),分布通常會發(fā)生變化(作者稱之為Internal Covariate Shift),這會導(dǎo)致網(wǎng)絡(luò)學(xué)習(xí)變慢。我們從兩個方面來稍微理解一下這個問題。
論文首先說明Mini-Batch SGD相對于One Example SGD的兩個優(yōu)勢:梯度更新方向更準確;并行計算速度快;(本文作者:為什么要說這些?因為BatchNorm是基于Mini-Batch SGD的,所以先夸下Mini-Batch SGD),然后吐槽SGD訓(xùn)練的缺點:超參數(shù)調(diào)起來很麻煩。(本文作者:作者隱含意思是用BN就能解決很多SGD的缺點)
接著引入covariate shift的概念:如果ML系統(tǒng)實例集合<X,Y>中的輸入值X的分布老是變,這不符合IID假設(shè)啊,那您怎么讓我穩(wěn)定的學(xué)規(guī)律啊,這不得引入遷移學(xué)習(xí)才能搞定嗎,我們的ML系統(tǒng)還得去學(xué)習(xí)怎么迎合這種分布變化啊。
對于深度學(xué)習(xí)這種包含很多隱層的網(wǎng)絡(luò)結(jié)構(gòu),在訓(xùn)練過程中,因為各層參數(shù)老在變,所以每個隱層都會面臨covariate shift的問題,也就是在訓(xùn)練過程中,隱層的輸入分布老是變來變?nèi)?#xff0c;這就是所謂的“Internal Covariate Shift”,Internal指的是深層網(wǎng)絡(luò)的隱層,是發(fā)生在網(wǎng)絡(luò)內(nèi)部的事情,而不是covariate shift問題只發(fā)生在輸入層。
?
一方面:我們現(xiàn)在只看兩個隱藏層(隱藏層A和隱藏層B)之間的傳播。第一輪,來自A的數(shù)據(jù)經(jīng)過線性操作和激活函數(shù)后到達B,反向傳播時,B層為了學(xué)習(xí)到這個分布(滿足A的需求),調(diào)整了權(quán)重W1。接著又進行第二輪傳播了,A數(shù)據(jù)一到B,A說,現(xiàn)在需求變了,要這樣這樣。B一臉懵,盤算了一下,發(fā)現(xiàn)前面的白學(xué)了,沒辦法,換個方向重來,就這樣,A一直在變,B就得跟著變,來來回回磨合,這聽起來就是個非常耗時的工作。就好比A說今天要吃湯圓,B和好了面粉,準備了調(diào)料,A又說我要吃飯,雖然在B的不懈努力下A最后能吃上飯,但如果一開始A就告訴B我要吃飯不是更快一點?,網(wǎng)絡(luò)越深,這個問題就越嚴重。
BatchNorm的本質(zhì)思想
BatchNorm的基本思想:能不能讓每個隱層節(jié)點的激活輸入分布固定下來呢?這樣就避免了“Internal Covariate Shift”問題了。BatchNormalization就是解決這兩個問題的。首先,它將隱藏層的輸入強行變換為同一分布(解決了第一個問題),這個分布就是正態(tài)分布(解決了第二個問題)。
其實一句話就是:對于每個隱層神經(jīng)元,把逐漸向非線性函數(shù)映射后向取值區(qū)間極限飽和區(qū)靠攏的輸入分布強制拉回到均值為0方差為1的比較標準的正態(tài)分布,使得非線性變換函數(shù)的輸入值落入對輸入比較敏感的區(qū)域,以此避免梯度消失問題。因為梯度一直都能保持比較大的狀態(tài),所以很明顯對神經(jīng)網(wǎng)絡(luò)的參數(shù)調(diào)整效率比較高,就是變動大,就是說向損失函數(shù)最優(yōu)值邁動的步子大,也就是說收斂地快。NB說到底就是這么個機制,方法很簡單,道理很深刻。
我們用sigmoid為例來說明一下。假設(shè)兩層傳播之間可表示為? z=g(Wu+b)? 其中g(shù)是sigmoid函數(shù),我們令 x=Wu+b
那么:
計算下梯度:
我們關(guān)注一下中間那一項,是sigmoid函數(shù)的導(dǎo)數(shù),它的分布所示,可見隨著x不斷增大,該項趨近于0,這也就意味著整個梯度趨近于0,進入飽和區(qū)了,導(dǎo)致的結(jié)果就是收斂變慢!要想加快收斂怎么辦,把x拉到靠近0的位置就行了,這里導(dǎo)數(shù)值最大。
?
訓(xùn)練階段如何做BatchNorm
它的具體做法所示。對每一個Mini-Batch的所有樣本的每一維特征,計算兩個統(tǒng)計量:均值和方差,然后做一個歸一化操作,這樣就變成了正態(tài)分布了。但是只這樣做也有問題,首先,誰說數(shù)據(jù)一定是正態(tài)分布的,偏正態(tài)不行嗎?第二,把數(shù)據(jù)全部拉到接近0的位置,sigmoid不就接近于一個線性函數(shù)了嗎,沒有起到激活的作用啊(線性激活函數(shù)+線性操作等價于一層線性操作)。
上面是對BN的抽象分析和解釋,具體在Mini-Batch SGD下做BN怎么做?其實論文里面這塊寫得很清楚也容易理解。為了保證這篇文章完整性,這里簡單說明下。
假設(shè)對于一個深層神經(jīng)網(wǎng)絡(luò)來說,其中兩層結(jié)構(gòu)如下:
要對每個隱層神經(jīng)元的激活值做BN,可以想象成每個隱層又加上了一層BN操作層,它位于X=WU+B激活值獲得之后,非線性函數(shù)變換之前,其圖示如下:
對于Mini-Batch SGD來說,一次訓(xùn)練過程里面包含m個訓(xùn)練實例,其具體BN操作就是對于隱層內(nèi)每個神經(jīng)元的激活值來說,進行如下變換:
?
要注意,這里t層某個神經(jīng)元的x(k)不是指原始輸入,就是說不是t-1層每個神經(jīng)元的輸出,而是t層這個神經(jīng)元的激活x=WU+B,這里的U才是t-1層神經(jīng)元的輸出。
變換的意思是:某個神經(jīng)元對應(yīng)的原始的激活x通過減去mini-Batch內(nèi)m個實例獲得的m個激活x求得的均值E(x)并除以求得的方差Var(x)來進行轉(zhuǎn)換。
上文說過經(jīng)過這個變換后某個神經(jīng)元的激活x形成了均值為0,方差為1的正態(tài)分布,目的是把值往后續(xù)要進行的非線性變換的線性區(qū)拉動,增大導(dǎo)數(shù)值,增強反向傳播信息流動性,加快訓(xùn)練收斂速度。
為了解決這兩個問題,作者又做了一步操作,引入了兩個參數(shù)gamma和beta(圖中的最后一步), 這兩個參數(shù)是在訓(xùn)練過程中學(xué)習(xí)的!但是這樣會導(dǎo)致網(wǎng)絡(luò)表達能力下降,為了防止這一點,每個神經(jīng)元增加兩個調(diào)節(jié)參數(shù)(scale和shift),這兩個參數(shù)是通過訓(xùn)練來學(xué)習(xí)到的,用來對變換后的激活反變換,使得網(wǎng)絡(luò)表達能力增強,即對變換后的激活進行如下的scale和shift操作,這其實是變換的反操作:
BN其具體操作流程,如論文中描述的一樣:
?
上面說了一下訓(xùn)練過程。那么預(yù)測的時候呢?假如只預(yù)測一個樣本,一個樣本的均值…方差…怎么算?沒意義是吧。事實上,預(yù)測的時候用的是全局的均值和方差,這個全局的均值和方差是怎么得到的呢?很簡單,訓(xùn)練過程中記錄下每個Mini-Batch的均值和方差,求個期望就是全局的均值和方差了。
BatchNorm的好處
BatchNorm為什么NB呢,關(guān)鍵還是效果好。不僅僅極大提升了訓(xùn)練速度,收斂過程大大加快,還能增加分類效果,一種解釋是這是類似于Dropout的一種防止過擬合的正則化表達方式,所以不用Dropout也能達到相當?shù)男ЧA硗庹{(diào)參過程也簡單多了,對于初始化要求沒那么高,而且可以使用大的學(xué)習(xí)率等。總而言之,經(jīng)過這么簡單的變換,帶來的好處多得很,這也是為何現(xiàn)在BN這么快流行起來的原因。
?
二 LayerNormalization
BatchNormalization簡直是個救世主啊,它令調(diào)參工作變得從未如此容易,讓調(diào)參俠們不費吹灰之力,談笑間到達收斂的彼岸。但毛主席曾經(jīng)說過,萬物都是辯證的,它同樣存在兩個問題:
-
對batch_size非常敏感。BatchNormalization的一個重要出發(fā)點是保持每層輸入的數(shù)據(jù)同分布。回想下開始那個獨立同分布的假設(shè)。假如取的batch_size很小,那顯然有些Mini-Batch的數(shù)據(jù)分布就很可能與整個數(shù)據(jù)集的分布不一致了,又出現(xiàn)了那個問題,數(shù)據(jù)分布不一致,這就等于說沒起到同分布的作用了,或者說同分布得不充分。實驗也證明,batch_size取得大一點, 數(shù)據(jù)shuffle的好一點,BatchNormalization的效果就越好。
-
不能很方便地用于RNN。這其實是第一個問題的引申。我們再來看一下Figure 6中的均值和方差的計算公式。對所有樣本求均值。對于圖片這類等長的輸入來說,這很容易操作,在每個維度加加除除就可以了,因為維度總是一致的。而對于不等長的文本來說,RNN中的每個time step共享了同一組權(quán)重。在應(yīng)用BatchNormalization時,這就要求對每個time step的batch_size個輸入計算一個均值和方差。那么問題就來了,假如有一個句子S非常長,那就意味著對S而言,總會有個time_step的batch_size為1,均值方差沒意義,這就導(dǎo)致了BatchNormalization在RNN上無用武之地了。
為了避免這兩個問題,LayerNormalization就應(yīng)運而生了。
LayerNormalization的主要變化在于:
-
不再對Mini-Batch中的N的樣本在各個維度做歸一化,而是針對同一層的所有神經(jīng)元做歸一化。歸一化公式為:
?
其中,H指的是一層神經(jīng)網(wǎng)絡(luò)的神經(jīng)元個數(shù)。我們再回想下BatchNormalization,其實它是在每個神經(jīng)元上對batch_size個數(shù)據(jù)做歸一化,每個神經(jīng)元的均值和方差均不相同。而LayerNormalization則是對所有神經(jīng)元做一個歸一化,這就跟batch_size無關(guān)了。哪怕batch_size為1,這里的均值和方差只和神經(jīng)元的個數(shù)有關(guān)系(如果讀到這里仍然感到不是特別清楚,再讀兩遍,還困惑也沒關(guān)系,待會看)。
-
測試的時候可以直接利用LN,所以訓(xùn)練時不用保存均值和方差,這節(jié)省了內(nèi)存空間。
兩種方式的區(qū)別。假設(shè)有N個樣本,每個樣本的特征維度為4,圖中每個小圓代表一個特征,特征1,特征2等等,特征4。BatchNormalization是在N個同一特征(如特征1)上求均值和方差,這里要對每個特征求1次,共4次。對照一下上面說的,萬一有個樣本有5個特征,是不是就沒法玩了。LayerNormalization呢,別的樣本都和我沒啥關(guān)系,有多少個特征我把這些特征求個均值方差就好了。這也就是為什么一個叫”批歸一化“,另一個叫”層歸一化“了。理解了這一點,也就理解了為什么Transformer中使用LN而不是BN。
當然BatchNormalization也不是吃素的,雖然它在處理不等長序列上存在天生的缺陷,但是除此之外,它的效果都要好于其他Normalization方式(比如LN,WN,IN)。直覺上,BN貌似更好理解一點,LN似乎有種胡子眉毛一把抓的感覺。
?
?
?
?
?
Batch Normalization導(dǎo)讀
深度學(xué)習(xí)中的Normalization模型
總結(jié)
以上是生活随笔為你收集整理的[深度学习] Normalization 模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 球球大作战火柴盒怎么合成(汉典球字的基本
- 下一篇: M623C是什么型号