您當前的位置:首頁 > 收藏

什麼是批標準化 (Batch Normalization)

作者:由 莫煩 發表于 收藏時間:2022-02-25

數學是達成目的的工具, 理解才是達成目的橋樑, 所以這篇文章用淺顯易懂的動畫闡述了複雜的機器學習概念.

強烈推薦透過動畫的形式瞭解。

所以首先放影片連結: Youtube 或者 優酷。

程式碼實現請來這裡看: Python 實現

普通資料標準化

什麼是批標準化 (Batch Normalization)

Batch Normalization, 批標準化, 和普通的資料標準化類似, 是將分散的資料統一的一種做法, 也是最佳化神經網路的一種方法。 在之前 Normalization 的簡介影片中我們一提到, 具有統一規格的資料, 能讓機器學習更容易學習到資料之中的規律。

每層都做標準化

什麼是批標準化 (Batch 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

變化範圍不會太大,

讓輸入值經過激勵函式的敏感部分。 但剛剛這個不敏感問題不僅僅發生在神經網路的輸入層,

而且在隱藏層中也經常會發生。

什麼是批標準化 (Batch Normalization)

只是時候 x

換到了隱藏層當中,

我們能不能對隱藏層的輸入結果進行像之前那樣的normalization 處理呢? 答案是可以的, 因為大牛們發明了一種技術,

叫做 batch

normalization,

正是處理這種情況。

BN 新增位置

Batch normalization 的 batch 是批資料, 把資料分成小批小批進行 stochastic gradient descent。 而且在每批資料進行前向傳遞 forward propagation 的時候, 對每一層都進行 normalization 的處理,

什麼是批標準化 (Batch Normalization)

BN 效果

Batch normalization 也可以被看做一個層面。 在一層層的新增神經網路的時候,

我們先有資料 X, 再新增全連線層,

全連線層的計算結果會經過 激勵函式 成為下一層的輸入, 接著重複之前的操作。 Batch Normalization (BN)

就被新增在每一個全連線和激勵函式之間。

什麼是批標準化 (Batch Normalization)

之前說過,

計算結果在進入激勵函式前的值很重要, 如果我們不單單看一個值,

我們可以說,

計算結果值的分佈對於激勵函式很重要。 對於資料值大多分佈在這個區間的資料, 才能進行更有效的傳遞。 對比這兩個在啟用之前的值的分佈。

上者沒有進行 normalization, 下者進行了 normalization, 這樣當然是下者能夠更有效地利用 tanh

進行非線性化的過程。

什麼是批標準化 (Batch Normalization)

沒有 normalize

的資料 使用 tanh

啟用以後,

啟用值大部分都分佈到了飽和階段, 也就是大部分的啟用值不是-1,

就是1,

而 normalize 以後, 大部分的啟用值在每個分佈區間都還有存在。

再將這個啟用後的分佈傳遞到下一層神經網路進行後續計算, 每個區間都有分佈的這一種對於神經網路就會更加有價值。

Batch

normalization 不僅僅 normalize 了一下資料, 他還進行了反 normalize 的手續。 為什麼要這樣呢?

BN 演算法

什麼是批標準化 (Batch Normalization)

我們引入一些

batch

normalization 的公式。 這三步就是我們在剛剛一直說的 normalization 工序, 但是公式的後面還有一個反向操作,

將 normalize 後的資料再擴充套件和平移。 原來這是為了讓神經網路自己去學著使用和修改這個擴充套件引數 gamma, 和 平移引數 β, 這樣神經網路就能自己慢慢琢磨出前面的 normalization 操作到底有沒有起到最佳化的作用,

如果沒有起到作用,

我就使用 gamma

和 belt

來抵消一些 normalization 的操作。

什麼是批標準化 (Batch Normalization)

最後我們來看看一張神經網路訓練到最後,

代表了每層輸出值的結果的分佈圖。 這樣我們就能一眼看出 Batch

normalization 的功效啦。 讓每一層的值在有效的範圍內傳遞下去。

如果你對 Batch Normalization 感興趣, 也想實際動手做做看, 這還有更多使用 python 來編寫 Batch Normalization 的教程: 莫煩 Python