訓練神經網絡,其中一個加速訓練的方法就是歸一化輸入。
假設我們有一個訓練集,它有兩個輸入特征,即輸入特征x是二維的,
下圖是數據集的散點圖。
歸一化輸入需要兩個步驟,第一步是零均值化,即每個元素減去均值操作,公式如下:
結果如下圖:
第二步是,歸一化方差,上圖中,特征x1的方差比特征x2的方差要大的多,處理如下:
最后,數據分布形式如下圖:
此時,x1和x2的方差都等於1。
如果你在訓練數據進行歸一化后,那么就要用與訓練數據相同的μ和σ來歸一化測試集。
為什么我們要將輸入特征歸一化?
回想一下,代價函數的定義為:
如果你使用非歸一化的輸入特征,那么代價函數將會像下圖左側圖那樣,這是一個非常細長狹窄的代價函數。如果x1的取值范圍從1到1000,x2的范圍是從0到1,結果是參數w1和w2的范圍或比率將會非常不同。如果你能畫出該函數的部分輪廓,它會是這樣一個狹長的函數。然而,如果你歸一化特征,代價函數平均起來更對稱。如果你在左圖這樣的代價函數上運行梯度下降法,你必須使用一個非常小的學習率,因為如果初始位置位於下圖紅色箭頭的位置,梯度下降法可能需要多次迭代過程,直到找到最小值。但如果函數是一個更圓的球形輪廓,那么不論從哪個位置開始,梯度下降法都能夠更直接地找到最小值,你可以在梯度下降法中使用較大步長,而不需要像在左圖那樣反復執行。當然,實際上w是一個高維向量,因此用二維繪制w並不能正確地傳達直觀理解,但總的直觀理解是當特征都在相似范圍內時,代價函數會更圓一點,而且更容易優化。
實際上,如果假設特征x1范圍在0~1之間,x2范圍在-1~1之間,x3范圍在1~2之間,它們的范圍比較相似,所以會表現得很好;當它們范圍相差很大時,如x1范圍在0~1000之間,那么這對優化算法非常不利。
所以,如果輸入特征處於不同的范圍,而且范圍相差比較大,那么歸一化特征值就非常重要了。如果特征值處於相似范圍,那么歸一化就不是很重要,但執行歸一化也沒有壞處。因此當不確定歸一化是否可以提高訓練或者算法速度時,可以使用歸一化操作。