JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

特徵管線與持續訓練

模型會衰退,因為世界在變。打造能讓上線模型保持誠實的資料機器——受編排的特徵管線與自動重訓——並學會獵捕生產中最陰險的臭蟲:訓練/服務偏移(training–serving skew)。

把特徵管線當成一等公民系統

模型的預測,好不過流進它的特徵(features);而那些特徵很少是原始輸入——它們是算出來的:滾動平均、與參考表的連接、嵌入向量、距上次事件的計時器。特徵管線編排(feature pipeline orchestration)這門功夫,就是可靠且照排程地計算這些特徵,並具備明確的相依關係、重試與回填(backfill)。編排器是一張任務的有向無環圖(DAG):「計算每日彙總」相依於「擷取昨日事件」,後者又相依於「驗證原始匯出」。

把特徵計算當成受編排的基礎設施——而非某人手動跑的筆記本——能換來生產所要求的三項性質:冪等性(idempotency)(重跑某任務產生相同結果)、可觀測性(observability)(你能看出哪些特徵是新鮮的、哪些是過時的),以及可復原性(recoverability)(上游任務失敗時暫停其下游,而非默默餵它們昨天的數字)。

訓練/服務偏移:無聲的殺手

這是讓每支團隊都謙卑下來的臭蟲。訓練時,你以批次方式、用 Python、在歷史表上計算特徵。服務時,你在低延遲的線上路徑、常以不同語言、在即時資料上計算「相同的」特徵。兩條路徑之間的任何不一致——缺失值的不同預設、時區臭蟲、捨入差異——就是訓練/服務偏移。模型擬合的是一個特徵分布,被服務的卻是另一個;準確率悄悄流失,儘管每一項離線指標看來都完美。

偏移之所以陰險,是因為它不產生任何錯誤、也不當機——只有退化的預測,而監控可能數週都察覺不到。它也是下一節那種架構最有力的理由:最可靠的解法,是讓訓練與服務經由同一段程式碼路徑計算特徵,使「同一個特徵」由構造保證成立,而非靠祈禱。

  1. 在生產中,把服務時用的特徵與預測一併記錄下來。
  2. 週期性地把那些相同的列,透過訓練路徑重新計算一次。
  3. 比對兩個特徵向量;任何非零距離就是偏移,可逐一特徵定位。
  4. 把偏移當成一等公民的生產指標來告警,而非一次性的檢查。
\text{skew} = \bigl\lVert f_{\text{batch}}(x) - f_{\text{online}}(x) \bigr\rVert > 0

訓練—服務偏斜就是同一輸入下批次計算與線上計算的特徵向量之間任何非零的差異。

把特徵庫當成一致性契約

對偏移的架構性解答,是你在第一卷見過的特徵庫(feature store),如今要理解為一份一致性契約,而非一個快取。特徵庫透過同一份定義的兩張臉提供特徵:離線(offline)庫(供訓練的大型歷史表)與線上(online)庫(供服務的低延遲鍵值查詢),兩者皆由同一個特徵定義具現(materialize)而來。特徵只定義一次;特徵庫保證訓練與服務看到相同的邏輯。

區分菜鳥與老手的精妙之處是時點正確性(point-in-time correctness)。要為時間 t 的某事件建構訓練列,你必須連接它在 t 當下的特徵——絕不是它的當前值,否則你把未來洩漏進過去(標籤洩漏,label leakage),你的離線指標就成了科幻小說。特徵庫的離線端會替你做這個時間連接;而多數自製管線正是在手動重現它時默默作弊。

f_i(e) = v_i(\tau), \quad \tau = \max\{\, t \le t_e : (i, t) \in \mathcal{H} \,\}

時點正確性:訓練樣本使用每個特徵在事件時刻或之前最近一次更新時間戳的取值。

# offline (training): point-in-time join
rows = feature_store.get_historical(
    entities=events[['user_id', 'event_ts']],
    features=['user.spend_7d', 'user.country'])
# online (serving): same definition, low latency
f = feature_store.get_online(
    'user_id', uid,
    features=['user.spend_7d', 'user.country'])
一份定義、兩種具現——對偏移的結構性療法。

持續訓練的觸發條件

即使是完美的管線,也是把模型送進一個移動的世界。隨著輸入分布位移——資料與概念漂移(data and concept drift)——昨天的最佳模型成了今天的過時模型。一條持續訓練管線(continuous training pipeline)把重訓自動化,讓模型追上現實,而非朝它衰退。關鍵的設計決策是什麼觸發一次重訓

  1. 排程式:以固定節奏重訓(每晚、每週)。簡單、可預測,但對突發位移視而不見。
  2. 漂移觸發式:當監控回報即時分布偏離超過門檻時才重訓。
  3. 效能觸發式:當業務或準確率指標越過護欄時才重訓(需要新鮮標籤)。
  4. 資料量觸發式:在累積 N 筆新標註樣本後重訓。
MLOps 生命週期:在生產環境中偵測到的漂移回饋回來觸發自動再訓練。

MLOps 生命週期迴圈圖,帶有漂移與再訓練的回饋路徑閉合回訓練。

以可重現的方式閉合迴圈

持續訓練迴圈把上一篇的可重現性賭注放大:每次自動重訓都必須釘住一份版本化的資料快照、記錄其血緣,並登錄一個以內容定址的工件,與人工啟動的執行如出一轍。回報是一個自我更新的系統,每一輪迭代都完全可稽核——你永遠能用「漂移觸發於 02:14;以快照 9a3f 重訓;通過評估後升級」來回答「為什麼模型在上週四變了?」。

現在我們有了一個會隨世界移動而自我重訓的模型。但沒有自動安全上線的自動重訓,不過是把壞模型上線得更快的方法。下一篇談的,正是如何把新模型——無論手動或自動重訓——送進生產,而不必拿整個事業去對賭。