1 特徵數據的標準化
- 針對每一類型做標準化而不是整個數據
- 令數據統一跨度加速數據處理
兩種標準化的方法:
2 Batch Normalization
Batch Normalization(批標準化), 是將分散的數據統一的一種做法, 也是優化神經網絡的一種方法.
2.1 WHY Batch Normalization
x 無論再怎麼擴大, tanh 激勵函數輸出值也還是 接近1. 換句話說, 神經網絡在初始階段已經不對那些比較大的 x 特徵範圍 敏感。
在沒有進行Feature Scaling之前,如果兩個輸入數據x1,x2的distribution很不均勻的話,導致w2對計算結果的影響比較大(圖左),所以訓練的時候,橫縱方向上需要給與一個不同的training rate,在w1方向需要一個更大的learning rate,w2方向給與一個較小的learning rate,不過這樣做的辦法卻不見得很簡單。所以對不同Feature做了normalization之後,使得error surface看起來比較接近正圓(圖右),就可以使訓練容易得多。
2.2 How to Batch Normalization
2.2.1 Feature Scaling
下面一共有R個data,分別計算每個維度的平均值,標準差,然後再使用圖片那個簡單的公式進行一下normalization,就可以把所有維度的平均值變爲0,方差變爲1了。一般來說,進行Feature Scaling之後可以使梯度下降算法更快收斂。
2.2.2 Internal Covariate Shift
對每一個layer的輸入進行Feature Scaling,其實這樣對deep learning的訓練是很有幫助的,因爲它讓Internal Covariate Shift下降,那麼Internal Covariate Shift是個什麼問題呢,可以按照下圖來理解,每個小人手上都有一個話筒只有他們將兩個話筒對接在一塊才能很好地像後面傳遞信息。
現在我們看一下中間那個小人在訓練的時候爲了將兩個話筒拉到同一個水平高度,它會將左手邊的話筒放低一點,同時右手的話筒放低一點,因爲是同時兩邊都變,所以就可能出現了下面的圖。
在過去的解決方法是調小learning rate,因爲沒對上就是因爲學習率太大導致的,雖然體調小learning rate可以很好地解決這個問題,但是又會導致訓練速度變得很慢。
2.2.3 How to Batch Normalization
那麼把剛纔的話筒轉化爲deep learning中就是說,訓練過程參數在調整的時候前一個層是後一個層的輸入,當前一個層的參數改變之後也會改變後一層的參數。當後面的參數按照前面的參數學好了之後前面的layer就變了。
其實輸入數據很好normalization,因爲輸入數據是固定下來的,但是後面層的參數在不斷變化根本就不能那麼容易算出mean和variance,所以需要一個新的技術叫Batch normalization。
Train
- 對每層進行Batch Normalization的時候一般都是先進行normalization再傳進
active function的,優點是可以讓輸入更多地落在active function (比如sigmoid和tanh)的微分比較大的地方也就是零附近。 - 先對一層的輸出求平均值 和方差 ,然後normalization,可以得到每個維度的平均值爲零,方差爲1。
- 修正操作:將 normalize 後的數據再擴展和平移。 原來這是爲了讓神經網絡自己去學着使用和修改這個擴展參數 , 和 平移參數 , 這樣神經網絡就能自己慢慢琢磨出前面的 normalization 操作到底有沒有起到優化的作用, 如果沒有起到作用, 我就使用 和 來抵消一些 normalization 的操作。
- 網絡的反向傳播:反向傳播回來的時候是會通過 然後通過 然後去更新 。在BP過程中需要考慮 和 ,因爲 和 依賴於Z,改動了Z就相當於改動了 和 。
Test
Testing的時候只有一筆data輸入到網絡中,不能估計出 和 ,這裏提供兩個思路估算testing時候的 和 :
- Ideal Solution:直接在整個training dataset上計算 和 ,但實際中由於training dataset太大或者training dataset沒有留下來,一般不採用這個方法。
- Practical Solution:把過去所有Batch的 和 都算出來,例如途中
2.3 Benefit
- Less Covariate Shift, 用更大的學習率
- 避免梯度消失
- 學習過程中被數據初始化影響較小
- 降低正則化的要求(有時候能夠取代Dropout)