Batch Normalization

深度神經網絡難訓練一個重要的緣由就是深度神經網絡涉及不少層的疊加,每一層的參數變化都會致使下一層輸入數據分佈的變化,隨着層數的增長,高層輸入數據分佈變化會很是劇烈,這就使得高層須要不斷適應低層的參數更新。爲了訓練好模型,咱們須要謹慎初始化網絡權重,調整學習率等。網絡

原理分析

爲了解決這個問題,一個比較直接的想法就是對每層輸入數據都進行標準化。Batch Normalization確實就是這樣作的。Batch Normalization的基本思想就是:將每一批次數據輸入下一層神經元以前,先對其作平移和伸縮變換,將輸入數據的分佈規範爲固定區間範圍內的標準分佈。Batch Normalization的公式表示以下:函數

 

這時咱們可能會有些疑問,第一步不是已經獲得標準化分佈了嗎,爲何還要再使用第二步變回去呢? 性能

答案是:爲了保證模型的表達能力,第二步是必不可少的學習

咱們發現,第一步將每一層的輸入數據都規範化爲均值爲0,標準差爲1的分佈。那麼咱們仔細想一下,這樣作會帶來什麼問題?orm

每一層神經元都在不斷的學習,可是不管其如何努力(參數如何變化),其輸出的結果在交給下一層神經元以前都會被強制規範化到均值爲0,標準差爲1的分佈。那咱們還學個鬼啊!這樣訓練出來的神經網絡模型表達能力天然不好。blog

因此,咱們須要使用第二步將規範化後的數據再平移縮放到均值爲$\beta $,標準差爲$\gamma $的分佈,充分考慮每一層神經元的學習結果。固然,這兩個參數是可學習的,每一層的和會有所不一樣。io

總結

訓練快,還能提高性能,爲啥不用。TensorFlow、Keras和Pytorch都集成了Batch Normalization的函數,可直接調用。原理

相關文章
相關標籤/搜索