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