文章目錄
- 白化的不足[1][2]
- BN算法
- BN的訓練[3][4]
- 全連接配接層的BN[5]
- 卷積層的BN[5]
- BN的測試[6]
- BN的原理
- 原論文[2][7][8][9]
- 新研究:BN算法的效果隻是一個偶然?[11][12][13]
- BN的位置[15][16]
白化的不足[1][2]
【機器學習】最小最大值歸一化,标準化,PCA白化,ZCA白化
白化能夠去除資料特征之前的相關性并标準化資料。如果網絡模型的輸入經過白化,網絡訓練的會收斂得更快。對于多層神經網絡,能否在每層都使用PCA白化處理呢?
這不行得通。因為白化需要計算協方差矩陣、矩陣分解等操作,計算量會很大。另外,在反向傳播時,白化的操作不一定可微。
對于多層神經網絡,可以使用批量标準化(Batch Normalization,BN)算法進行标準化。
BN算法
BN算法将傳統機器學習中的資料标準化方法應用到深度神經網絡中,對神經網絡中隐藏層的輸出進行标準化,進而使得網絡訓練準确率更高,訓練更快。
深度線性網絡對Mnist資料集分類,使用BN前後效果對比:
圖檔來源:[2]
深度卷積網絡(inception網絡)對ImageNet資料集分類,使用BN前後效果對比:
圖檔來源:[2]
BN的訓練[3][4]
資料經過白化預處理後,滿足兩個條件:
a、特征之間的相關性降低;
b、資料被标準化,也就是使得每一維特征均值為0,标準差為1。
為了簡化計算,BN算法忽略了第1個要求,僅僅使用了下面的公式進行近似白化處理:
(1)計算小批量均值:
(2)計算小批量方差:
(3) 标準化
需要注意的是,神經網絡的訓練大多采用小批量随機梯度下降,是以上面的均值和方差指的是一批訓練資料的均值和方差。
這種強制轉化可能會導緻資料的分布發生破壞,是以還需要進行仿射變換。
(4) 仿射變換
仿射變換就是在标準化的公式的基礎之上使用兩個參數進行縮放和偏移。這樣在訓練過程中就可以反向傳播學習這兩個參數,調整分布。
全連接配接層的BN[5]
對于全連接配接層,加入BN算法前後如圖所示:
加入前 | 加入後 |
圖檔來源:[11]
舉個例子:
設一全連接配接網絡訓練時一個批次有個樣本:。
對于樣本,全連接配接層的輸出:
其中第個神經元輸出值為:
進行标準化:
,分别指的是一批訓練資料,第個神經元輸出值(,…)的平均值和标準差。
然後進行仿射變換:
每一個神經元都會有一對這樣的參數,即與神經元個數相等。
還可以注意到,當:,時,。即BN是可以恢複出标準化處理前的資料分布的。
原論文中,BN層是接在激活函數之前的(下文會讨論BN層與激活函數的順序問題),在沒有采用BN的時候,激活函數計算公式是這樣的:
采用BN算法後,計算公式變成:
其實因為偏置參數經過BN層後會被均值标準化掉,是以這個參數就可以不用了,計算公式變成:
卷積層的BN[5]
對于卷積層,BN算法把一整張特征圖當做一個神經元進行處理。
同樣舉個例子:
假設一個批次有個樣本。每個樣本經過三個卷積核卷積後得到三張特征圖,對于,可以得到:。
其中
進行标準化:
,指的是一批訓練資料,第1個通道特征圖(,…張特征圖)所有資料值的平均值,标準差。若特征圖的尺寸是,則計算每一個平均值和标準差需要處理的資料數就是:。
然後進行仿射變換:
對應第1通道的特征圖。特征圖有幾個通道就有幾個 和 。也就是說 和 個數與特征圖的通道數或者說卷積核的個數相等。
之後的激活函數與全連接配接類似,這裡略過。
BN的測試[6]
測試階段我們可能隻輸入一個或較少批量的測試樣本。那麼,上面的均值、标準差 要從哪裡來?最後測試階段,BN公式中的均值和方差不應該是針對某一個批次,而是要針對整個資料集。是以,在訓練過程中除了正常的前向傳播和反向求導之外,我們還要記錄每一個批次的均值和方差,以便訓練完成之後按照下式計算整體的均值和方差:
上面簡單了解就是:對于均值來說直接計算所有批次 值的平均值;然後對于标準偏差采用每個批次 均值的無偏估計。
實際實作時用和的平均的滑動平均去代替:
# running_mean 為均值的滑動平均,x_mean為目前批次的均值
running_mean = momentum *x_mean + (1 - momentum) * running_mean
# running_var 為方差的滑動平均,x_var為目前批次的方差
running_var = momentum * x_var + (1 - momentum) * running_var
動量值
momentum
一般取0.1,0.01,0.001。
BN的原理
原論文[2][7][8][9]
BatchNorm提出的主要動機之一是減少所謂的内部協變量偏移(Internal Covariate Shift)(ICS)。在深度神經網絡中,一個神經層的輸入是之前神經層的輸出.給定一個神經層 ,它之前的神經層的參數變化會導緻其輸入的分布發生較大的改變。當使用随機梯度下降來訓練網絡時,每次參數更新都會導緻該神經層的輸入分布發生改變。越深的層,其輸入分布會改變得越明顯。這種變化會導緻模型學習的分布不斷變化,是以被認為會對訓練過程産生不利影響。為了緩解這個問題,該論文對每一個神經層的輸入進行歸一化操作,使其分布保持穩定。把每個神經層的輸入分布都歸一化,可以使得不論低層的參數如何變化,高層的輸入保持相對穩定。同時可以使得我們更加高效地進行參數初始化以及超參數選擇。
BN的效果總結如下:
(1)BN使得網絡中每層輸入資料的分布相對穩定,加速模型學習速度
BN通過規範化與線性變換使得每一層網絡的輸入資料的均值與方差都在一定範圍内,使得後一層網絡不必不斷去适應底層網絡中輸入的變化,進而實作了網絡中層與層之間的解耦,允許每一層進行獨立學習,有利于提高整個神經網絡的學習速度。
(2) BN使得模型對網絡中的參數不那麼敏感,簡化調參過程,使得網絡學習更加穩定。
在神經網絡中,我們經常會謹慎地采用一些權重初始化方法或者合适的學習率來保證網絡穩定訓練。使用BN後則可以大膽一點。
(3)BN緩解梯度消失問題,是以允許網絡使用飽和性激活函數(例如sigmoid,tanh等)。
在不使用BN層的時候,由于網絡的深度與複雜性,很容易使得底層網絡變化累積到上層網絡中,導緻模型的訓練很容易進入到激活函數的梯度飽和區;通過标準化操作可以讓激活函數的輸入資料落在梯度非飽和區,緩解梯度消失的問題;另外通過自适應學習 與 又讓資料保留更多的原始資訊。如圖:
圖檔來源:[10]
(4)BN具有一定的正則化效果。
在BN中,由于我們使用小批量的均值與方差作為對整體訓練樣本均值與方差的估計,盡管每一個批次中的資料都是從總體樣本中抽樣得到,但不同批次的均值與方差會有所不同,這就為網絡的學習過程中增加了随機噪音,與Dropout通過關閉神經元給網絡訓練帶來噪音類似,在一定程度上對模型起到了正則化的效果。
BN算法的提出者認為BN算法解決了深度神經網絡内部協方差偏移的問題,但後來的研究者發現并非如此。BN能取得很好的效果是因為它使得優化地形更平滑。
新研究:BN算法的效果隻是一個偶然?[11][12][13]
這篇論文實驗證明了BatchNorm的有效性與内部協方差偏移無關:在BN層後加入噪聲使分布發生偏移,得到的效果與不加噪聲的BN差不多。此外,“有噪聲”的BatchNorm網絡比普通的非BatchNorm網絡具有更不穩定的資料分布,但它在訓練方面仍然表現得更好。
還證明BatchNorm也沒有明顯減少ICS:用每一層在它之前所有層參數更新前後的損失梯度差異來衡量ICS的程度。實驗得到添加BN後ICS反而更嚴重( 理想值是0,理想值是1)。
備注:VGG是一種深度卷積網路,DLN是深度線性網絡。
然後經過一系列實驗和理論推導證明BN算法可以使得神經網絡的優化地形(Optimization Landscape)更加平滑:
如下圖視覺效果(右邊為更平滑的優化地形):
圖檔來源:[14]
左圖中,損失函數的優化地形不僅是非凸的,而且有大量的“扭結”、平坦區域和尖銳區域。這使得基于梯度下降的訓練算法不穩定。類似右圖,BN算法使得神經網絡的優化地形(Optimization Landscape)更加平滑;這使得任何基于梯度的訓練算法采取更大的步長,也不會有遇到平坦區域(對應于消失的梯度)或尖銳的局部最小值(導緻梯度爆炸)。梯度更具可靠性、可預測性。是以,當我們在計算梯度的方向上使用較大的步長時,這個梯度方向在邁出那一步後仍然是對實際梯度方向的一個相當準确的估計。這反過來又使我們能夠使用更大的學習率,并使訓練速度顯著加快。這意味着網絡對超參數,網絡初始化參數選擇的敏感性降低了。
作者還發現,使用-範數進行标準化(不是正則化)也能有BatchNorm相當的性能,都提高了優化地形的平滑度。而且,對于深度線性網絡,-範數标準化的性能甚至比BN算法更好。
深度卷積網絡:
深度線性網絡:
請注意,–範數标準化比普通網絡(即沒有标準化的網絡)有更大的分布偏移,但它們仍能提高優化性能。這表明BN算法能有這麼好的效果可能是偶然的!是以,有必要對标準化方案的設計進行原理性的探索,因為可能還有更好的标準化方案。
BN的位置[15][16]
原論文将BN層置于卷積層之後,激活函數之前。下面這項研究用實驗表明這種位置設定不一定是最好的。
該論文對BN層的三個不同位置進行了研究,這些位置是:
- arrangement# 1:卷積層和非線性激活函數之間的BN層(原論文的順序)
- arrangement# 2:非線性激活函數之後的BN層
- arrangement# 3:卷積層之前的BN層
資料集:
使用了 CIFAR10, CIFAR100 and Tiny ImagNet 這三個資料集,
資料集 | 種類 | 數目 | 圖像大小 |
CIFAR10 | 10類 | 每類6000張樣本 | |
CIFAR100 | 100類 | 每類600張樣本 | 尺寸為 |
Tiny ImageNet | 200類 | 每類500樣本 | 尺寸被resize到 |
可以看到資料集複雜度是逐漸上升的。
網絡:
AlexNet、VGG16、ResNet-20,深度是逐漸增加的。
(1)AlexNet:
對于AlexNet,在每個Conv層之前使用BN層效果會更好。
(2)VGG-16:
對于不同的資料集,VGG-16使用的各種排列順序都各有千秋。
(3)RESNET-20:
在比較複雜的ResNet網絡裡面,可以看到,簡單資料集裡面的表現,#1略優于#2,但是在複雜資料集裡面,#1比#2提升很多
圖檔來源:[17]
結語:
本文提到的論文在公衆号背景回複
bnnb
即可擷取。希望本文能抛磚引玉。
參考:
[1]https://blog.csdn.net/qq_37100442/article/details/81776191
[2] Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift https://arxiv.org/abs/1502.03167
[3]https://blog.csdn.net/hjimce/article/details/50866313
[4]https://blog.csdn.net/malefactor/article/details/51476961
[5]https://zhuanlan.zhihu.com/p/54171297
[6]https://blog.csdn.net/qq_41853758/article/details/82930944
[7]https://zhuanlan.zhihu.com/p/34879333
[8]https://zhuanlan.zhihu.com/p/55852062
[9] 《神經網絡與深度學習》作者:邱錫鵬
[10]https://www.cnblogs.com/skyfsm/p/8453498.html
[11] How Does Batch Normalization Help Optimization? https://arxiv.org/abs/1805.11604
[12]https://zhuanlan.zhihu.com/p/64312433
[13]https://zhuanlan.zhihu.com/p/66683061
[14] Visualizing the Loss Landscape of Neural Nets https://arxiv.org/abs/1712.09913
[15]https://zhuanlan.zhihu.com/p/97557391
[16] An Empirical Study on Position of the Batch Normalization Layer in Convolutional Neural Networks https://arxiv.org/abs/1912.04259