BN(Batch Normalization)層的詳細介紹

Yankee_PG13發表於2019-04-08

1.BN層的前世:LRN層( Local Response Normalization)

沒有提出BN層之前,Alexnet網路使用LRN層來處理歸一化的。
LRN(區域性響應歸一化)

  • bx,yib^i_{x,y}是歸一化後的值,i是通道的位置,代表更新第幾個通道的值,x與y代表待更新畫素的位置。
  • ax,yia^i_{x,y} 是輸入值,是啟用函式Relu的輸出值
  • k、alpha、beta、n/2 都是自定義係數,可以先不用理會有什麼用。
  • N是總的通道數,不同通道累加的平方和。 累加多少個通道的畫素值呢?這個是取決於自定義係數 n/2
sqr_sum[a, b, c, d] = sum(input[a,b, c, d - depth_radius : d + depth_radius + 1] ** 2)
output = input / (bias +alpha * sqr_sum) ** beta

LRN現在用的很少了

2.BN層的引入原因

參考部落格:https://www.cnblogs.com/guoyaohua/p/8724433.html
BN的提出是為了解決“Internal Covariate Shift”問題的。
機器學習領域有個很重要的假設:IID獨立同分布假設,就是假設訓練資料和測試資料是滿足相同分佈的,這是通過訓練資料獲得的模型能夠在測試集獲得好的效果的一個基本保障。
但對於深度學習這種包含很多隱層的網路結構,在訓練過程中,因為各層引數不停在變化,所以每個隱層都會面臨covariate shift的問題,也就是在訓練過程中,隱層的輸入分佈老是變來變去,這就是所謂的“Internal Covariate Shift”,Internal指的是深層網路的隱層,是發生在網路內部的事情,而不是covariate shift問題只發生在輸入層。

3.BN層的本質

BN的基本思想其實相當直觀:因為深層神經網路在做非線性變換前的啟用輸入值(就是那個x=WU+B,U是輸入)隨著網路深度加深或者在訓練過程中,其分佈逐漸發生偏移或者變動,之所以訓練收斂慢,一般是整體分佈逐漸往非線性函式的取值區間的上下限兩端靠近(對於Sigmoid函式來說,意味著啟用輸入值WU+B是大的負值或正值),所以這導致反向傳播時低層神經網路的梯度消失,這是訓練深層神經網路收斂越來越慢的本質原因,而BN就是通過一定的規範化手段,把每層神經網路任意神經元這個輸入值的分佈強行拉回到均值為0方差為1的標準正態分佈,其實就是把越來越偏的分佈強制拉回比較標準的分佈,這樣使得啟用輸入值落在非線性函式對輸入比較敏感的區域,這樣輸入的小變化就會導致損失函式較大的變化,意思是這樣讓梯度變大,避免梯度消失問題產生,而且梯度變大意味著學習收斂速度快,能大大加快訓練速度。

相關文章