實際工作環境機器學習系統:監控管道

恭喜!您已部署獨角獸模型。 模型應可全年無休運作,不會發生任何問題。如要確保模型能持續提供準確預測結果,請務必監控機器學習 (ML) 管道。

編寫資料結構定義,驗證原始資料

如要監控資料,請編寫資料必須符合的規則,持續比對資料與預期的統計值。這組規則稱為「資料結構定義」。請按照下列步驟定義資料架構:

  1. 瞭解功能的範圍和發布情形。如為類別特徵,請瞭解可能的值組合。

  2. 將瞭解內容編碼至資料結構定義。以下是規則範例:

    • 請確保使用者提交的評分一律介於 1 到 5 之間。
    • 確認「the」一字出現頻率最高 (適用於英文文字功能)。
    • 確認每個類別特徵都設為一組固定可能值中的值。
  3. 根據資料結構定義測試資料。您的結構定義應能偵測資料錯誤,例如:

    • 異常狀況
    • 類別變數的值超出預期
    • 資料分布情形異常

撰寫單元測試來驗證特徵工程

雖然原始資料可能通過資料結構定義,但模型不會根據原始資料進行訓練。而是以經過特徵工程處理的資料訓練模型。舉例來說,模型會根據正規化的數值特徵進行訓練,而非原始數值資料。由於經過特徵工程處理的資料可能與原始輸入資料大相逕庭,因此您必須分別檢查經過特徵工程處理的資料和原始輸入資料。

根據您對特徵工程資料的瞭解,編寫單元測試。舉例來說,您可以編寫單元測試,檢查下列條件:

  • 所有數值特徵都會經過縮放,例如介於 0 和 1 之間。
  • 經過 one-hot 編碼的向量只包含一個 1 和 N-1 個零。
  • 轉換後的資料分配符合預期。舉例來說,如果您使用 Z 分數進行正規化,Z 分數的平均值應為 0。
  • 離群值 會經過處理,例如縮放裁剪

查看重要資料切片的指標

有時,成功的整體會掩蓋不成功的子集。換句話說,整體指標表現出色的模型,在特定情況下仍可能做出糟糕的預測。例如:

您的獨角獸模型整體表現良好,但在預測撒哈拉沙漠的狀況時,表現不佳。

如果您是滿意整體 AUC 的工程師,可能不會注意到模型在撒哈拉沙漠中的問題。如果每個區域的預測準確度都很重要,則您需要追蹤每個區域的成效。與撒哈拉沙漠對應的資料子集稱為「資料切片」。

找出感興趣的資料切片。 然後,將這些資料切片的模型指標與整個資料集的指標進行比較。檢查模型在所有資料切片中的表現,有助於消除偏誤。詳情請參閱「公平性:評估偏誤」。

使用實際指標

模型指標不一定能衡量模型的實際影響。 舉例來說,變更超參數可能會提高模型的 AUC,但這項變更對使用者體驗有何影響?如要評估實際影響,您需要定義個別指標。舉例來說,您可以對模型使用者進行問卷調查,確認模型預測使用者會看到獨角獸時,他們是否真的看到了。

檢查訓練/應用偏差

訓練/提供偏移是指訓練期間的輸入資料與提供期間的輸入資料不同。下表說明兩種重要的偏斜類型:

類型 定義 範例 解決方法
結構定義傾斜 訓練和服務輸入資料不符合相同的結構定義。 模型持續根據舊資料訓練,但服務資料的格式或分布情況有所變更。 使用相同的結構定義驗證訓練和服務資料。 請務必另外檢查結構定義未檢查的統計資料,例如遺漏值的比例。
特徵偏斜 訓練和服務期間的工程設計資料不同。 訓練和服務的特徵工程程式碼不同,產生不同的工程資料。 與結構定義偏差類似,請對訓練和服務工程資料套用相同的統計規則。追蹤偵測到的偏斜特徵數量,以及每個特徵的偏斜樣本比例。

訓練/應用偏差的原因可能很細微。請務必考量模型在預測時可用的資料。訓練期間,請只使用服務時可用的功能。

練習:確認理解程度

假設您有一家網路商店,並想預測特定日期的收益金額,您的機器學習目標是使用顧客人數做為特徵,預測每日收益。

你可能會遇到什麼問題?
按這裡查看答案

檢查標籤洩漏情形

標籤外洩是指您嘗試預測的實際資料標籤,不慎進入訓練特徵。有時很難偵測標籤洩漏。

練習:確認理解程度

假設您建構二元分類模型,預測新住院病患是否罹患癌症。您的模型會使用下列功能:

  • 病患年齡
  • 病患性別
  • 先前健康狀況
  • 醫院名稱
  • 生命徵象
  • 測試結果
  • 遺傳

標籤如下:

  • 布林值:患者是否罹患癌症?

您會仔細分割資料,確保訓練集與驗證集和測試集完全隔離。模型在驗證集和測試集上的表現極佳,指標也十分出色。很遺憾,這個模型在實際環境中,對新病患的表現非常糟糕

為什麼這個在測試集表現優異的模型,在現實世界中卻慘不忍睹?
按這裡查看答案

在整個管道中監控模型年齡

如果服務資料隨時間演變,但模型未定期重新訓練,模型品質就會下降。追蹤模型以新資料重新訓練的時間,並設定警報的年齡門檻。除了在提供模型時監控模型年齡,您也應在整個管道中監控模型年齡,以避免管道停滯。

測試模型權重和輸出內容在數值上是否穩定

在模型訓練期間,權重和層輸出內容不得為 NaN (非數字) 或 Inf (無限)。編寫測試,檢查權重和層輸出內容的 NaN 和 Inf 值。 此外,請測試某一層的輸出內容是否超過一半不為零。

監控模型成效

獨角獸出現預測工具比預期更受歡迎!您收到大量預測要求,訓練資料也更多。您可能會覺得這很棒,但隨後會發現模型需要越來越多的記憶體和時間才能完成訓練。您決定按照下列步驟監控模型效能:

  • 依程式碼、模型和資料版本追蹤模型成效。這類追蹤功能可協助您找出效能下降的確切原因。
  • 針對新模型版本,測試每秒的訓練步驟數,並與先前版本和固定門檻進行比較。
  • 設定記憶體用量門檻,找出記憶體流失問題。
  • 監控 API 回應時間並追蹤百分位數。雖然 API 回應時間可能超出您的控制範圍,但回應速度緩慢可能會導致實際指標不佳。
  • 監控每秒回答的查詢次數。

測試在放送資料上執行的即時模型品質

您已驗證模型。但如果記錄驗證資料後,獨角獸行為等實際情境發生變化,該怎麼辦?那麼服務模型的品質就會下降。不過,由於實際資料不一定會加上標籤,因此很難在放送時測試品質。如果放送資料未標示,請考慮進行下列測試:

  • 由人工評估人員生成標籤

  • 調查預測結果顯示顯著統計偏誤的模型。請參閱「分類:預測偏差」。

  • 追蹤模型的實際指標。舉例來說,如果您要分類垃圾內容,請比較預測結果與使用者回報的垃圾內容。

  • 在部分查詢中提供新版模型,以減少訓練和服務資料之間可能出現的差異。驗證新的服務模型時,請逐步將所有查詢切換至新版本。

請記得使用這些測試,監控預測品質的突然和緩慢下降。

隨機

讓資料生成管道可重現。假設您想新增特徵,瞭解這項特徵對模型品質的影響。為確保實驗結果公正,除了這項新功能,資料集應完全相同。因此,請確保資料生成中的任何隨機性都可以確定:

  • 為隨機數字產生器 (RNG) 設定種子。播種可確保 RNG 每次執行時都會以相同順序輸出相同值,重新建立資料集。
  • 使用不變的雜湊鍵。 雜湊是分割或取樣資料的常見方式。您可以對每個範例進行雜湊處理,並使用產生的整數決定要將範例放在哪個分割中。每次執行資料產生程式時,雜湊函式的輸入內容不應變更。如果您想視需要重新建立雜湊值,請勿在雜湊值中使用目前時間或隨機數字。

上述方法適用於資料取樣和分割。

雜湊的注意事項

再次假設您正在收集搜尋查詢,並使用雜湊值納入或排除查詢。如果雜湊鍵只使用查詢,那麼在多天的資料中,您會一律納入或一律排除該查詢。一律納入或排除查詢是不好的做法,因為:

  • 訓練集中的查詢會較不多元。
  • 評估集會是人為設定的難題,因為評估集不會與訓練資料重疊。事實上,在放送期間,您會在訓練資料中看到部分即時流量,因此評估結果應反映這點。

您可以改為對查詢 + 查詢日期進行雜湊處理,這樣每天都會產生不同的雜湊值。

圖 7. 動畫:顯示僅根據查詢進行雜湊處理,會導致資料每天都進入同一個 bucket;但根據查詢和查詢時間進行雜湊處理,則會導致資料每天進入不同的 bucket。這三個值區分別是「訓練」、「評估」和「已忽略」。
圖 7. 查詢雜湊與查詢 + 查詢日期雜湊。