為什麼要 Batch Normalization 批标準化 (深度學習
- 普通資料标準化
- 每層都做标準化
- BN 添加位置
- BN 效果
- BN 算法
普通資料标準化

Batch Normalization, 批标準化, 和普通的資料标準化類似, 是将分散的資料統一的一種做法, 也是優化神經網絡的一種方法. 在之前 Normalization 的簡介視訊中我們一提到, 具有統一規格的資料, 能讓機器學習更容易學習到資料之中的規律.
每層都做标準化
在神經網絡中, 資料分布對訓練會産生影響. 比如某個神經元 x 的值為1, 某個 Weights 的初始值為 0.1, 這樣後一層神經元計算結果就是 Wx = 0.1; 又或者 x = 20, 這樣 Wx 的結果就為 2. 現在還不能看出什麼問題, 但是, 當我們加上一層激勵函數, 激活這個 Wx 值的時候, 問題就來了. 如果使用 像 tanh 的激勵函數, Wx 的激活值就變成了 ~0.1 和 ~1, 接近于 1 的部已經處在了 激勵函數的飽和階段, 也就是如果 x 無論再怎麼擴大, tanh 激勵函數輸出值也還是 接近1. 換句話說, 神經網絡在初始階段已經不對那些比較大的 x 特征範圍 敏感了. 這樣很糟糕, 想象我輕輕拍自己的感覺和重重打自己的感覺居然沒什麼差别, 這就證明我的感官系統失效了. 當然我們是可以用之前提到的對資料做 normalization 預處理, 使得輸入的 x 變化範圍不會太大, 讓輸入值經過激勵函數的敏感部分. 但剛剛這個不敏感問題不僅僅發生在神經網絡的輸入層, 而且在隐藏層中也經常會發生.
隻是時候 x 換到了隐藏層當中, 我們能不能對隐藏層的輸入結果進行像之前那樣的normalization 處理呢? 答案是可以的, 因為大牛們發明了一種技術, 叫做 batch normalization, 正是處理這種情況.
BN 添加位置
Batch normalization 的 batch 是批資料, 把資料分成小批小批進行 stochastic gradient descent. 而且在每批資料進行前向傳遞 forward propagation 的時候, 對每一層都進行 normalization 的處理,
BN 效果
Batch normalization 也可以被看做一個層面. 在一層層的添加神經網絡的時候, 我們先有資料 X, 再添加全連接配接層, 全連接配接層的計算結果會經過 激勵函數 成為下一層的輸入, 接着重複之前的操作. Batch Normalization (BN) 就被添加在每一個全連接配接和激勵函數之間.
之前說過, 計算結果在進入激勵函數前的值很重要, 如果我們不單單看一個值, 我們可以說, 計算結果值的分布對于激勵函數很重要. 對于資料值大多分布在這個區間的資料, 才能進行更有效的傳遞. 對比這兩個在激活之前的值的分布. 上者沒有進行 normalization, 下者進行了 normalization, 這樣當然是下者能夠更有效地利用 tanh 進行非線性化的過程.
沒有 normalize 的資料 使用 tanh 激活以後, 激活值大部分都分布到了飽和階段, 也就是大部分的激活值不是-1, 就是1, 而 normalize 以後, 大部分的激活值在每個分布區間都還有存在. 再将這個激活後的分布傳遞到下一層神經網絡進行後續計算, 每個區間都有分布的這一種對于神經網絡就會更加有價值. Batch normalization 不僅僅 normalize 了一下資料, 他還進行了反 normalize 的手續. 為什麼要這樣呢?
BN 算法
我們引入一些 batch normalization 的公式. 這三步就是我們在剛剛一直說的 normalization 工序, 但是公式的後面還有一個反向操作, 将 normalize 後的資料再擴充和平移. 原來這是為了讓神經網絡自己去學着使用和修改這個擴充參數 gamma, 和 平移參數 β, 這樣神經網絡就能自己慢慢琢磨出前面的 normalization 操作到底有沒有起到優化的作用, 如果沒有起到作用, 我就使用 gamma 和 belt 來抵消一些 normalization 的操作.
最後我們來看看一張神經網絡訓練到最後, 代表了每層輸出值的結果的分布圖. 這樣我們就能一眼看出 Batch normalization 的功效啦. 讓每一層的值在有效的範圍内傳遞下去.