Batch Norm

Normalizing activations in a network

在機器學習中很多算法都是通過添加變量來獲取某種“靈活性”或者更廣闊的"適應範圍",並且使得有機會通過"學習"來獲得最合適的參數。
例如在"Normalizing activations in a network"中提到的,我們先把z(i)進行normalizing,這時z(i)norm就會變爲相對狹小的一個範圍內的數值,但是實際情況可能確實是一個比較大的範圍,那麼怎麼辦呢?通過加權重變量可以讓它重新擁有變化範圍,這跟原先的z是不同的,原先的z過來後就不變了,它可能是個很大的值,也可能是很小的值,但是對於加了權重變量的z(i)norm而言,它是變化的,是可以學習的。

  • 如上圖最右側的座標圖,當normalizing之後,znorm會被限制在一個較小的範圍內,這導致了sigmoid退化成了接近線性函數。
  • 爲避免上述情況,則需要加γ和β,γ和β使得z<~</up>可以擁有更寬闊的範圍,而且γ和β是通過training而調整的。

Fitting Batch Norm into a neural network

針對一個完整的神經網絡,batch norm如下運用


  • 可以看出在所有神經元的計算過程中,在z[l] 和 a[l]之間進行了batch norm計算
  • 最終梯度下降的過程中,同樣也會計算dβ和dγ,(可以簡單地認爲又加了一層神經網絡,但是計算方式不同)
  • 實際項目中可以通過框架的函數來實現batch norm,如圖中所示運用了TensorFlow的庫函數可以直接一行代碼實現batch norm
  • 當我們使用mini-batches的時候,均值𝜇和𝜎是當前batch的𝜎和𝜇,所以每個batch可能不一樣
  • 另外,由於計算均值𝜇的時候,常數項會相減,所以常數項b可以忽略掉

綜合起來,如下圖所示:


  • 在梯度下降的過程中,我們仍然可以運用momentum或者adam算法來加速梯度下降

Why does Batch Norm work

首先Andrew講了一個概念叫"Covariate shift", 即當訓練集變化的時候,通常我們都需要重新訓練我們的模型,如下圖所示



而在深度學習的過程中,每個隱層對於下一層來說就相當於輸入層,而這個隱層的輸出卻會不斷改變,如下圖所示:


  • 由於w, b的不斷變化,導致hidden layer的a也不斷變化,這就產生了"covariate shift"問題,所以模型訓練就不穩定。
  • 而batch-norm將a輸出變爲相對穩定的範圍,從而導致給下一層的輸出變得穩定,這樣就可以解決"covariate shift"問題
  • batch-norm相當於給每一層進行了解耦合,使得每層的訓練不會相互影響

另外,Andrew還提到了batch-nom還有輕微的正則化效果。

Batch Norm at test time


通過在batch-mini的計算過程中同時計算𝜇和𝜎的指數加權平均值,可以得到一個𝜇和𝜎的平均數,然後用這個平均數作爲test時的𝜇和𝜎即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章