【深度學習】批歸一化(batch normalization)
bn是由google於2023年提出,這是乙個深度神經網路訓練的技巧,它不僅可以加快了模型的收斂速度,而且更重要的是在一定程度緩解了深層網路中「梯度瀰散」的問題,從而使得訓練深層網路模型更加容易和穩定。所以目前bn已經成為幾乎所有卷積神經網路的標配技巧了。
從字面意思看來batch normalization(簡稱bn)就是對每一批資料進行歸一化,確實如此,對於訓練中某乙個batch的資料,注意這個資料是可以輸入也可以是網路中間的某一層輸出。在bn出現之前,我們的歸一化操作一般都在資料輸入層,對輸入的資料進行求均值以及求方差做歸一化,但是bn的出現打破了這乙個規定,我們可以在網路中任意一層進行歸一化處理,因為我們現在所用的優化方法大多都是min-batch sgd,所以我們的歸一化操作就成為batch normalization。
我們知道網路一旦train起來,那麼引數就要發生更新,除了輸入層的資料外(因為輸入層資料,我們已經人為的為每個樣本歸一化),後面網路每一層的輸入資料分布是一直在發生變化的,因為在訓練的時候,前面層訓練引數的更新將導致後面層輸入資料分布的變化。以網路第二層為例:網路的第二層輸入,是由第一層的引數和input計算得到的,而第一層的引數在整個訓練過程中一直在變化,因此必然會引起後面每一層輸入資料分布的改變。我們把網路中間層在訓練過程中,資料分布的改變稱之為:「internal covariate shift」。bn的提出,就是要解決在訓練過程中,中間層資料分布發生改變的情況。
如上圖所示,bn步驟主要分為4步:
求每乙個訓練批次資料的均值
求每乙個訓練批次資料的方差
使用求得的均值和方差對該批次的訓練資料做歸一化,獲得0-1分布。其中
ε」 role=」presentation」 style=」position: relative;」>ε
ε是為了避免除數為0時所使用的微小正數。
尺度變換和偏移:將
xi」 role=」presentation」 style=」position: relative;」>xixi
是在訓練時網路自己學習得到的。
乙個標準的歸一化步驟就是減均值除方差,那這種歸一化操作有什麼作用呢?我們觀察下圖,
a中左圖是沒有經過任何處理的輸入資料,曲線是sigmoid函式,如果資料在梯度很小的區域,那麼學習率就會很慢甚至陷入長時間的停滯。減均值除方差後,資料就被移到中心區域如右圖所示,對於大多數啟用函式而言,這個區域的梯度都是最大的或者是有梯度的(比如relu),這可以看做是一種對抗梯度消失的有效手段。對於一層如此,如果對於每一層資料都那麼做的話,資料的分布總是在隨著變化敏感的區域,相當於不用考慮資料分布變化了,這樣訓練起來更有效率。
那麼為什麼要有第4步,不是僅使用減均值除方差操作就能獲得目的效果嗎?我們思考乙個問題,減均值除方差得到的分布是正態分佈,我們能否認為正態分佈就是最好或最能體現我們訓練樣本的特徵分布呢?不能,比如資料本身就很不對稱,或者啟用函式未必是對方差為1的資料最好的效果,比如sigmoid啟用函式,在-1~1之間的梯度變化不大,那麼非線性變換的作用就不能很好的體現,換言之就是,減均值除方差操作後可能會削弱網路的效能!針對該情況,在前面三步之後加入第4步完成真正的batch normalization。
bn的本質就是利用優化變一下方差大小和均值位置,使得新的分布更切合資料的真實分布,保證模型的非線性表達能力。bn的極端的情況就是這兩個引數等於mini-batch的均值和方差,那麼經過batch normalization之後的資料和輸入完全一樣,當然一般的情況是不同的。
在訓練時,我們會對同一批的資料的均值和方差進行求解,進而進行歸一化操作。但是對於**時我們的均值和方差怎麼求呢?比如我們**單個樣本時,那還怎麼求均值和方法呀!其實是這種樣子的,對於**階段時所使用的均值和方差,其實也是**於訓練集。比如我們在模型訓練時我們就記錄下每個batch下的均值和方差,待訓練完畢後,我們求整個訓練樣本的均值和方差期望值,作為我們進行**時進行bn的的均值和方差:
最後測試階段,bn的使用公式就是:
關於bn的使用位置,在cnn中一般應作用與非線性啟用函式之前,s型函式s(x)的自變數x是經過bn處理後的結果。因此前向傳導的計算公式就應該是:
其實因為偏置引數b經過bn層後其實是沒有用的,最後也會被均值歸一化,當然bn層後面還有個β引數作為偏置項,所以b這個引數就可以不用了。因此最後把bn層+啟用函式層就變成了:
注意前面寫的都是對於一般情況,對於卷積神經網路有些許不同。因為卷積神經網路的特徵是對應到一整張特徵響應圖上的,所以做bn時也應以響應圖為單位而不是按照各個維度。比如在某一層,batch大小為m,響應圖大小為w×h,則做bn的資料量為m×w×h。
bn在深層神經網路的作用非常明顯:若神經網路訓練時遇到收斂速度較慢,或者「梯度**」等無法訓練的情況發生時都可以嘗試用bn來解決。同時,常規使用情況下同樣可以加入bn來加速模型訓練,甚至提公升模型精度。
批歸一化作用 深度學習中批歸一化的陷阱
批歸一化技術 batch normalization 是深度學習中最近出現的乙個有效的技術,已經被廣泛證明其有效性,並很快應用於研究和應用中去。這篇文章假設讀者知道什麼是批歸一化,並對批歸一化有一定程度的了解,知道它是如何工作的。如果你是剛剛接觸這個概念,或者需要複習一下,您可以在後面的鏈結位址找到...
(九)批量歸一化
1 引入 對輸入資料做了歸一化處理,就是將每個特徵在所有樣本上的值轉歸一化成均值0方差1。這樣我們保證訓練資料裡數值都同樣量級上,從而使得訓練的時候數值更加穩定。對於淺層模型來說,通常資料歸一化預處理足夠有效。輸出數值在只經過幾個神經層後通常不會出現劇烈變化。但對於深層神經網路來說,情況一般比較複雜...
特徵歸一化的方法 線性歸一化 零均值歸一化
常用歸一化方法 1 線性歸一化,線性歸一化會把輸入資料都轉換到 0 1 的範圍,公式如下 該方法實現對原始資料的等比例縮放,其中xnorm為歸一化後的資料,x為原始資料,xmax xmin分別為原始資料集的最大值和最小值。優點 通過利用變數取值的最大值和最小值將原始資料轉換為界於某一特定範圍的資料,...