1.視頻網站:mooc慕課https://mooc.study.163.com/university/deeplearning_ai#/c
2.詳細筆記網站(中文):http://www.ai-start.com/dl2017/
3.github課件+作業+答案:https://github.com/stormstone/deeplearning.ai
1.9 歸一化輸入 Normalizing inputs
訓練NN,其中一個加速訓練的方法就是歸一化輸入。
如上圖,數據集的散點圖。
假設一個訓練集有兩個特徵,輸入特徵爲2維,歸一化需要兩個步驟:
- step1:零均值
向量X等於每個訓練數據 x 減去,即X := x-μ
,意思是移動訓練集,直到它完成零均值化。如下圖。
- step2:歸一化方差
注意:上圖中特徵的方差比特徵的方差要大得多
我們要做的是給賦值。
這是元素的平方。是一個向量,它的每個特徵都有方差。
到此,我們已經完成零值均化,或者說元素就是方差。我們把向量X所有數據除以向量,即X /=σ**2
,最後變成下圖形式。
此時和的方差都等於1,如下圖。
提示一下,如果你用它來調整訓練數據,那麼也用相同的和來歸一化測試集。尤其是,你不希望訓練集和測試集的歸一化有所不同。所以你要用同樣的方法調整測試集,而不是在訓練集和測試集上分別預估和。
訓練數據和測試數據都是通過相同和定義的相同數據轉換,其中和是由訓練集數據計算得來的。
爲什麼我們想要歸一化輸入特徵?
上面是代價函數J公式。
我們來對比一下非歸一化和歸一化代價函數有什麼不同。
- 非歸一化的輸入特徵
如果你使用非歸一化的輸入特徵,代價函數會像這樣
這是一個非常細長狹窄的代價函數,最小值應該在原點。
但如果特徵值在不同範圍,假如取值範圍從1到1000,特徵的取值範圍從0到1,結果是參數和值的範圍或比率將會非常不同。
上圖數據軸應該是和,但爲了便於直觀理解,圖中標記爲w和b。代價函數就有點像狹長的碗一樣,如果你能畫出該函數的部分輪廓,它會是這樣一個狹長的函數,如下圖。
如果你在上圖這樣的代價函數上運行梯度下降法,你必須使用一個非常小的學習率。
如上圖,梯度下降法可能從圖中左下方開始,需要多次迭代過程,直到最後找到最小值。
- 歸一化特徵
然而如果你歸一化特徵,代價函數平均起來看更對稱。
此時代價函數是一個更圓的球形輪廓。如上圖,不論從哪個位置開始,梯度下降法都能夠更直接地找到最小值,你可以在梯度下降法中使用較大步長,而不需要像在非歸一化狹長圖中那樣反覆執行。
當然,實際上w是一個高維向量,因此用二維繪製並不能正確地傳達並直觀理解。但總得來說,代價函數更圓一些,就更容易優化。前提是特徵都在相似範圍內,而不是一個特徵從1到1000,另外特徵從0到1的範圍,而是特徵都在-1到1範圍內或相似偏差,這使得代價函數優化起來更簡單快速。
實際上如果假設特徵範圍在0-1之間,的範圍在-1到1之間,範圍在1-2之間,它們是相似範圍,所以算法運行會表現得很好。
當它們在非常不同的取值範圍內,如其中一個從1到1000,另一個從0到1,這對優化算法非常不利。但是僅將它們設置爲均化零值,假設方差爲1,確保所有特徵都在相似範圍內,通常可以幫助學習算法運行得更快。
所以如果輸入特徵處於不同範圍內,可能有些特徵值從0到1,有些從1到1000,那麼歸一化特徵值就非常重要了。如果特徵值處於相似範圍內,那麼歸一化就不是很重要了。執行這類歸一化並不會產生什麼危害,我通常會做歸一化處理,雖然我不確定它能否提高訓練或算法速度。
總結
- 輸入特徵處於相似範圍內,不一定要歸一化。
- 輸入特徵處於不同範圍內,一定要歸一化。
執行這類歸一化並不會產生什麼危害,所以別管範圍,都做吧。