今天主要想寫一下DeepLearning 中BatchNorm奠货,文章主要主要的大綱為:
- BN 什么
- 為什么提出BN
- BN 的具體細節(jié)是什么
- BN 的改進
- BN數(shù)學表達式
- BN的訓練和預測
- 總結(jié)
BN 是什么
BN 是Batch Normalization 的縮寫优烧,是近年來DN的重要成果搅荞。如果想說BN是什么必須要先提一下機器學習中重要的IID假設: IID 獨立同分布假設,假設的具體含義為:訓練數(shù)據(jù)和測試數(shù)據(jù)是滿足了相同的分布嫡丙,這樣通過訓練數(shù)據(jù)獲得的模型在測試集才能獲得很好的效果夫晌。BN 就是在深層神經(jīng)網(wǎng)絡中使得每一層的輸入都保持相同的分布。
為什么提出BN
回答這個問題必須先要回答為什么對于深層神經(jīng)網(wǎng)絡難以訓練?胶哲。在DL領(lǐng)域中有很多方法都是為了解決這個問題比如:更換激活函數(shù)憎蛤、RestNet等等。
首先纪吮,先解釋一下 Internal Covariate Shift 問題
Internal Covariate Shift
引用BN 作者說法俩檬,Mini-batch SGD 相比于 One Example SGD有兩大有點:
- 可以更加把梯度計算的更加準確,這個從訓練時反應就可以看出
- 可以使用并行計算碾盟,加快訓練速度
但是 SGD 存在著一個問題棚辽,那就是其超參數(shù)很難調(diào)整。
是什么倒是原因?qū)е铝藢W習效率差呢冰肴?假設在ML系統(tǒng)中有一組輸入數(shù)據(jù)<X,Y>屈藐,如果其輸入X 的特征分組總是變化,這樣就不滿足開頭說的IID假設了熙尉,這就會導致網(wǎng)絡非常不穩(wěn)定联逻。在深度學習模型中,當有很多隱藏層時检痰,各個隱藏測分布就會不斷發(fā)生變化包归,這就是所謂的“Internal Covariate Shift"。Internal 就是針對隱藏層而言铅歼。
BN的提出
正是有Internal Covariate Shift 問題公壤,能不能讓每一層激活函數(shù)的輸入分布固定下來呢?
其實在CV領(lǐng)域就給出了答案椎椰,在CV中為了使輸入數(shù)據(jù)分布固定在均值為0 厦幅,方差為1 的標準正態(tài)分布,就采用了所謂的白化(Whiten)操作慨飘。BN的靈感也就來源與此确憨。
BN其實就神經(jīng)網(wǎng)絡中每一層都進行了白化操作,具體來說BN就是:對深層神經(jīng)網(wǎng)絡的每一個隱藏層在進行激活函數(shù)之前都把輸入強制撈回到均值為0瓤的,方差為1 的正態(tài)分布休弃。這樣經(jīng)過BN后每一層的輸入都會保持了相同的分布。也就解決了Internal Covariate Shift 問題堤瘤。
BN 的具體細節(jié)是什么
BN的操作非常直觀玫芦,因為在深層網(wǎng)絡在做非線性激活函數(shù)的輸入浆熔,隨著網(wǎng)絡深度的加大本辐,其分布逐漸發(fā)生便宜桥帆。DL訓練慢,一般情況下其整體分布逐漸向非線性函數(shù)取值區(qū)間的上下域靠近慎皱。這樣就導致了梯度消失(這才是DL收斂速度慢的根本原因)老虫。
BN就是通過一定的規(guī)范化手段,把每層神經(jīng)網(wǎng)絡任意神經(jīng)元輸入值的強行拉回標準正態(tài)分布茫多。在這里就需要詳細的說明一下了祈匙。
進行BN的時機是什么時候?
正如前文所述天揖,之所以要進行BN操作夺欲,是為了使得每個隱藏層中每個神經(jīng)元都具有相同的分布,滿足IID假設今膊。所以我們在進行時機也就比較清楚了些阅,就是在非線性變換之前。比如某個神經(jīng)元計算公式為: 斑唬,并非對X 進行BN操作市埋,而是對
的結(jié)果進行BN,即:
恕刘。
BN操作后有什么實質(zhì)作用
現(xiàn)在他們通過BN把激活函數(shù)的輸入強制為均值為0 缤谎,方差為1 的正態(tài)分布了。但是這樣的操作會產(chǎn)生什么樣的效果褐着,有為什么會有這樣的效果呢坷澡?
先回答第一個問題:如果我們把激活函數(shù)的輸入強制為標準正態(tài)分布,直接解決了 Internal Covariate Shift 問題含蓉,還解決了深度神經(jīng)網(wǎng)絡的梯度消失問題洋访,提高網(wǎng)絡訓練效率。
正所謂知其然還要知其所以然谴餐,為什么會有這樣的效果呢姻政?
我們先做這樣的假設,假設網(wǎng)絡中某個神經(jīng)元采用的Sigmod激活函數(shù)岂嗓,熟悉DL的同學都很清楚汁展,Sigmod 函數(shù)和梯度的公式如下:
Sigmod 和對應導數(shù)圖形如下圖:
從上面圖形可以觀察到如下結(jié)論
- 從Sigmod 圖形得到,Sigmod 取值范圍為[0,1]
- Sigmod 導數(shù)圖形得到厌殉,Sigmod 值在0.5時食绿,導數(shù)取得最大值
- Sigmod 在兩個端點時(0,1),對應導數(shù)值幾乎為0
也就是說對于Sigmod 函數(shù)公罕,當X在[-2,2]之間學習效率是最好的器紧,此時對應的梯度非常大。X有輕微的變化楼眷,就會存在很大的梯度
如果此時非線性函數(shù)輸入分布為N(-6,1) 時铲汪,則95%的值會落在[-8,-4]熊尉,這些值的梯度幾乎為0,也就是說參數(shù)幾乎不會發(fā)生變化掌腰,而如果我們把輸入分布強制設置為N(0,1)時狰住,此時95% 數(shù)值都會落在[-2,2]之間齿梁。此時梯度是很大的催植。
所以,經(jīng)過BN操作之后勺择,就避免了DL 中梯度消失問題创南,加快了收斂速度。
改進BN
通過上文我們知道了省核,經(jīng)過BN后把大部分輸入都落在激活函數(shù)的線性區(qū)域內(nèi)扰藕,讓他們具有了很大的梯度,提高了收斂速度芳撒。
但是邓深,我們知道如果把所有輸入都經(jīng)過線性變換,不管網(wǎng)絡有多深笔刹,其實仍然是一個線性模型芥备。這樣整個網(wǎng)絡的表達能力就下降了。所以BN為了保持非線性表達特點舌菜,在BN操作后萌壳,做了Scale和Shift 操作。具體作為如下公式:
公式中: 表示經(jīng)過BN操作后的結(jié)果日月,
進行了簡單變換而
則對結(jié)果進行了平移袱瓮。參數(shù)
都是需要學習的參數(shù)爱咬。
BN數(shù)學表達式
說了這么多尺借,BN的數(shù)學表達式應該是什么樣呢?其實這對學過概率論的同學都是非常簡單的精拟。BN其實就是一個歸一化操作
經(jīng)過調(diào)整后的BN為:
BN的訓練和預測
BN的訓練過程還是比較清洗的
1. 計算每一個Batch 的均值和方差
2. 將每個一個輸入(非線性的輸入)x 燎斩,進行歸一化運算
3. 對每個歸一化的 x 進行調(diào)整
從訓練的流程看,BN是需要計算當前批次數(shù)據(jù)的均值與方差蜂绎,但是在預測階段可能只有一個數(shù)值栅表,如何計算均值與方差呢? 其實BN在預測階段师枣,是將訓練時每個Mini-Batch的 記住怪瓶,之后求他們最終的數(shù)學期望。
總結(jié)
- BN 解決 Internal Covariate Shift 問題
- BN 解決了梯度消失問題践美,加快了收斂速度