為什么要做特征的歸一化/標準化?
點擊上方“小白學視覺”,選擇加"星標"或“置頂”
重磅干貨,第一時間送達
特征間的單位(尺度)可能不同,比如身高和體重,比如攝氏度和華氏度,比如房屋面積和房間數(shù),一個特征的變化范圍可能是[1000, 10000],另一個特征的變化范圍可能是[?0.1,0.2],在進行距離有關(guān)的計算時,單位的不同會導致計算結(jié)果的不同,尺度大的特征會起決定性作用,而尺度小的特征其作用可能會被忽略,為了消除特征間單位和尺度差異的影響,以對每維特征同等看待,需要對特征進行歸一化。
原始特征下,因尺度差異,其損失函數(shù)的等高線圖可能是橢圓形,梯度方向垂直于等高線,下降會走zigzag路線,而不是指向local minimum。通過對特征進行zero-mean and unit-variance變換后,其損失函數(shù)的等高線圖更接近圓形,梯度下降的方向震蕩更小,收斂更快,如下圖所示,圖片來自Andrew Ng。

常用的feature scaling方法都有哪些? 什么情況下該使用什么feature scaling方法?有沒有一些指導思想? 所有的機器學習算法都需要feature scaling嗎?有沒有例外? 損失函數(shù)的等高線圖都是橢圓或同心圓嗎?能用橢圓和圓來簡單解釋feature scaling的作用嗎? 如果損失函數(shù)的等高線圖很復雜,feature scaling還有其他直觀解釋嗎?
常用feature scaling方法
Rescaling (min-max normalization、range scaling):


Mean normalization:

Standardization (Z-score Normalization):

Scaling to unit length:

計算方式上對比分析
減一個統(tǒng)計量可以看成選哪個值作為原點,是最小值還是均值,并將整個數(shù)據(jù)集平移到這個新的原點位置。如果特征間偏置不同對后續(xù)過程有負面影響,則該操作是有益的,可以看成是某種偏置無關(guān)操作;如果原始特征值有特殊意義,比如稀疏性,該操作可能會破壞其稀疏性。 除以一個統(tǒng)計量可以看成在坐標軸方向上對特征進行縮放,用于降低特征尺度的影響,可以看成是某種尺度無關(guān)操作??s放可以使用最大值最小值間的跨度,也可以使用標準差(到中心點的平均距離),前者對outliers敏感,outliers對后者影響與outliers數(shù)量和數(shù)據(jù)集大小有關(guān),outliers越少數(shù)據(jù)集越大影響越小。 除以長度相當于把長度歸一化,把所有樣本映射到單位球上,可以看成是某種長度無關(guān)操作,比如,詞頻特征要移除文章長度的影響,圖像處理中某些特征要移除光照強度的影響,以及方便計算余弦距離或內(nèi)積相似度等。



feature scaling 需要還是不需要

什么時候需要feature scaling?
涉及或隱含距離計算的算法,比如K-means、KNN、PCA、SVM等,一般需要feature scaling,因為:
損失函數(shù)中含有正則項時,一般需要feature scaling:對于線性模型y=wx+b而言,x的任何線性變換(平移、放縮),都可以被w和b“吸收”掉,理論上,不會影響模型的擬合能力。但是,如果損失函數(shù)中含有正則項,如λ∣∣w∣∣^2,λ為超參數(shù),其對w的每一個參數(shù)施加同樣的懲罰,但對于某一維特征xi而言,其scale越大,系數(shù)wi越小,其在正則項中的比重就會變小,相當于對wi懲罰變小,即損失函數(shù)會相對忽視那些scale增大的特征,這并不合理,所以需要feature scaling,使損失函數(shù)平等看待每一維特征。
梯度下降算法,需要feature scaling。梯度下降的參數(shù)更新公式如下,



zero center與參數(shù)初始化相配合,縮短初始參數(shù)位置與local minimum間的距離,加快收斂。模型的最終參數(shù)是未知的,所以一般隨機初始化,比如從0均值的均勻分布或高斯分布中采樣得到,對線性模型而言,其分界面初始位置大致在原點附近,bias經(jīng)常初始化為0,則分界面直接通過原點。同時,為了收斂,學習率不會很大。而每個數(shù)據(jù)集的特征分布是不一樣的,如果其分布集中且距離原點較遠,比如位于第一象限遙遠的右上角,分界面可能需要花費很多步驟才能“爬到”數(shù)據(jù)集所在的位置。所以,無論什么數(shù)據(jù)集,先平移到原點,再配合參數(shù)初始化,可以保證分界面一定會穿過數(shù)據(jù)集。此外,outliers常分布在數(shù)據(jù)集的外圍,與分界面從外部向內(nèi)挪動相比,從中心區(qū)域開始挪動可能受outliers的影響更小。
對于采用均方誤差損失LMS的線性模型,損失函數(shù)恰為二階,如下圖所示
另有從Hessian矩陣特征值以及condition number角度的理解,詳見Lecun paper-Efficient BackProp中的Convergence of Gradient Descent一節(jié),有清晰的數(shù)學描述,同時還介紹了白化的作用——解除特征間的線性相關(guān)性,使每個維度上的梯度下降可獨立看待。
文章開篇的橢圓形和圓形等高線圖,僅在采用均方誤差的線性模型上適用,其他損失函數(shù)或更復雜的模型,如深度神經(jīng)網(wǎng)絡(luò),損失函數(shù)的error surface可能很復雜,并不能簡單地用橢圓和圓來刻畫,所以用它來解釋feature scaling對所有損失函數(shù)的梯度下降的作用,似乎過于簡化,見Hinton vedio-3.2 The error surface for a linear neuron。
對于損失函數(shù)不是均方誤差的情況,只要權(quán)重w與輸入特征x間是相乘關(guān)系,損失函數(shù)對w的偏導必然含有因子x,w的梯度下降速度就會受到特征x尺度的影響。理論上為每個參數(shù)都設(shè)置上自適應的學習率,可以吸收掉x尺度的影響,但在實踐中出于計算量的考慮,往往還是所有參數(shù)共用一個學習率,此時x尺度不同可能會導致不同方向上的下降速度懸殊較大,學習率不容易選擇,下降過程也可能不穩(wěn)定,通過scaling可對不同方向上的下降速度有所控制,使下降過程相對更穩(wěn)定。
對于傳統(tǒng)的神經(jīng)網(wǎng)絡(luò),對輸入做feature scaling也很重要,因為采用sigmoid等有飽和區(qū)的激活函數(shù),如果輸入分布范圍很廣,參數(shù)初始化時沒有適配好,很容易直接陷入飽和區(qū),導致梯度消失,所以,需要對輸入做Standardization或映射到[0,1]、[?1,1],配合精心設(shè)計的參數(shù)初始化方法,對值域進行控制。但自從有了Batch Normalization,每次線性變換改變特征分布后,都會重新進行Normalization,似乎可以不太需要對網(wǎng)絡(luò)的輸入進行feature scaling了?但習慣上還是會做feature scaling。

不同方向上的下降速度變化不同(二階導不同,曲率不同),恰由輸入的協(xié)方差矩陣決定,通過scaling改變了損失函數(shù)的形狀,減小不同方向上的曲率差異。將每個維度上的下降分解來看,給定一個下降步長,如果不夠小,有的維度下降的多,有的下降的少,有的還可能在上升,損失函數(shù)的整體表現(xiàn)可能是上升也可能是下降,就會不穩(wěn)定。scaling后不同方向上的曲率相對更接近,更容易選擇到合適的學習率,使下降過程相對更穩(wěn)定。
什么時候不需要Feature Scaling?
小結(jié)
好消息!
小白學視覺知識星球
開始面向外開放啦??????
下載1:OpenCV-Contrib擴展模塊中文版教程 在「小白學視覺」公眾號后臺回復:擴展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。 下載2:Python視覺實戰(zhàn)項目52講 在「小白學視覺」公眾號后臺回復:Python視覺實戰(zhàn)項目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學校計算機視覺。 下載3:OpenCV實戰(zhàn)項目20講 在「小白學視覺」公眾號后臺回復:OpenCV實戰(zhàn)項目20講,即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學習進階。 交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

