爲何要作特徵歸一化/標準化?

[TOC]html

博客:blog.shinelee.me | 博客園 | CSDNgit

寫在前面


Feature scaling,常見的提法有「特徵歸一化」、「標準化」,是數據預處理中的重要技術,有時甚至決定了算法能不能work以及work得好很差。談到feature scaling的必要性,最經常使用的2個例子多是:github

  • 特徵間的單位(尺度)可能不一樣,好比身高和體重,好比攝氏度和華氏度,好比房屋面積和房間數,一個特徵的變化範圍多是$[1000, 10000]\(,另外一個特徵的變化範圍多是\)[-0.1, 0.2]$,在進行距離有關的計算時,單位的不一樣會致使計算結果的不一樣,尺度大的特徵會起決定性做用,而尺度小的特徵其做用可能會被忽略,爲了消除特徵間單位和尺度差別的影響,以對每維特徵同等看待,須要對特徵進行歸一化算法

  • 原始特徵下,因尺度差別,其損失函數的等高線圖多是橢圓形,梯度方向垂直於等高線,降低會走zigzag路線,而不是指向local minimum。經過對特徵進行zero-mean and unit-variance變換後,其損失函數的等高線圖更接近圓形,梯度降低的方向震盪更小,收斂更快,以下圖所示,圖片來自Andrew Ng。網絡

    Feature Scaling from Andrew Ng

對於feature scaling中最常使用的Standardization,彷佛「無腦上」就好了,本文想多探究一些爲何,session

  • 經常使用的feature scaling方法都有哪些?
  • 什麼狀況下該使用什麼feature scaling方法?有沒有一些指導思想?
  • 全部的機器學習算法都須要feature scaling嗎?有沒有例外?
  • 損失函數的等高線圖都是橢圓或同心圓嗎?能用橢圓和圓來簡單解釋feature scaling的做用嗎?
  • 若是損失函數的等高線圖很複雜,feature scaling還有其餘直觀解釋嗎?

根據查閱到的資料,本文將嘗試回答上面的問題。但筆者能力有限,空有困惑,能講到哪算哪吧(微笑)。機器學習

經常使用feature scaling方法


在問爲何前,先看是什麼。ide

給定數據集,令特徵向量爲$x$,維數爲$D$,樣本數量爲$R$,可構成$D \times R$的矩陣,一列爲一個樣本,一行爲一維特徵,以下圖所示,圖片來自Hung-yi Lee pdf-Gradient Descent函數

feature matrix

feature scaling的方法能夠分紅2類,逐行進行和逐列進行。逐行是對每一維特徵操做,逐列是對每一個樣本操做,上圖爲逐行操做中特徵標準化的示例。學習

具體地,經常使用feature scaling方法以下,來自wiki

  • Rescaling (min-max normalization、range scaling)

    \[ x^{\prime}=a+\frac{(x-\min (x))(b-a)}{\max (x)-\min (x)} \]

    將每一維特徵線性映射到目標範圍$[a, b]$,即將最小值映射爲$a$,最大值映射爲$b$,經常使用目標範圍爲$[0, 1]\(和\)[-1, 1]\(,特別地,映射到\)[0, 1]$計算方式爲:

    \[ x^{\prime}=\frac{x-\min (x)}{\max (x)-\min (x)} \]
  • Mean normalization

    \[ x^{\prime}=\frac{x-\bar{x}}{\max (x)-\min (x)} \]

    均值映射爲0,同時用最大值最小值的差對特徵進行歸一化,一種更常見的作法是用標準差進行歸一化,以下。

  • Standardization (Z-score Normalization)

    \[ x^{\prime}=\frac{x-\bar{x}}{\sigma} \]

    每維特徵0均值1方差(zero-mean and unit-variance)

  • Scaling to unit length

    \[ x^{\prime}=\frac{x}{\|x\|} \]

    將每一個樣本的特徵向量除以其長度,即對樣本特徵向量的長度進行歸一化,長度的度量常使用的是L2 norm(歐氏距離),有時也會採用L1 norm,不一樣度量方式的一種對比能夠參見論文「CVPR2005-Histograms of Oriented Gradients for Human Detection」

上述4種feature scaling方式,前3種爲逐行操做,最後1種爲逐列操做。

容易讓人困惑的一點是指代混淆,Standardization指代比較清晰,可是單說Normalization有時會指代min-max normalization,有時會指代Standardization,有時會指代Scaling to unit length

計算方式上對比分析


前3種feature scaling的計算方式爲減一個統計量再除以一個統計量,最後1種爲除以向量自身的長度

  • 減一個統計量能夠當作選哪一個值做爲原點,是最小值仍是均值,並將整個數據集平移到這個新的原點位置。若是特徵間偏置不一樣對後續過程有負面影響,則該操做是有益的,能夠當作是某種偏置無關操做;若是原始特徵值有特殊意義,好比稀疏性,該操做可能會破壞其稀疏性。
  • 除以一個統計量能夠當作在座標軸方向上對特徵進行縮放,用於下降特徵尺度的影響,能夠當作是某種尺度無關操做。縮放可使用最大值最小值間的跨度,也可使用標準差(到中心點的平均距離),前者對outliers敏感,outliers對後者影響與outliers數量和數據集大小有關,outliers越少數據集越大影響越小。
  • 除以長度至關於把長度歸一化,把全部樣本映射到單位球上,能夠當作是某種長度無關操做,好比,詞頻特徵要移除文章長度的影響,圖像處理中某些特徵要移除光照強度的影響,以及方便計算餘弦距離或內積類似度等。

稀疏數據、outliers相關的更多數據預處理內容能夠參見scikit learn-5.3. Preprocessing data

從幾何上觀察上述方法的做用,圖片來自CS231n-Neural Networks Part 2: Setting up the Data and the Loss,zero-mean將數據集平移到原點,unit-variance使每維特徵上的跨度至關,圖中能夠明顯看出兩維特徵間存在線性相關性,Standardization操做並無消除這種相關性。

Standardization

可經過PCA方法移除線性相關性(decorrelation),即引入旋轉,找到新的座標軸方向,在新座標軸方向上用「標準差」進行縮放,以下圖所示,圖片來自連接,圖中同時描述了unit length的做用——將全部樣本映射到單位球上。

Effect of the operations of standardization and length normalization

當特徵維數更多時,對好比下,圖片來自youtube

feature scaling comparison

總的來講,歸一化/標準化的目的是爲了得到某種「無關性」——偏置無關、尺度無關、長度無關……當歸一化/標準化方法背後的物理意義和幾何含義與當前問題的須要相契合時,其對解決該問題就有正向做用,反之,就會起副作用。因此,「什麼時候選擇何種方法」取決於待解決的問題,即problem-dependent。

feature scaling 須要仍是不須要


下圖來自data school-Comparing supervised learning algorithms,對比了幾個監督學習算法,最右側兩列爲是否須要feature scaling。

Comparing supervised learning algorithms

下面具體分析一下。

何時須要feature scaling?

  • 涉及或隱含距離計算的算法,好比K-means、KNN、PCA、SVM等,通常須要feature scaling,由於

    • zero-mean通常能夠增長樣本間餘弦距離或者內積結果的差別,區分力更強,假設數據集集中分佈在第一象限遙遠的右上角,將其平移到原點處,能夠想象樣本間餘弦距離的差別被放大了。在模版匹配中,zero-mean能夠明顯提升響應結果的區分度。

    • 就歐式距離而言,增大某個特徵的尺度,至關於增長了其在距離計算中的權重,若是有明確的先驗知識代表某個特徵很重要,那麼適當增長其權重可能有正向效果,但若是沒有這樣的先驗,或者目的就是想知道哪些特徵更重要,那麼就須要先feature scaling,對各維特徵等而視之

    • 增大尺度的同時也增大了該特徵維度上的方差,PCA算法傾向於關注方差較大的特徵所在的座標軸方向,其餘特徵可能會被忽視,所以,在PCA前作Standardization效果可能更好,以下圖所示,圖片來自scikit learn-Importance of Feature Scaling

      PCA and Standardization

  • 損失函數中含有正則項時,通常須要feature scaling:對於線性模型$y=wx+b$而言,$x$的任何線性變換(平移、放縮),均可以被$w$和$b$「吸取」掉,理論上,不會影響模型的擬合能力。可是,若是損失函數中含有正則項,如$\lambda ||w||^2$,$\lambda$爲超參數,其對$w$的每個參數施加一樣的懲罰,但對於某一維特徵$x_i$而言,其scale越大,係數$w_i$越小,其在正則項中的比重就會變小,至關於對$w_i$懲罰變小,即損失函數會相對忽視那些scale增大的特徵,這並不合理,因此須要feature scaling,使損失函數平等看待每一維特徵。

  • 梯度降低算法,須要feature scaling。梯度降低的參數更新公式以下,

    \[ W(t+1)=W(t)-\eta \frac{d E(W)}{d W} \]

    $E(W)\(爲損失函數,**收斂速度取決於:參數的初始位置到local minima的距離,以及學習率\)\eta$的大小**。一維狀況下,在local minima附近,不一樣學習率對梯度降低的影響以下圖所示,

    Gradient descent for different learning rates

    多維狀況下能夠分解成多個上圖,每一個維度上分別降低,參數$W$爲向量,但學習率只有1個,即全部參數維度共用同一個學習率(暫不考慮爲每一個維度都分配單獨學習率的算法)。**收斂意味着在每一個參數維度上都取得極小值,每一個參數維度上的偏導數都爲0,可是每一個參數維度上的降低速度是不一樣的,爲了每一個維度上都能收斂,學習率應取全部維度在當前位置合適步長中最小的那個。**下面討論feature scaling對gradient descent的做用,

    • zero center與參數初始化相配合,縮短初始參數位置與local minimum間的距離,加快收斂。模型的最終參數是未知的,因此通常隨機初始化,好比從0均值的均勻分佈或高斯分佈中採樣獲得,對線性模型而言,其分界面初始位置大體在原點附近,bias常常初始化爲0,則分界面直接經過原點。同時,爲了收斂,學習率不會很大。而每一個數據集的特徵分佈是不同的,若是其分佈集中且距離原點較遠,好比位於第一象限遙遠的右上角,分界面可能須要花費不少步驟才能「爬到」數據集所在的位置。因此,不管什麼數據集,先平移到原點,再配合參數初始化,能夠保證分界面必定會穿過數據集。此外,outliers常分佈在數據集的外圍,與分界面從外部向內挪動相比,從中心區域開始挪動可能受outliers的影響更小。

    • 對於採用均方偏差損失LMS的線性模型,損失函數恰爲二階,以下圖所示

      \[ E(W)=\frac{1}{2 P} \sum_{p=1}^{P}\left|d^{p}-\sum_{i} w_{i} x_{i}^{p}\right|^{2} \]

      不一樣方向上的降低速度變化不一樣(二階導不一樣,曲率不一樣),恰由輸入的協方差矩陣決定,feature scaling改變了損失函數的形狀,減少不一樣方向上的曲率差別。將每一個維度上的降低分解來看,給定一個降低步長,若是不夠小,有的維度降低的多,有的降低的少,有的還可能在上升,損失函數的總體表現多是上升也多是降低,就會不穩定。scaling後不一樣方向上的曲率相對更接近,更容易選擇到合適的學習率,使降低過程相對更穩定。

    • 另有從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。

何時不須要Feature Scaling?

  • 與距離計算無關的機率模型,不須要feature scaling,好比Naive Bayes;
  • 與距離計算無關的基於樹的模型,不須要feature scaling,好比決策樹、隨機森林等,樹中節點的選擇只關注當前特徵在哪裏切分對分類更好,即只在乎特徵內部的相對大小,而與特徵間的相對大小無關。

小結


這篇文章寫的十分艱難,一開始覺得蠻簡單直接,但隨着探索的深刻,冒出的問號愈來愈多,打破了不少原來的「理所固然」,因此,在寫的過程當中不停地作加法,不少地方想解釋得儘可能直觀,又不想照搬太多公式,但本身的理解又不夠深入,致使如今敘述這麼冗長,但願之後在寫文時能更專一更精煉。

Sigh。。。

參考


相關文章
相關標籤/搜索