↑↑↑點擊上方藍字,回覆資料,10個G的驚喜
導讀
本文解讀了一項數據預處理中的重要技術——特徵歸一化,提出並解答了5個相關問題,同時分析了相關方法和適用場景。
寫在前面
-
特徵間的單位(尺度)可能不同,比如身高和體重,比如攝氏度和華氏度,比如房屋面積和房間數,一個特徵的變化範圍可能是[1000, 10000],另一個特徵的變化範圍可能是[−0.1,0.2],在進行距離有關的計算時,單位的不同會導致計算結果的不同,尺度大的特徵會起決定性作用,而尺度小的特徵其作用可能會被忽略,爲了消除特徵間單位和尺度差異的影響,以對每維特徵同等看待,需要對特徵進行歸一化。
-
原始特徵下,因尺度差異,其損失函數的等高線圖可能是橢圓形,梯度方向垂直於等高線,下降會走zigzag路線,而不是指向local minimum。通過對特徵進行zero-mean and unit-variance變換後,其損失函數的等高線圖更接近圓形,梯度下降的方向震盪更小,收斂更快,如下圖所示,圖片來自Andrew Ng。
-
常用的feature scaling方法都有哪些? -
什麼情況下該使用什麼feature scaling方法?有沒有一些指導思想? -
所有的機器學習算法都需要feature scaling嗎?有沒有例外? -
損失函數的等高線圖都是橢圓或同心圓嗎?能用橢圓和圓來簡單解釋feature scaling的作用嗎? -
如果損失函數的等高線圖很複雜,feature scaling還有其他直觀解釋嗎?
常用feature scaling方法
-
Rescaling (min-max normalization、range scaling):
-
Mean normalization:
-
Standardization (Z-score Normalization):
-
Scaling to unit length:
計算方式上對比分析
-
減一個統計量可以看成 選哪個值作爲原點,是最小值還是均值,並將整個數據集平移到這個新的原點位置。如果特徵間偏置不同對後續過程有負面影響,則該操作是有益的,可以看成是某種 偏置無關操作;如果原始特徵值有特殊意義,比如稀疏性,該操作可能會破壞其稀疏性。 -
除以一個統計量可以看成在 座標軸方向上對特徵進行縮放,用於 降低特徵尺度的影響,可以看成是某種尺度無關操作。縮放可以使用最大值最小值間的跨度,也可以使用標準差(到中心點的平均距離),前者對outliers敏感,outliers對後者影響與outliers數量和數據集大小有關,outliers越少數據集越大影響越小。 -
除以長度相當於把長度歸一化, 把所有樣本映射到單位球上,可以看成是某種 長度無關操作,比如,詞頻特徵要移除文章長度的影響,圖像處理中某些特徵要移除光照強度的影響,以及方便計算餘弦距離或內積相似度等。
feature scaling 需要還是不需要
什麼時候需要feature scaling?
-
涉及或隱含距離計算的算法,比如K-means、KNN、PCA、SVM等,一般需要feature scaling,因爲:
-
損失函數中含有正則項時,一般需要feature scaling:對於線性模型y=wx+b而言,x的任何線性變換(平移、放縮),都可以被w和b“吸收”掉,理論上,不會影響模型的擬合能力。但是,如果損失函數中含有正則項,如λ∣∣w∣∣^2,λ爲超參數,其對w的每一個參數施加同樣的懲罰,但對於某一維特徵xi而言,其scale越大,係數wi越小,其在正則項中的比重就會變小,相當於對wi懲罰變小,即損失函數會相對忽視那些scale增大的特徵,這並不合理,所以需要feature scaling,使損失函數平等看待每一維特徵。
-
梯度下降算法,需要feature scaling。梯度下降的參數更新公式如下,
-
zero center與參數初始化相配合,縮短初始參數位置與local minimum間的距離,加快收斂。模型的最終參數是未知的,所以一般隨機初始化,比如從0均值的均勻分佈或高斯分佈中採樣得到,對線性模型而言,其分界面初始位置大致在原點附近,bias經常初始化爲0,則分界面直接通過原點。同時,爲了收斂,學習率不會很大。而每個數據集的特徵分佈是不一樣的,如果其分佈集中且距離原點較遠,比如位於第一象限遙遠的右上角,分界面可能需要花費很多步驟才能“爬到”數據集所在的位置。所以,無論什麼數據集,先平移到原點,再配合參數初始化,可以保證分界面一定會穿過數據集。此外,outliers常分佈在數據集的外圍,與分界面從外部向內挪動相比,從中心區域開始挪動可能受outliers的影響更小。
-
對於採用均方誤差損失LMS的線性模型,損失函數恰爲二階,如下圖所示
-
另有從Hessian矩陣特徵值以及condition number角度的理解,詳見Lecun paper-Efficient BackProp中的Convergence of Gradient Descent一節,有清晰的數學描述,同時還介紹了白化的作用——解除特徵間的線性相關性,使每個維度上的梯度下降可獨立看待。
-
文章開篇的橢圓形和圓形等高線圖,僅在採用均方誤差的線性模型上適用,其他損失函數或更復雜的模型,如深度神經網絡,損失函數的error surface可能很複雜,並不能簡單地用橢圓和圓來刻畫,所以用它來解釋feature scaling對所有損失函數的梯度下降的作用,似乎過於簡化,見Hinton vedio-3.2 The error surface for a linear neuron。
-
對於損失函數不是均方誤差的情況,只要權重w與輸入特徵x間是相乘關係,損失函數對w的偏導必然含有因子x,w的梯度下降速度就會受到特徵x尺度的影響。理論上爲每個參數都設置上自適應的學習率,可以吸收掉x尺度的影響,但在實踐中出於計算量的考慮,往往還是所有參數共用一個學習率,此時x尺度不同可能會導致不同方向上的下降速度懸殊較大,學習率不容易選擇,下降過程也可能不穩定,通過scaling可對不同方向上的下降速度有所控制,使下降過程相對更穩定。
-
對於傳統的神經網絡,對輸入做feature scaling也很重要,因爲採用sigmoid等有飽和區的激活函數,如果輸入分佈範圍很廣,參數初始化時沒有適配好,很容易直接陷入飽和區,導致梯度消失,所以,需要對輸入做Standardization或映射到[0,1]、[−1,1],配合精心設計的參數初始化方法,對值域進行控制。但自從有了Batch Normalization,每次線性變換改變特徵分佈後,都會重新進行Normalization,似乎可以不太需要對網絡的輸入進行feature scaling了?但習慣上還是會做feature scaling。
不同方向上的下降速度變化不同(二階導不同,曲率不同),恰由輸入的協方差矩陣決定,通過scaling改變了損失函數的形狀,減小不同方向上的曲率差異。將每個維度上的下降分解來看,給定一個下降步長,如果不夠小,有的維度下降的多,有的下降的少,有的還可能在上升,損失函數的整體表現可能是上升也可能是下降,就會不穩定。scaling後不同方向上的曲率相對更接近,更容易選擇到合適的學習率,使下降過程相對更穩定。
什麼時候不需要Feature Scaling?
小結
推薦閱讀
(點擊標題可跳轉閱讀)
老鐵,三連支持一下,好嗎?↓↓↓
本文分享自微信公衆號 - 機器學習算法與Python實戰(tjxj666)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。