機器學習維運與生產

訓練與服務偏差(training-serving skew)

一個模型的好壞,終究取決於它受訓的世界與它預測的世界之間的一致程度。訓練與服務偏差,就是當模型在服務時看到的特徵,與它學習時所依據的特徵不同時,悄悄裂開的腐蝕性縫隙——即使兩者名義上是用相同定義計算出來的。模型在離線評估中表現亮眼,到了生產卻令人失望,而指標完全指不出原因,因為輸入本身已在它腳下悄悄移動了。

偏差有幾個不同來源。其一是實作偏差:訓練在資料倉儲上用 Python 計算某個特徵,服務卻用另一種語言重新計算,邊界情況、四捨五入或空值處理有著細微差異。其二是時間偏差:訓練使用的是標籤時刻的值,服務卻只有過時或以不同視窗計算的值,這是標籤洩漏的反向特例。其三是分布偏差:線上的輸入分布單純地不同於訓練樣本。每一種都會在沒有任何程式碼明顯壞掉的情況下,悄悄拉低準確度。

標準的防禦手段是:把特徵只計算一次,並在訓練與服務時都從共用的特徵儲存庫讀取;記錄被服務的特徵值並重播以偵測分歧;以及在兩端都對不變量(範圍、結構描述、缺值率)下斷言。目標是讓單一特徵定義走單一執行路徑,使訓練與服務在結構上就是同一個計算,而非兩份各自實作、只能祈禱彼此一致的版本。

若訓練與服務用兩條不同的程式碼路徑重算特徵,相等只是巧合,而非保證。

又稱
train-serve skew訓練服務偏斜