更新於 2024/05/01閱讀時間約 2 分鐘

類神經網路訓練 批次標準化 (Batch Normalization)

Q: 通常我們在找參數的過程中會發現,我們有沒有辦法改善error surface,讓他看起來不那麼複雜?!

A: 我們可以通過Batch Normalization解決這個問題。


在調整兩個參數的error surface中,w1與w2的斜率差異過大,才會造成error surface的圖形太過複雜。所以我們可以想想,怎麼樣讓w1與w2產生變化時,loss的變化不會很大,這樣就可以將error surface簡單化?


假設有一個function: y = w1x1+w2x2,如果x1的值很小(像是x1 = 1, 2),x2的值很大(像是x2 = 1000, 2000),則每當w1變化時,y的變化也會很小,但x2變化時,y的變化就會變大,這樣就會造成error surface很複雜。

-> 所以如果我們可以讓x1與x2的變化同步,就能讓error surface簡單化。

-> Feature normalization就可以解決這樣的問題。


Feature Normalization

首先,我們根據不同的dimension,求出每個dimension的平均值mean, 標準差standard deviation。

之後,將該dimension的所有值,放入normalization的公式,得到新的值:

i = xi - m / σi,再放回原本的feature內。

透過這樣的方法,loss在計算時,收斂的速度就會快很多,訓練也會順利很多。


但這有個問題,就是在機器學習中,通常都是非常大量的數據在訓練,這會太過龐大。

所以我們通常會以一個batch作為基準去計算normalization。

-> 這就是Batch Normalization。


除此之外,我們也要注意的是,在normalization之後,還是會通過與參數W的計算或是sigmoid的計算,得到新的值,這樣的值有可能造成原本侷限在0~1的值被放大到差異化加大。所以適時也要為計算完的數值再次做normalization。


Testing normalization value

但我們在訓練完進到testing環節,很多時候沒辦法等一個batch size的資料量都完整後才進行normalization,所以通常pytorch在進行normalization時,會計算moving average,透過已經算出來的batch average,評估出目前的平均值應該是多少。

計算方法: u = pu + (1-p)ut

u: 到目前為止算出來的平均

ut:第t個batch的平均

p: 由我們自己設定的hyperparameter(pytorch設定為0.1)

透過這樣的方式,我們能得到moving average的平均值u, 與標準差σ

可以直接透過這樣的方式計算出batch normalization。



分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.