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