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

恭喜!您已部署獨角獸模式。模型應可全年無休順利執行。為確保這項功能運作正常,您必須監控機器學習 (ML) 管道。

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

如要監控資料,您應撰寫資料必須滿足的規則,持續檢查資料是否符合預期的統計值。這組規則稱為資料結構定義。請按照下列步驟定義資料架構:

  1. 瞭解特徵的範圍和分布情形。如為類別特徵,請瞭解可能的值集。

  2. 將您的理解編碼至資料結構定義。以下是規則範例:

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

    • 異常狀況
    • 類別變數的值不符預期
    • 非預期的資料分布

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

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

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

  • 所有數值特徵都會縮放至 0 到 1 之間。
  • One-hot 編碼向量只包含單一 1 和 N-1 個 0。
  • 轉換後的資料分布符合預期。舉例來說,如果您使用 Z 分數進行標準化,Z 分數的平均值應為 0。
  • 異常值會受到處理,例如透過縮放裁剪

檢查重要資料切片的指標

成功的整體有時會掩蓋失敗的子集。換句話說,即使整體指標表現良好,模型在某些情況下仍可能做出不佳的預測。例如:

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

如果您是那種滿意整體出色的 AUC 的工程師,那麼您可能不會注意到模型在撒哈拉沙漠的問題。如果您希望每個地區都能獲得良好的預測結果,就必須追蹤每個地區的成效。資料子集 (例如與撒哈拉沙漠相對應的子集) 稱為「資料切片」

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

使用實際指標

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

檢查訓練/應用偏差

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

類型 定義 範例 解決方法
結構定義偏差 訓練和提供輸入資料時,不符合相同的結構定義。 模型持續使用舊資料進行訓練時,服務資料的格式或分布會發生變化。 使用相同的結構定義驗證訓練和服務資料。請務必另外檢查結構定義未檢查的統計資料,例如缺失值的比例
特徵偏差 訓練資料和服務資料不同。 訓練和應用的特徵工程程式碼不同,因此會產生不同的經過調整的資料。 與結構定義偏差類似,請在訓練和提供經過設計的資料時套用相同的統計規則。追蹤偵測到的偏差特徵數量,以及每個特徵的偏差範例比率。

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

練習:檢查您的理解程度

假設您有一家網路商店,想要預測特定日期的收益。您的 ML 目標是使用顧客人數做為特徵,預測每日收益。

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

檢查標籤外洩

標籤外洩是指您嘗試預測的真值標籤不小心輸入訓練特徵。標籤外洩有時很難偵測。

練習:檢查您的理解程度

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

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

標籤如下:

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

您必須仔細劃分資料,確保訓練集與驗證集和測試集完全隔離。模型在驗證集和測試集中的表現非常出色,指標也非常出色。很遺憾,在現實世界中,這個模型對新病患的表現極差

為何這個在測試集上表現出色的模型,在實際應用中卻慘遭滑鐵盧?
按一下這裡查看答案

在管道中監控模型年齡

如果服務資料會隨時間變化,但模型並未定期重新訓練,則模型品質會下降。追蹤模型自以新資料重新訓練以來的時間,並設定警示年齡門檻。除了監控模型在服務時的年齡外,您還應監控整個管道中的模型年齡,以便偵測管道停滯。

測試模型權重和輸出結果是否穩定

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

監控模型成效

你的獨角獸出現預測工具比預期更受歡迎!您收到大量預測要求,甚至更多訓練資料。您可能會認為這麼做很棒,直到發現模型需要越來越多的記憶體和時間才能訓練。您決定按照下列步驟監控模型效能:

  • 根據程式碼、模型和資料的版本追蹤模型效能。這類追蹤功能可讓您找出效能降低的確切原因。
  • 測試新模型版本每秒訓練步驟數,並與舊版本和固定閾值進行比較。
  • 設定記憶體用量門檻,以便偵測記憶體流失問題。
  • 監控 API 回應時間並追蹤百分位數。雖然 API 回應時間可能不在您的掌控範圍內,但回應速度緩慢可能會導致實際成效不佳。
  • 監控每秒回答的查詢次數。

測試即時模型在已提供資料上的品質

您已驗證模型。不過,如果在記錄驗證資料後,實際情境 (例如獨角獸行為) 有所變更,該怎麼辦?這會導致您提供的模型品質降低。不過,由於實際資料不一定有標籤,因此很難測試服務品質。如果放送資料未標示,請考慮進行下列測試:

  • 使用人工評分人員產生標籤

  • 調查模型在預測中是否有顯著的統計偏誤。請參閱分類:預測偏差

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

  • 針對部分查詢提供新模型版本,藉此減輕訓練資料和服務資料之間的差異。驗證新的服務模型時,請逐步將所有查詢切換至新版本。

進行這些測試時,請務必監控預測品質是否會突然或緩慢地惡化。

隨機

讓資料產生管道可重現。假設您想新增特徵,看看這會對模型品質產生什麼影響。為了進行公平的實驗,除了這項新功能外,資料集應完全相同。基於這項精神,請確保資料產生過程中的任何隨機化動作都能以決定論方式進行:

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

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

雜湊處理的注意事項

再想想,假設您正在收集搜尋查詢,並使用雜湊運算法來納入或排除查詢。如果雜湊鍵只使用查詢,那麼在多天資料中,您會一律加入該查詢,或是一律排除該查詢。一律包含或一律排除查詢會造成以下問題:

  • 訓練集會顯示較少樣化的查詢。
  • 您的評估集會人為地難以處理,因為它們不會與訓練資料重疊。實際上,在放送時間,您會在訓練資料中看到部分即時流量,因此評估結果應反映這一點。

您可以改為對查詢加上日期進行雜湊運算,這樣每天的雜湊運算結果就會不同。

 

圖 7. 動畫示意圖:僅以查詢進行雜湊運算會導致資料每天都歸入相同的值組,但如果加上查詢時間,則資料每天都會歸入不同的值組。這三個值區分別是訓練、評估和忽略。
圖 7. 查詢雜湊與查詢 + 查詢時間雜湊。