深入探討:為什麼要做特徵歸一化/標準化?
點選上方“3D視覺工坊”,選擇“星標”
乾貨第一時間送達
作者丨shine-lee
來源丨https://blog.csdn.net/blogshinelee/article/details/102875044
編輯丨極市平臺
導讀
本文解讀了一項資料預處理中的重要技術——特徵歸一化,提出並解答了5個相關問題,同時分析了相關方法和適用場景。
寫在前面
Feature scaling,常見的提法有“特徵歸一化”、“標準化”,是資料預處理中的重要技術,有時甚至決定了演算法能不能work以及work得好不好。談到feature scaling的必要性,最常用的2個例子可能是:
特徵間的單位(尺度)可能不同,比如身高和體重,比如攝氏度和華氏度,比如房屋面積和房間數,一個特徵的變化範圍可能是[1000, 10000],另一個特徵的變化範圍可能是[−0.1,0.2],在進行距離有關的計算時,單位的不同會導致計算結果的不同,尺度大的特徵會起決定性作用,而尺度小的特徵其作用可能會被忽略,為了消除特徵間單位和尺度差異的影響,以對每維特徵同等看待,需要對特徵進行歸一化
原始特徵下,因尺度差異,其損失函式的等高線圖可能是橢圓形,梯度方向垂直於等高線,下降會走zigzag路線,而不是指向local minimum。通過對特徵進行zero-mean and unit-variance變換後,其損失函式的等高線圖更接近圓形,梯度下降的方向震盪更小,收斂更快,如下圖所示,圖片來自Andrew Ng。
對於feature scaling中最常使用的Standardization,似乎“無腦上”就行了,本文想多探究一些為什麼,
常用的feature scaling方法都有哪些?
什麼情況下該使用什麼feature scaling方法?有沒有一些指導思想?
所有的機器學習演算法都需要feature scaling嗎?有沒有例外?
損失函式的等高線圖都是橢圓或同心圓嗎?能用橢圓和圓來簡單解釋feature scaling的作用嗎?
如果損失函式的等高線圖很複雜,feature scaling還有其他直觀解釋嗎?
根據查閱到的資料,本文將嘗試回答上面的問題。但筆者能力有限,空有困惑,能講到哪算哪吧(微笑)。
常用feature scaling方法
在問為什麼前,先看是什麼。
給定資料集,令特徵向量為x,維數為D,樣本數量為R,可構成D×R的矩陣,一列為一個樣本,一行為一維特徵,如下圖所示,圖片來自Hung-yi Lee pdf-Gradient Descent:
feature scaling的方法可以分成2類,逐行進行和逐列進行。逐行是對每一維特徵操作,逐列是對每個樣本操作,上圖為逐行操作中特徵標準化的示例。
具體地,常用feature scaling方法如下,來自wiki,
Rescaling (min-max normalization、range scaling):
將每一維特徵線性對映到目標範圍[a,b],即將最小值對映為a,最大值對映為b,常用目標範圍為[0,1]和[−1,1],特別地,對映到[0,1]計算方式為:
Mean normalization:
將均值對映為0,同時用最大值最小值的差對特徵進行歸一化,一種更常見的做法是用標準差進行歸一化,如下。
Standardization (Z-score Normalization):
每維特徵0均值1方差(zero-mean and unit-variance)。
Scaling to unit length:
將每個樣本的特徵向量除以其長度,即對樣本特徵向量的長度進行歸一化,長度的度量常使用的是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操作並沒有消除這種相關性。
可通過PCA方法移除線性相關性(decorrelation),即引入旋轉,找到新的座標軸方向,在新座標軸方向上用“標準差”進行縮放,如下圖所示,圖片來自連結,圖中同時描述了unit length的作用——將所有樣本對映到單位球上。
當特徵維數更多時,對比如下,圖片來自youtube,
總的來說,歸一化/標準化的目的是為了獲得某種“無關性”——偏置無關、尺度無關、長度無關……當歸一化/標準化方法背後的物理意義和幾何含義與當前問題的需要相契合時,其對解決該問題就有正向作用,反之,就會起反作用。所以,“何時選擇何種方法”取決於待解決的問題,即problem-dependent。
feature scaling 需要還是不需要
下圖來自data school-Comparing supervised learning algorithms,對比了幾個監督學習演算法,最右側兩列為是否需要feature scaling。
下面具體分析一下。
什麼時候需要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“吸收”掉,理論上,不會影響模型的擬合能力。但是,如果損失函式中含有正則項,如λ∣∣w∣∣^2,λ為超引數,其對w的每一個引數施加同樣的懲罰,但對於某一維特徵xi而言,其scale越大,係數wi越小,其在正則項中的比重就會變小,相當於對wi懲罰變小,即損失函式會相對忽視那些scale增大的特徵,這並不合理,所以需要feature scaling,使損失函式平等看待每一維特徵。
梯度下降演算法,需要feature scaling。梯度下降的引數更新公式如下,
E(W)為損失函式,收斂速度取決於:引數的初始位置到local minima的距離,以及學習率η的大小。一維情況下,在local minima附近,不同學習率對梯度下降的影響如下圖所示:
多維情況下可以分解成多個上圖,每個維度上分別下降,引數W為向量,但學習率只有1個,即所有引數維度共用同一個學習率(暫不考慮為每個維度都分配單獨學習率的演算法)。收斂意味著在每個引數維度上都取得極小值,每個引數維度上的偏導數都為0,但是每個引數維度上的下降速度是不同的,為了每個維度上都能收斂,學習率應取所有維度在當前位置合適步長中最小的那個。下面討論feature scaling對gradient descent的作用,
zero center與引數初始化相配合,縮短初始引數位置與local minimum間的距離,加快收斂。模型的最終引數是未知的,所以一般隨機初始化,比如從0均值的均勻分佈或高斯分佈中取樣得到,對線性模型而言,其分介面初始位置大致在原點附近,bias經常初始化為0,則分介面直接通過原點。同時,為了收斂,學習率不會很大。而每個資料集的特徵分佈是不一樣的,如果其分佈集中且距離原點較遠,比如位於第一象限遙遠的右上角,分介面可能需要花費很多步驟才能“爬到”資料集所在的位置。所以,無論什麼資料集,先平移到原點,再配合引數初始化,可以保證分介面一定會穿過資料集。此外,outliers常分佈在資料集的外圍,與分介面從外部向內挪動相比,從中心區域開始挪動可能受outliers的影響更小。
對於採用均方誤差損失LMS的線性模型,損失函式恰為二階,如下圖所示
不同方向上的下降速度變化不同(二階導不同,曲率不同),恰由輸入的協方差矩陣決定,通過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,比如決策樹、隨機森林等,樹中節點的選擇只關注當前特徵在哪裡切分對分類更好,即只在意特徵內部的相對大小,而與特徵間的相對大小無關。
小結
這篇文章寫得十分艱難,一開始以為蠻簡單直接,但隨著探索的深入,冒出的問號越來越多,打破了很多原來的“理所當然”,所以,在寫的過程中不停地做加法,很多地方想解釋得儘量直觀,又不想照搬太多公式,但自己的理解又不夠深刻,導致現在敘述這麼冗長,希望以後在寫文時能更專注更精煉。
參考文獻
1.wiki-Feature scaling
2.wiki-Backpropagation
3.[Hung-yi Lee pdf-Gradient Descent](<http://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2016/Lecture/Gradient Descent (v2).pdf>)
4.quora-Why does mean normalization help in gradient descent?
5.scikit learn-Importance of Feature Scaling
6.scikit learn-5.3. Preprocessing data
7.scikit learn-Compare the effect of different scalers on data with outliers
8.data school-Comparing supervised learning algorithms
9.Lecun paper-Efficient BackProp
10.Hinton vedio-3.2 The error surface for a linear neuron
11.CS231n-Neural Networks Part 2: Setting up the Data and the Loss
12.ftp-Should I normalize/standardize/rescale the data?
13.medium-Understand Data Normalization in Machine Learning
14.Normalization and Standardization
15.How and why do normalization and feature scaling work?
16.Is it a good practice to always scale/normalize data for machine learning?
17.When conducting multiple regression, when should you center your predictor variables & when should you standardize them?
本文僅做學術分享,如有侵權,請聯絡刪文。
下載1
在「3D視覺工坊」公眾號後臺回覆:3D視覺,即可下載 3D視覺相關資料乾貨,涉及相機標定、三維重建、立體視覺、SLAM、深度學習、點雲後處理、多檢視幾何等方向。
下載2
在「3D視覺工坊」公眾號後臺回覆:3D視覺github資源彙總,即可下載包括結構光、標定原始碼、缺陷檢測原始碼、深度估計與深度補全原始碼、點雲處理相關原始碼、立體匹配原始碼、單目、雙目3D檢測、基於點雲的3D檢測、6D姿態估計原始碼彙總等。
下載3
在「3D視覺工坊」公眾號後臺回覆:相機標定,即可下載獨家相機標定學習課件與視訊網址;後臺回覆:立體匹配,即可下載獨家立體匹配學習課件與視訊網址。
重磅!3DCVer-學術論文寫作投稿交流群已成立
掃碼新增小助手微信,可申請加入3D視覺工坊-學術論文寫作與投稿微信交流群,旨在交流頂會、頂刊、SCI、EI等寫作與投稿事宜。
同時也可申請加入我們的細分方向交流群,目前主要有3D視覺、CV&深度學習、SLAM、三維重建、點雲後處理、自動駕駛、CV入門、三維測量、VR/AR、3D人臉識別、醫療影像、缺陷檢測、行人重識別、目標跟蹤、視覺產品落地、視覺競賽、車牌識別、硬體選型、學術交流、求職交流等微信群。
一定要備註:研究方向+學校/公司+暱稱,例如:”3D視覺+ 上海交大 + 靜靜“。請按照格式備註,可快速被通過且邀請進群。原創投稿也請聯絡。
▲長按加微信群或投稿
▲長按關注公眾號
3D視覺從入門到精通知識星球:針對3D視覺領域的知識點彙總、入門進階學習路線、最新paper分享、疑問解答四個方面進行深耕,更有各類大廠的演算法工程人員進行技術指導。與此同時,星球將聯合知名企業釋出3D視覺相關演算法開發崗位以及專案對接資訊,打造成集技術與就業為一體的鐵桿粉絲聚集區,近2000星球成員為創造更好的AI世界共同進步,知識星球入口:
學習3D視覺核心技術,掃描檢視介紹,3天內無條件退款
圈裡有高質量教程資料、可答疑解惑、助你高效解決問題
覺得有用,麻煩給個贊和在看~