器學(xué)習(xí)歸一化實(shí)戰(zhàn)指南:從原理到工程避坑)
歸一化這三個(gè)字幾乎每個(gè)做機(jī)器學(xué)習(xí)的人都聽(tīng)過(guò)但真正把它用對(duì)、用明白的人并不多。我見(jiàn)過(guò)太多項(xiàng)目模型結(jié)構(gòu)設(shè)計(jì)得漂漂亮亮特征工程也做得有模有樣結(jié)果訓(xùn)練loss震蕩不收斂或者離線指標(biāo)很好、一上線就崩排查到最后問(wèn)題就出在歸一化這個(gè)看似最不起眼的環(huán)節(jié)上。它不像Transformer、不像各種注意力機(jī)制那樣自帶光環(huán)但它對(duì)模型訓(xùn)練的影響是實(shí)打?qū)嵉挠袝r(shí)候一個(gè)歸一化方式的調(diào)整效果比換個(gè)模型結(jié)構(gòu)還明顯。這篇文章我想把歸一化這件事從頭到尾捋一遍。不是教科書(shū)式的定義羅列而是從實(shí)際項(xiàng)目出發(fā)講清楚為什么要?dú)w一化、不同歸一化方法各自適合什么場(chǎng)景、在真實(shí)工程中容易踩哪些坑、以及怎么根據(jù)具體問(wèn)題做出合理選擇。不管你是剛?cè)腴T的新手還是已經(jīng)做過(guò)幾個(gè)項(xiàng)目但總覺(jué)得歸一化用得不太對(duì)勁的從業(yè)者應(yīng)該都能從中找到對(duì)自己有用的東西。1. 歸一化到底在解決什么問(wèn)題1.1 從一組離譜的特征說(shuō)起假設(shè)你在做一個(gè)房?jī)r(jià)預(yù)測(cè)模型輸入特征包括房屋面積80到500平方米、房間數(shù)量1到10間、距離市中心距離0.5到50公里、以及房齡0到80年。這四個(gè)特征的數(shù)值范圍差異巨大面積動(dòng)輒幾百房間數(shù)最多兩位數(shù)距離和房齡又是另一個(gè)量級(jí)。如果你直接把這樣的數(shù)據(jù)喂給模型會(huì)發(fā)生什么對(duì)于基于梯度下降的模型來(lái)說(shuō)參數(shù)更新的幅度和輸入特征的尺度直接相關(guān)。面積這個(gè)特征因?yàn)閿?shù)值大它的權(quán)重哪怕只變化一點(diǎn)點(diǎn)對(duì)輸出的影響也會(huì)被放大而房間數(shù)這個(gè)特征數(shù)值小它的權(quán)重需要變化很大才能產(chǎn)生同等影響。結(jié)果就是損失函數(shù)的等高線變成一個(gè)極其狹長(zhǎng)的橢圓梯度下降在長(zhǎng)軸方向上震蕩在短軸方向上移動(dòng)緩慢收斂過(guò)程又慢又不穩(wěn)定。我在早期做一個(gè)用戶行為預(yù)測(cè)項(xiàng)目時(shí)就吃過(guò)這個(gè)虧。當(dāng)時(shí)有一批特征沒(méi)做歸一化就直接扔進(jìn)了邏輯回歸訓(xùn)練了上千輪loss還在跳一開(kāi)始以為是學(xué)習(xí)率的問(wèn)題調(diào)了半天學(xué)習(xí)率效果也不理想。后來(lái)把特征尺度統(tǒng)一之后同樣的學(xué)習(xí)率幾十輪就收斂了。那次之后我才真正意識(shí)到歸一化不是錦上添花而是很多模型能正常工作的前提條件。1.2 不同模型對(duì)歸一化的敏感程度差異這里有一個(gè)很重要的認(rèn)知不是所有模型都對(duì)歸一化同樣敏感。理解這一點(diǎn)能幫你在實(shí)際項(xiàng)目中判斷哪些環(huán)節(jié)必須做歸一化哪些環(huán)節(jié)可以省。對(duì)特征尺度敏感的模型主要是那些依賴距離計(jì)算或梯度優(yōu)化的模型。比如K近鄰KNN它直接計(jì)算樣本之間的歐氏距離如果一個(gè)特征數(shù)值范圍是0到1000另一個(gè)是0到1那么距離幾乎完全由第一個(gè)特征主導(dǎo)第二個(gè)特征相當(dāng)于不存在。再比如支持向量機(jī)SVM它尋找的是最大間隔超平面特征尺度不統(tǒng)一會(huì)嚴(yán)重影響間隔的計(jì)算。神經(jīng)網(wǎng)絡(luò)更是如此無(wú)論是全連接網(wǎng)絡(luò)還是卷積網(wǎng)絡(luò)輸入尺度的不一致都會(huì)導(dǎo)致梯度傳播的不穩(wěn)定。相對(duì)而言基于樹(shù)結(jié)構(gòu)的模型比如決策樹(shù)、隨機(jī)森林、梯度提升樹(shù)GBDT這類對(duì)歸一化就不那么敏感。因?yàn)闃?shù)模型在分裂節(jié)點(diǎn)時(shí)考慮的是特征取值的信息增益或基尼不純度它只關(guān)心特征的排序關(guān)系不關(guān)心具體數(shù)值大小。你把一個(gè)特征從[0, 1000]縮放到[0, 1]樹(shù)的 splits 點(diǎn)會(huì)相應(yīng)變化但最終的分裂邏輯和結(jié)果基本等價(jià)。但這并不意味著樹(shù)模型就完全不需要?dú)w一化。在實(shí)際工程中如果不同特征的尺度差異過(guò)大樹(shù)模型在尋找最優(yōu)分裂點(diǎn)時(shí)候選分裂點(diǎn)的粒度會(huì)受到影響尤其是在特征值分布不均勻的情況下適當(dāng)歸一化仍然有助于提升模型的穩(wěn)定性和訓(xùn)練效率。模型類型對(duì)歸一化的敏感度原因KNN極高依賴距離計(jì)算尺度直接決定距離權(quán)重SVM極高間隔計(jì)算受特征尺度影響神經(jīng)網(wǎng)絡(luò)高梯度傳播對(duì)輸入尺度敏感線性回歸/邏輯回歸高梯度下降收斂速度受尺度影響決策樹(shù)/隨機(jī)森林低只關(guān)心特征排序不關(guān)心絕對(duì)數(shù)值GBDT/XGBoost較低分裂基于信息增益但極端尺度仍可能影響效率樸素貝葉斯低基于概率分布尺度影響較小1.3 歸一化不只是縮放到0到1很多人一提到歸一化第一反應(yīng)就是把數(shù)據(jù)縮放到0到1之間。這個(gè)理解不算錯(cuò)但太窄了。歸一化這個(gè)詞在實(shí)際使用中其實(shí)涵蓋了一類操作調(diào)整特征的數(shù)值分布使其更適合模型學(xué)習(xí)。具體來(lái)說(shuō)它至少包括以下幾種不同的思路第一種是** rescaling重縮放也就是最常說(shuō)的min-max歸一化把數(shù)據(jù)線性映射到某個(gè)固定區(qū)間通常是[0, 1]。第二種是標(biāo)準(zhǔn)化standardization也叫Z-score歸一化把數(shù)據(jù)變換成均值為0、標(biāo)準(zhǔn)差為1的分布。第三種是正則化normalization比如L1、L2范數(shù)歸一化把每個(gè)樣本的特征向量縮放到單位范數(shù)。第四種是魯棒歸一化robust scaling**用中位數(shù)和四分位距來(lái)代替均值和標(biāo)準(zhǔn)差減少異常值的影響。這幾種方法背后的假設(shè)和適用場(chǎng)景完全不同。選錯(cuò)了方法不僅不能解決問(wèn)題反而可能引入新的問(wèn)題。接下來(lái)我會(huì)逐一拆解每種方法的原理、計(jì)算方式、適用場(chǎng)景和實(shí)際使用中的注意事項(xiàng)。2. 主流歸一化方法的原理與適用邊界2.1 Min-Max歸一化簡(jiǎn)單直接但有硬傷Min-Max歸一化的計(jì)算非常直觀對(duì)于每個(gè)特征找到它的最小值min和最大值max然后對(duì)每個(gè)值x做變換x_normalized (x - min) / (max - min)變換后的數(shù)據(jù)嚴(yán)格落在[0, 1]區(qū)間內(nèi)。這個(gè)方法的好處是計(jì)算簡(jiǎn)單、結(jié)果有界、不改變?cè)紨?shù)據(jù)的分布形狀。在圖像處理中像素值本身就是0到255除以255就完成了歸一化非常自然。但它有一個(gè)很明顯的硬傷對(duì)異常值極其敏感。假設(shè)某個(gè)特征大部分值在0到100之間但有一個(gè)異常值是10000那么歸一化之后正常值全部被壓縮到0到0.01之間區(qū)分度幾乎消失。我在處理一批用戶點(diǎn)擊數(shù)據(jù)時(shí)就遇到過(guò)這種情況某個(gè)特征的99%分位數(shù)是50但最大值是8000多min-max歸一化之后絕大多數(shù)樣本在這個(gè)特征上的取值都擠在一起模型根本學(xué)不出有效的分裂。所以使用Min-Max歸一化時(shí)有幾個(gè)實(shí)操要點(diǎn)需要注意。第一如果數(shù)據(jù)中存在明顯的異常值要么先做異常值處理要么改用魯棒歸一化。第二min和max必須從訓(xùn)練集上計(jì)算然后應(yīng)用到驗(yàn)證集和測(cè)試集絕對(duì)不能在整個(gè)數(shù)據(jù)集上計(jì)算后再劃分否則會(huì)造成數(shù)據(jù)泄露。第三如果后續(xù)有新數(shù)據(jù)進(jìn)來(lái)其取值可能超出訓(xùn)練集的[min, max]范圍歸一化后會(huì)超出[0, 1]需要考慮是否做截?cái)唷?.2 Z-Score標(biāo)準(zhǔn)化最通用的選擇Z-Score標(biāo)準(zhǔn)化的公式也很簡(jiǎn)單x_standardized (x - mean) / std變換后的數(shù)據(jù)均值為0標(biāo)準(zhǔn)差為1。和Min-Max相比它不把數(shù)據(jù)限制在固定區(qū)間內(nèi)而是讓數(shù)據(jù)圍繞0分布。這個(gè)方法在大多數(shù)場(chǎng)景下都是默認(rèn)選擇尤其是對(duì)于神經(jīng)網(wǎng)絡(luò)和線性模型。為什么它更通用因?yàn)樗A袅嗽紨?shù)據(jù)中異常值的信息。異常值標(biāo)準(zhǔn)化后仍然會(huì)偏離均值較遠(yuǎn)不會(huì)像Min-Max那樣被壓扁。同時(shí)對(duì)于大多數(shù)基于梯度的優(yōu)化算法輸入數(shù)據(jù)圍繞0分布、尺度統(tǒng)一能讓梯度下降的路徑更接近最優(yōu)方向收斂更快。但Z-Score也有它的前提假設(shè)它默認(rèn)數(shù)據(jù)近似服從正態(tài)分布。如果數(shù)據(jù)嚴(yán)重偏態(tài)比如收入數(shù)據(jù)、某些計(jì)數(shù)數(shù)據(jù)標(biāo)準(zhǔn)化后的效果可能并不理想。這時(shí)候可以考慮先做對(duì)數(shù)變換再做標(biāo)準(zhǔn)化。另外和Min-Max一樣mean和std必須從訓(xùn)練集計(jì)算然后應(yīng)用到其他集合。注意當(dāng)某個(gè)特征的標(biāo)準(zhǔn)差為0時(shí)即所有取值相同Z-Score會(huì)除以0導(dǎo)致報(bào)錯(cuò)。實(shí)際工程中需要加一個(gè)極小值epsilon或者直接刪除這類無(wú)信息量的特征。2.3 魯棒歸一化異常值場(chǎng)景下的務(wù)實(shí)選擇魯棒歸一化的公式是x_robust (x - median) / IQR其中median是中位數(shù)IQR是四分位距第75百分位數(shù)減去第25百分位數(shù)。這個(gè)方法用中位數(shù)代替均值用四分位距代替標(biāo)準(zhǔn)差因?yàn)橹形粩?shù)和四分位距對(duì)異常值不敏感。舉個(gè)例子假設(shè)一個(gè)特征的值是[1, 2, 3, 4, 5, 1000]均值大約是169標(biāo)準(zhǔn)差大約是407Z-Score標(biāo)準(zhǔn)化后前五個(gè)值都擠在-0.41附近1000變成2.04。而中位數(shù)是3.5IQR是2魯棒歸一化后前五個(gè)值分布在-1.25到0.75之間1000變成498異常值仍然突出但正常值的區(qū)分度保留得更好。魯棒歸一化適合那些確實(shí)存在異常值、但又不想直接刪除異常值的場(chǎng)景。比如金融風(fēng)控中的交易金額、傳感器數(shù)據(jù)中的突發(fā)尖峰等。它的代價(jià)是計(jì)算稍微復(fù)雜一點(diǎn)需要算分位數(shù)但在數(shù)據(jù)量不是特別大的情況下這點(diǎn)開(kāi)銷可以忽略。2.4 范數(shù)歸一化樣本級(jí)別的縮放前面三種方法都是針對(duì)每個(gè)特征維度獨(dú)立進(jìn)行的屬于列歸一化。而范數(shù)歸一化是針對(duì)每個(gè)樣本進(jìn)行的屬于行歸一化。它的做法是讓每個(gè)樣本的特征向量具有單位范數(shù)x_normalized x / ||x||_p其中p通常取1或2。L2范數(shù)歸一化后每個(gè)樣本的特征向量長(zhǎng)度為1L1范數(shù)歸一化后每個(gè)樣本的特征絕對(duì)值之和為1。這種方法在文本分類、聚類等場(chǎng)景中比較常見(jiàn)。比如在TF-IDF向量上做L2歸一化可以消除文檔長(zhǎng)度對(duì)相似度計(jì)算的影響。在圖像檢索中對(duì)特征描述子做L2歸一化也是標(biāo)準(zhǔn)操作。但要注意范數(shù)歸一化不改變特征之間的相對(duì)關(guān)系它改變的是樣本之間的尺度關(guān)系。如果你的問(wèn)題是特征尺度不統(tǒng)一導(dǎo)致的范數(shù)歸一化解決不了如果你的問(wèn)題是樣本之間因?yàn)橄蛄块L(zhǎng)度不同導(dǎo)致相似度計(jì)算有偏那范數(shù)歸一化就是對(duì)的工具。方法計(jì)算方式適用場(chǎng)景主要缺點(diǎn)Min-Max(x-min)/(max-min)圖像像素、有明確邊界的數(shù)據(jù)對(duì)異常值敏感Z-Score(x-mean)/std大多數(shù)通用場(chǎng)景、神經(jīng)網(wǎng)絡(luò)假設(shè)近似正態(tài)分布魯棒歸一化(x-median)/IQR存在異常值的數(shù)據(jù)計(jì)算稍復(fù)雜L2范數(shù)x/||x||_2文本、圖像檢索、相似度計(jì)算不解決特征尺度問(wèn)題3. 工程實(shí)踐中那些容易踩的坑3.1 數(shù)據(jù)泄露最隱蔽也最致命的錯(cuò)誤數(shù)據(jù)泄露是歸一化環(huán)節(jié)最容易犯、后果也最嚴(yán)重的錯(cuò)誤。具體表現(xiàn)是在劃分訓(xùn)練集和測(cè)試集之前就在整個(gè)數(shù)據(jù)集上計(jì)算了均值和標(biāo)準(zhǔn)差然后用這個(gè)全局統(tǒng)計(jì)量去做歸一化。為什么這是錯(cuò)的因?yàn)闇y(cè)試集的統(tǒng)計(jì)信息泄露到了訓(xùn)練過(guò)程中。模型在訓(xùn)練時(shí)間接看到了測(cè)試集的分布導(dǎo)致離線評(píng)估指標(biāo)虛高上線后效果大打折扣。這個(gè)錯(cuò)誤之所以隱蔽是因?yàn)樗粫?huì)報(bào)錯(cuò)代碼能跑通指標(biāo)看起來(lái)還挺好只有在上線后才會(huì)暴露。正確的做法是先用訓(xùn)練集計(jì)算出mean、std、min、max等統(tǒng)計(jì)量保存下來(lái)然后分別應(yīng)用到訓(xùn)練集、驗(yàn)證集和測(cè)試集。在sklearn中應(yīng)該用fit_transform處理訓(xùn)練集用transform處理測(cè)試集而不是對(duì)兩者都做fit_transform。from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) # 在訓(xùn)練集上fit并transform X_test_scaled scaler.transform(X_test) # 在測(cè)試集上只transform用訓(xùn)練集的統(tǒng)計(jì)量這個(gè)細(xì)節(jié)看起來(lái)簡(jiǎn)單但在實(shí)際項(xiàng)目中尤其是多人協(xié)作或者代碼迭代較快的情況下很容易被忽略。我的建議是把歸一化操作封裝成Pipeline的一部分從流程上杜絕這種錯(cuò)誤。3.2 訓(xùn)練集和線上數(shù)據(jù)的分布漂移即使你在訓(xùn)練時(shí)嚴(yán)格做到了只用訓(xùn)練集統(tǒng)計(jì)量線上服務(wù)時(shí)仍然可能遇到問(wèn)題新來(lái)的數(shù)據(jù)分布和訓(xùn)練集不一致。比如訓(xùn)練時(shí)某個(gè)特征的均值是100線上運(yùn)行一段時(shí)間后用戶行為變化導(dǎo)致這個(gè)特征的均值變成了150。如果你還用訓(xùn)練時(shí)的mean和std去歸一化新數(shù)據(jù)會(huì)被系統(tǒng)性地偏移。這個(gè)問(wèn)題沒(méi)有一勞永逸的解決方案但有幾個(gè)實(shí)用的應(yīng)對(duì)策略。第一定期監(jiān)控線上特征的分布和訓(xùn)練集分布做對(duì)比發(fā)現(xiàn)漂移及時(shí)告警。第二對(duì)于變化較快的特征考慮使用滑動(dòng)窗口的統(tǒng)計(jì)量來(lái)動(dòng)態(tài)更新歸一化參數(shù)。第三在模型層面增加對(duì)分布變化的魯棒性比如使用更魯棒的歸一化方法或者在訓(xùn)練時(shí)做數(shù)據(jù)增強(qiáng)來(lái)模擬分布變化。我在一個(gè)推薦系統(tǒng)項(xiàng)目中就遇到過(guò)這個(gè)問(wèn)題。模型離線AUC是0.82上線一周后效果持續(xù)下降。排查后發(fā)現(xiàn)某個(gè)用戶活躍度特征的分布發(fā)生了明顯右移而模型對(duì)這個(gè)特征非常依賴。后來(lái)我們把這個(gè)特征的歸一化改成了基于過(guò)去7天滑動(dòng)窗口的統(tǒng)計(jì)量效果才穩(wěn)定下來(lái)。3.3 樹(shù)模型到底要不要?dú)w一化前面提到樹(shù)模型對(duì)歸一化不敏感但實(shí)際工程中這個(gè)問(wèn)題比想象中復(fù)雜。純理論角度決策樹(shù)的分裂只依賴于特征的排序單調(diào)變換不改變排序所以歸一化不影響樹(shù)的結(jié)構(gòu)。但現(xiàn)實(shí)中有幾個(gè)因素會(huì)讓歸一化在樹(shù)模型上仍然有意義。第一如果不同特征的尺度差異極大某些樹(shù)模型實(shí)現(xiàn)尤其是基于直方圖的近似算法在尋找分裂點(diǎn)時(shí)會(huì)先對(duì)特征值做分桶。如果某個(gè)特征的取值范圍是0到1另一個(gè)是0到1000000分桶的粒度在不同特征上差異很大可能影響分裂質(zhì)量。第二當(dāng)樹(shù)模型和線性模型做集成時(shí)比如Facebook的GBDTLR方案輸入到LR部分的特征仍然需要?dú)w一化。第三歸一化后的特征在模型解釋和特征重要性分析時(shí)更容易做跨特征的比較。所以我的實(shí)際建議是對(duì)于純樹(shù)模型歸一化不是必須的但做了也不會(huì)有壞處反而可能帶來(lái)訓(xùn)練效率和穩(wěn)定性的提升。如果項(xiàng)目流程中已經(jīng)有歸一化環(huán)節(jié)沒(méi)必要為了樹(shù)模型單獨(dú)跳過(guò)。3.4 類別特征和歸一化的關(guān)系歸一化是針對(duì)數(shù)值特征的類別特征需要的是編碼如獨(dú)熱編碼、目標(biāo)編碼等這兩者不能混淆。但有一個(gè)交叉地帶需要注意有些特征表面上是數(shù)值實(shí)際上是類別比如用戶ID、商品ID、郵政編碼等。對(duì)這些特征做歸一化是沒(méi)有意義的因?yàn)樗鼈兊臄?shù)值大小沒(méi)有實(shí)際含義歸一化后的結(jié)果也不具備可解釋性。判斷一個(gè)特征該不該歸一化關(guān)鍵看它的數(shù)值是否具有序和距的含義。房屋面積有大小之分距離有遠(yuǎn)近之分這些應(yīng)該歸一化。而用戶ID是標(biāo)識(shí)符數(shù)值大小沒(méi)有意義不應(yīng)該歸一化。這個(gè)判斷在做特征工程時(shí)非常重要搞錯(cuò)了不僅浪費(fèi)計(jì)算資源還可能誤導(dǎo)模型。4. 不同場(chǎng)景下的歸一化策略選擇4.1 圖像數(shù)據(jù)像素級(jí)歸一化是標(biāo)配圖像數(shù)據(jù)是歸一化最標(biāo)準(zhǔn)化的場(chǎng)景。原始像素值通常是0到255的整數(shù)最常見(jiàn)的做法是直接除以255縮放到[0, 1]。這是Min-Max歸一化的特例因?yàn)橄袼刂档倪吔缡且阎夜潭ǖ?。但?shí)際項(xiàng)目中還有更細(xì)的做法。很多預(yù)訓(xùn)練模型如ResNet、VGG在訓(xùn)練時(shí)使用的是ImageNet數(shù)據(jù)集的均值和標(biāo)準(zhǔn)差來(lái)做標(biāo)準(zhǔn)化具體來(lái)說(shuō)每個(gè)通道減去均值再除以標(biāo)準(zhǔn)差。如果你要用預(yù)訓(xùn)練模型做遷移學(xué)習(xí)最好保持和預(yù)訓(xùn)練時(shí)一致的歸一化方式否則輸入分布不匹配微調(diào)效果會(huì)打折扣。另外圖像歸一化還有通道維度的考慮。是每個(gè)通道獨(dú)立歸一化還是所有通道用同一組參數(shù)通常RGB三個(gè)通道分別計(jì)算均值和標(biāo)準(zhǔn)差因?yàn)椴煌ǖ赖姆植即_實(shí)不同。但在某些任務(wù)中比如灰度圖或者醫(yī)學(xué)影像可能只有一個(gè)通道那就簡(jiǎn)單了。4.2 文本數(shù)據(jù)歸一化的重點(diǎn)在向量層面文本數(shù)據(jù)的歸一化比較特殊。原始文本本身不是數(shù)值需要先轉(zhuǎn)成向量表示比如TF-IDF、詞嵌入、或者預(yù)訓(xùn)練模型的輸出。在向量層面歸一化的主要目的是消除文檔長(zhǎng)度的影響讓相似度計(jì)算更合理。最常見(jiàn)的做法是對(duì)TF-IDF向量做L2歸一化。因?yàn)門F-IDF向量的歐氏范數(shù)實(shí)際上反映了文檔中詞的重要性的累積不同長(zhǎng)度的文檔這個(gè)值差異很大。L2歸一化后余弦相似度就等價(jià)于內(nèi)積計(jì)算更方便結(jié)果也更穩(wěn)定。對(duì)于詞嵌入向量比如Word2Vec、GloVe的輸出通常不需要額外歸一化因?yàn)檫@些向量本身已經(jīng)是在一個(gè)相對(duì)統(tǒng)一的尺度上訓(xùn)練出來(lái)的。但如果要把多個(gè)詞向量拼接或平均歸一化可以幫助穩(wěn)定結(jié)果。對(duì)于BERT等預(yù)訓(xùn)練模型的輸出通常也不做額外歸一化因?yàn)槟P蛢?nèi)部有LayerNorm等機(jī)制來(lái)處理尺度問(wèn)題。4.3 時(shí)序數(shù)據(jù)滑動(dòng)窗口與全局統(tǒng)計(jì)的權(quán)衡時(shí)序數(shù)據(jù)的歸一化有一個(gè)獨(dú)特的挑戰(zhàn)數(shù)據(jù)分布隨時(shí)間變化。用全局統(tǒng)計(jì)量歸一化可能無(wú)法適應(yīng)局部變化用局部統(tǒng)計(jì)量歸一化又可能引入不穩(wěn)定性。常見(jiàn)的做法有幾種。第一種是全局Z-Score用整個(gè)訓(xùn)練集的均值和標(biāo)準(zhǔn)差簡(jiǎn)單但可能忽略時(shí)序變化。第二種是滑動(dòng)窗口歸一化用過(guò)去N個(gè)時(shí)間步的統(tǒng)計(jì)量來(lái)歸一化當(dāng)前值能適應(yīng)分布變化但窗口大小的選擇很關(guān)鍵。第三種是差分歸一化先對(duì)時(shí)序做差分消除趨勢(shì)再歸一化適合有明顯趨勢(shì)的數(shù)據(jù)。我在做設(shè)備傳感器異常檢測(cè)時(shí)用的是滑動(dòng)窗口歸一化。窗口大小設(shè)為一天的數(shù)據(jù)量因?yàn)樵O(shè)備的運(yùn)行模式有明顯的日周期性。這個(gè)選擇是基于對(duì)業(yè)務(wù)的理解而不是純粹的數(shù)據(jù)驅(qū)動(dòng)。如果窗口太小歸一化結(jié)果會(huì)受短期波動(dòng)影響如果太大又無(wú)法及時(shí)反映模式變化。4.4 推薦系統(tǒng)特征分組的差異化處理推薦系統(tǒng)的特征種類繁多包括用戶特征、物品特征、上下文特征、交叉特征等不同特征的歸一化策略應(yīng)該有所區(qū)別。用戶側(cè)的連續(xù)特征比如年齡、活躍天數(shù)、歷史點(diǎn)擊率等通常用Z-Score或Min-Max歸一化。物品側(cè)的連續(xù)特征比如價(jià)格、銷量、評(píng)分等同樣需要?dú)w一化。但要注意有些特征本身已經(jīng)是比率或概率形式比如點(diǎn)擊率、轉(zhuǎn)化率它們的取值范圍天然在[0, 1]之間是否還需要?dú)w一化取決于具體分布。如果點(diǎn)擊率大部分集中在0.01到0.05之間直接使用可能區(qū)分度不夠可以考慮做對(duì)數(shù)變換或分桶。交叉特征的處理更復(fù)雜。比如用戶年齡×物品價(jià)格這樣的交叉特征數(shù)值范圍可能非常大而且分布可能很偏。這時(shí)候通常先對(duì)原始特征歸一化再做交叉或者對(duì)交叉后的結(jié)果再做一次歸一化。具體選擇取決于模型結(jié)構(gòu)和實(shí)驗(yàn)效果。5. 歸一化效果的驗(yàn)證與調(diào)優(yōu)5.1 怎么判斷歸一化是否起了作用歸一化的效果不是靠感覺(jué)判斷的需要有明確的驗(yàn)證方法。最直接的方式是對(duì)比實(shí)驗(yàn)同一份數(shù)據(jù)、同一個(gè)模型一組做歸一化一組不做比較訓(xùn)練收斂速度、最終指標(biāo)、以及訓(xùn)練過(guò)程的穩(wěn)定性。具體來(lái)說(shuō)可以觀察幾個(gè)信號(hào)。第一訓(xùn)練loss的下降曲線。如果歸一化有效loss應(yīng)該下降得更平滑、更快。第二梯度的范數(shù)。歸一化后不同參數(shù)的梯度尺度應(yīng)該更接近如果某些參數(shù)的梯度范數(shù)異常大或異常小說(shuō)明歸一化可能沒(méi)做到位。第三模型權(quán)重的分布。訓(xùn)練結(jié)束后如果某些權(quán)重特別大、某些特別小可能暗示輸入特征的尺度不統(tǒng)一。我在實(shí)際項(xiàng)目中會(huì)做一個(gè)簡(jiǎn)單的檢查計(jì)算每個(gè)特征歸一化前后的均值和標(biāo)準(zhǔn)差確認(rèn)歸一化后的統(tǒng)計(jì)量符合預(yù)期。對(duì)于Z-Score歸一化后均值應(yīng)該接近0標(biāo)準(zhǔn)差接近1對(duì)于Min-Max最小值應(yīng)該是0最大值應(yīng)該是1。如果不符合說(shuō)明歸一化過(guò)程有問(wèn)題。5.2 歸一化與學(xué)習(xí)率的聯(lián)動(dòng)調(diào)整歸一化和學(xué)習(xí)率之間有很強(qiáng)的耦合關(guān)系。歸一化改變了損失函數(shù)的曲率從而影響了合適的學(xué)習(xí)率范圍。一般來(lái)說(shuō)歸一化之后損失函數(shù)的等高線更接近圓形梯度下降可以用更大的學(xué)習(xí)率而不震蕩。這意味著如果你在歸一化之前調(diào)好了一個(gè)學(xué)習(xí)率歸一化之后可能需要重新調(diào)整。反過(guò)來(lái)如果你發(fā)現(xiàn)模型訓(xùn)練不穩(wěn)定除了檢查歸一化也可以看看學(xué)習(xí)率是否合適。兩者往往需要一起調(diào)。一個(gè)實(shí)用的經(jīng)驗(yàn)是做了Z-Score標(biāo)準(zhǔn)化之后學(xué)習(xí)率可以比不做歸一化時(shí)大一個(gè)數(shù)量級(jí)左右。當(dāng)然這不是絕對(duì)的具體還要看模型結(jié)構(gòu)和數(shù)據(jù)特點(diǎn)。我的做法是歸一化之后先用一個(gè)較小的學(xué)習(xí)率跑幾百輪觀察loss下降情況然后逐步增大學(xué)習(xí)率找到既不震蕩又收斂快的值。5.3 歸一化參數(shù)的保存與線上一致性訓(xùn)練時(shí)計(jì)算出的歸一化參數(shù)mean、std、min、max等必須保存下來(lái)線上服務(wù)時(shí)用同一組參數(shù)做變換。這個(gè)環(huán)節(jié)看似簡(jiǎn)單但在工程實(shí)現(xiàn)中經(jīng)常出問(wèn)題。常見(jiàn)的問(wèn)題包括訓(xùn)練時(shí)用了A版本的參數(shù)線上部署時(shí)用了B版本的參數(shù)或者參數(shù)保存了但加載時(shí)字段對(duì)應(yīng)錯(cuò)了或者線上代碼重新計(jì)算了參數(shù)而不是加載保存的參數(shù)。這些問(wèn)題都會(huì)導(dǎo)致線上線下不一致而且往往很難排查因?yàn)槟P捅旧頉](méi)問(wèn)題問(wèn)題出在數(shù)據(jù)預(yù)處理環(huán)節(jié)。我的建議是把歸一化參數(shù)作為模型artifact的一部分和模型權(quán)重一起保存、一起加載、一起版本管理。在線上服務(wù)的代碼中歸一化邏輯應(yīng)該和訓(xùn)練時(shí)完全一致最好能復(fù)用同一份代碼。如果訓(xùn)練用Python、線上用Java或C那就要確保兩邊實(shí)現(xiàn)的歸一化邏輯嚴(yán)格對(duì)齊并且有測(cè)試用例來(lái)驗(yàn)證一致性。6. 一些容易被忽略的細(xì)節(jié)和我的個(gè)人經(jīng)驗(yàn)6.1 歸一化順序先處理異常值還是先歸一化這個(gè)順序問(wèn)題在實(shí)際操作中經(jīng)常被搞混。正確的順序應(yīng)該是先處理異常值再做歸一化。原因很簡(jiǎn)單歸一化方法尤其是Min-Max和Z-Score的統(tǒng)計(jì)量會(huì)被異常值嚴(yán)重影響。如果先歸一化再處理異常值歸一化后的數(shù)據(jù)已經(jīng)被異常值污染了處理起來(lái)更麻煩。但處理異常值不一定是刪除??梢允墙?cái)喟殉^(guò)某個(gè)分位數(shù)的值設(shè)為該分位數(shù)的值、可以是變換對(duì)數(shù)變換、Box-Cox變換、也可以是保留但使用魯棒歸一化。具體選擇取決于業(yè)務(wù)理解和數(shù)據(jù)特點(diǎn)。我的習(xí)慣是先做探索性數(shù)據(jù)分析了解每個(gè)特征的分布和異常值情況再?zèng)Q定處理策略。6.2 稀疏特征要不要?dú)w一化稀疏特征是指大部分取值為0的特征比如獨(dú)熱編碼后的類別特征、用戶-物品交互矩陣等。對(duì)這類特征做歸一化需要特別小心。以獨(dú)熱編碼為例歸一化之后原本的0和1會(huì)變成其他值這破壞了獨(dú)熱編碼的語(yǔ)義。而且稀疏特征歸一化后可能變得不再稀疏存儲(chǔ)和計(jì)算開(kāi)銷都會(huì)增加。所以獨(dú)熱編碼后的特征通常不做歸一化或者只做非常輕量的處理。但對(duì)于TF-IDF這類本身就是稀疏的連續(xù)特征L2歸一化是常見(jiàn)操作因?yàn)樗桓淖兿∈栊?還是0只是調(diào)整了非零值的尺度。所以關(guān)鍵看歸一化方法是否保持稀疏性。6.3 歸一化不是萬(wàn)能的最后想說(shuō)一點(diǎn)歸一化能解決很多問(wèn)題但它不是萬(wàn)能的。如果模型不收斂歸一化可能是一個(gè)原因但也可能是學(xué)習(xí)率、模型結(jié)構(gòu)、損失函數(shù)、數(shù)據(jù)質(zhì)量等其他原因。如果模型效果不好歸一化可能幫上忙但更根本的可能是特征本身沒(méi)有信息量、或者問(wèn)題定義不清楚。我見(jiàn)過(guò)一些項(xiàng)目團(tuán)隊(duì)把大量時(shí)間花在調(diào)歸一化方法上但真正的問(wèn)題在于標(biāo)注數(shù)據(jù)有大量噪聲。這種情況下?lián)Q什么歸一化方法都沒(méi)用。所以遇到問(wèn)題時(shí)先把排查范圍放寬確認(rèn)歸一化確實(shí)是瓶頸再深入優(yōu)化。歸一化是機(jī)器學(xué)習(xí)工程中那種做好了不出彩、做錯(cuò)了很致命的環(huán)節(jié)。它不需要多高深的理論但需要對(duì)數(shù)據(jù)、對(duì)模型、對(duì)業(yè)務(wù)有足夠的理解。希望這篇內(nèi)容能幫你在下一個(gè)項(xiàng)目中少踩一些歸一化的坑。