error surface如果很崎嶇,那么就代表比較難train,我們有沒有辦法去改變這個landscape呢
可以用batch normalization.
- 如果 ( x_1 ) 的取值范圍很小(如 1, 2),而 ( x_2 ) 的取值范圍很大(如 100, 200),那么 ( w_2 ) 的變化會對輸出 ( \hat{y} ) 產生更大的影響,進而導致損失 ( L ) 的變化也很大(+ΔL large)。
- 這會導致梯度更新時,某些方向變化很大,某些方向變化很小,優化過程不平衡。
- 如果特征的尺度差異很大,損失函數的地形會很“陡峭”或“扁平”,導致梯度下降時路徑彎曲,優化困難。
- 經過特征歸一化后,損失函數的地形變得“圓滑”,各個方向變化一致,優化路徑更直接,收斂更快。
我們想要這個loss landscape變得平滑,就要進行特征歸一化
feature normalization
將每一維的數值特征歸一化,使他們平均為0,方差為1
我們經過一層normalization后的x經過w得到z再經過activate function得到a,那么a和z實際上對w2是input,那么就有可能特征差異大,所以要在z或者a再做一次normalization,在哪里做其實差異不大
z是向量/矩陣,但是經過normalization后,每一個z的小改變就會引起后面三個a的改變,相比input時候是單獨改變
為什么說這個network是一個large的network?
歸一化操作本身就把原本“每個樣本獨立”的網絡,變成了“所有樣本互相關聯”的大網絡
因為我們沒辦法把所有的這個data都進行normalization,改為在一個batch做normalization
我們再歸一化之后還要讓機器learn出來γ和β干什么呢?這樣子不就會導致我們每一個dimension的分布不接近了嗎?
我們一開始會設置兩個參數向量分別為1和0,讓訓練初期的dimension分布比較接近,找到一個好的error surface后再慢慢加進去
如果我們真正在做application的時候,資料不是一個batch的傳進來,我們無法累計到一個batch再計算,我們就得用滑動平均來計算