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就可以解決這樣的問題。
首先,我們根據不同的dimension,求出每個dimension的平均值mean, 標準差standard deviation。
之後,將該dimension的所有值,放入normalization的公式,得到新的值:
x̂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。