機器學習系統的監控與可靠性對於確保模型在實際應用中的有效性至關重要。除了模型本身的效能,還需要關注資料品質、系統穩定性等因素。透過監控預測日誌和系統日誌,可以及時發現潛在問題,例如資料異常或系統錯誤。同時,資料品質監控可以確保模型的輸入資料準確可靠,避免模型因為資料問題而產生錯誤的預測。此外,模型漂移也是一個需要關注的問題,隨著時間推移,模型的效能可能會下降,需要定期重新訓練或調整模型以維持其準確性。

監控與可靠性:確保機器學習系統的穩定運作

在開發和佈署機器學習(ML)系統的過程中,監控和可靠性是至關重要的環節。一個健全的監控系統能夠幫助我們及時發現問題,確保模型的效能和資料品質,從而維持系統的穩定運作。本章將重點介紹監控和可靠性相關的重要議題,包括預測日誌、軟體系統日誌、資料品質監控等方面。

預測日誌與軟體系統日誌

為了有效地監控ML系統的運作,收集和分析預測日誌是必要的。預測日誌記錄了模型的預測結果和相關資訊,可以幫助我們評估模型的效能和識別潛在的問題。此外,軟體系統日誌提供了有關系統內部運作的時間戳事件資訊,有助於除錯問題和改進模型的表現。

日誌收集與分析工具

有多種工具可用於集中管理和分析日誌,例如開源工具如Prometheus和Grafana,或是雲端服務如AWS Cloudwatch和Datadog。選擇適當的日誌管理工具可以幫助我們更好地理解系統的運作狀況。

日誌記錄的最佳實踐

記錄有意義的日誌訊息對於除錯和監控至關重要。良好的日誌記錄應該包含具體的值和ID,而不是靜態的陳述。例如:

# 不良範例
logger.info("計算詐欺機率")

# 良好範例
logger.info(f"使用者 {user_id} 的詐欺機率 = {score:.3f}")

內容解密:

  1. 不良範例的問題:該日誌訊息沒有提供任何有用的資訊,無法幫助除錯或監控。
  2. 良好範例的優點:透過包含具體的變數值(如 scoreuser_id),提供了豐富的上下文資訊,有助於後續的除錯和分析。
  3. 使用格式化字串:利用格式化字串(如 f-string)可以靈活地將變數值嵌入日誌訊息中,提高資訊的可讀性。

資料品質與完整性

資料品質監控對於確保ML模型的準確性和可靠性至關重要。故障資料將不可避免地導致模型做出錯誤的預測。因此,監控資料品質並在必要時採取相應措施(如暫停使用或回退到備用方案)是非常重要的。

處理問題與資料來源損壞

常見的問題包括資料處理問題和資料來源損壞。資料處理問題可能源於上游資料來源的問題或資料處理階段的錯誤。資料來源損壞則可能由於錯誤、物理故障或外部API問題引起。密切監控資料管道有助於早期發現這些問題,避免不可逆轉的損失。

程式碼範例:處理資料來源問題

def get_average_rating(item):
    # 傳回所有商品評論的平均評分,1 - 5 星
    try:
        # 省略實作細節
        pass
    except Exception as e:
        logger.error(f"取得商品 {item} 平均評分時出錯:{str(e)}")
        # 可以根據需要傳回預設值或拋出自定義異常

內容解密:

  1. try-except 結構的使用:透過 try-except 結構捕捉可能發生的異常,確保函式不會因為未處理的異常而當機。
  2. 日誌記錄錯誤資訊:在 except 區塊中記錄錯誤資訊,有助於後續的問題排查和除錯。
  3. 例外處理策略:可以根據具體需求選擇傳回預設值、拋出自定義異常或採取其他還原措施。

14.3 資料品質與完整性

在機器學習系統中,資料品質與完整性是確保模型正確運作的關鍵因素。資料品質問題可能源自多個方面,包括資料缺失、資料損壞、資料格式變更等。這些問題如果不及時發現和處理,可能會導致模型效能下降,甚至造成系統故障。

14.3.1 資料缺失與損壞

在處理資料時,經常會遇到資料缺失或損壞的情況。例如,在一個推薦系統中,如果某些商品的資訊缺失或損壞,可能會導致模型無法正確預測使用者的偏好。

def get_data_from_db():
    try:
        # 從資料函式庫中讀取資料
        data = read_from_db()
        return data
    except Exception:
        # 如果讀取失敗,傳回 -1
        return -1

內容解密:

上述程式碼片段展示了一個從資料函式庫讀取資料的函式。如果讀取過程中發生異常,該函式會傳回 -1。然而,這種做法在機器學習應用中並不理想,因為 -1 可能是一個有效的資料值。更好的做法是傳回一個合理的預設值,例如其他專案的中位數。

14.3.2 級聯模型與上游模型

在複雜的機器學習系統中,多個模型可能相互依賴,形成一個級聯結構。上游模型的輸出作為下游模型的輸入,如果上游模型出現問題,可能會導致整個系統的故障。

例如,在一個內容推薦系統中,一個模型預測商品的熱度,另一個模型根據熱度進行推薦。如果熱度預測模型不準確,可能會導致推薦結果不佳。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
skinparam arrow {
    color #262626
    thickness 2
}
skinparam package {
    borderColor #262626
    backgroundColor #F2F2F2
    fontColor #262626
}
skinparam component {
    borderColor #262626
    backgroundColor #FFFFFF
    fontColor #262626
}

title 機器學習系統監控與可靠性架構

cloud "ML 系統" as System {
    component [模型預測] as Prediction
    component [系統日誌] as SysLog
}

package "監控層" {
    package "日誌監控" {
        [預測日誌記錄] as PredictLog
        [系統日誌分析] as SystemLog
        [監控工具 (Prometheus/Grafana)] as Tools
    }

    package "資料品質監控" {
        [資料缺失檢測] as MissingData
        [資料損壞偵測] as CorruptData
        [格式變更追蹤] as FormatChange
    }

    package "模型效能監控" {
        [模型漂移偵測] as ModelDrift
        [資料漂移分析] as DataDrift
        [效能指標追蹤] as Metrics
    }
}

package "可靠性機制" {
    [異常告警] as Alert
    [備援切換] as Fallback
    [自動還原] as Recovery
}

System --> PredictLog
System --> SysLog
PredictLog --> Tools
SystemLog --> Tools

PredictLog --> MissingData
PredictLog --> CorruptData
PredictLog --> FormatChange
PredictLog --> DataDrift

Prediction --> ModelDrift
Prediction --> Metrics

Tools -> Alert
ModelDrift -> Alert
DataDrift -> Alert

Alert --> Fallback
Alert --> Recovery

@enduml

此圖示展示了一個級聯模型的結構,其中 NER 模型的輸出被傳遞給向量資料函式庫,最終由最終模型進行處理。即使 NER 模型的微小漂移也可能導致下游模型的累積誤差。

內容解密:

級聯模型結構在許多應用中很常見,例如在自然語言處理、影像識別等領域。然而,這種結構也帶來了挑戰,因為上游模型的錯誤可能會被放大並傳遞給下游模型。因此,監控和測試級聯模型中的每個元件至關重要。

14.3.3 資料架構變更

資料架構的變更,例如資料格式或型別的變更,可能會對機器學習模型造成重大影響。這些變更可能導致模型失去訊號,因為模型可能無法比對新的類別或處理新的特徵。

def handle_schema_change(old_data, new_schema):
    # 將舊資料轉換為符合新 schema 的格式
    transformed_data = transform_data(old_data, new_schema)
    return transformed_data

內容解密:

上述程式碼片段展示了一個處理資料架構變更的函式。透過將舊資料轉換為符合新 schema 的格式,可以減少資料架構變更對模型的影響。這種方法需要仔細設計和測試,以確保轉換過程不會引入新的錯誤。

14.3.4 訓練與服務偏差

訓練與服務偏差是指模型在訓練資料上表現良好,但在實際應用中表現不佳的情況。這通常是由於訓練資料與實際應用中的資料分佈不一致所致。

def detect_training_serving_skew(training_data, serving_data):
    # 比較訓練資料和服務資料的分佈
    skew = compare_distributions(training_data, serving_data)
    return skew

內容解密:

上述程式碼片段展示了一個檢測訓練與服務偏差的函式。透過比較訓練資料和服務資料的分佈,可以發現是否存在偏差。如果存在偏差,可能需要重新訓練模型或調整服務資料的處理流程。

14.3.5 如何監控和反應

監控機器學習系統的關鍵是預先了解可能出現的問題。除了傳統的資料監控外,還需要對模型的輸入和輸出進行監控,以確保模型的正確運作。

常見的監控指標包括:

  • 檢查缺失資料:搜尋特定特徵中的缺失資料以及模型輸入中的整體缺失資料比例。
  • 資料分佈監控:監控資料分佈的變化,以發現潛在的偏差。
def monitor_data_quality(data):
    # 檢查缺失資料
    missing_data = check_missing_data(data)
    # 監控資料分佈
    distribution = monitor_distribution(data)
    return missing_data, distribution

內容解密:

上述程式碼片段展示了一個監控資料品質的函式。透過檢查缺失資料和監控資料分佈,可以及時發現資料品質問題並採取相應措施。

總之,確保機器學習系統的可靠性和效能需要綜合考慮多個因素,包括資料品質、模型設計、監控和測試等。透過仔細設計和實施這些措施,可以提高系統的穩定性和準確性。

資料品質與完整性監控

在機器學習(ML)系統中,資料品質的監控至關重要。確保輸入資料的品質對於模型的準確性和可靠性有著直接的影響。本章節將討論資料品質監控的重要性、方法和挑戰。

資料品質監控的重要性

資料品質監控是 ML 系統可靠性的基礎。糟糕的資料品質可能導致模型效能下降、預測錯誤,甚至系統當機。因此,必須實施有效的資料品質監控機制,以確保輸入資料的準確性、完整性和一致性。

資料品質監控的方法

  1. 缺失值檢查:檢查資料中的缺失值,例如使用 “N/A”、“NaN” 或 “undefined” 等標記。可以使用視覺化工具,如繪圖,來識別缺失資料,並設定閾值以決定何時暫停模型或使用備用方案。

    import pandas as pd
    
    # 檢查缺失值
    def check_missing_values(df):
        return df.isnull().sum()
    
    # 範例用法
    df = pd.read_csv('data.csv')
    missing_values = check_missing_values(df)
    print(missing_values)
    

    內容解密:

    • import pandas as pd:匯入 pandas 函式庫並簡稱為 pd,用於資料處理。
    • def check_missing_values(df)::定義一個函式來檢查 DataFrame 中的缺失值。
    • return df.isnull().sum():傳回每個欄位的缺失值總數。
    • df = pd.read_csv('data.csv'):讀取名為 ‘data.csv’ 的 CSV 檔案。
    • missing_values = check_missing_values(df):呼叫函式檢查缺失值。
    • print(missing_values):列印缺失值的結果。
  2. 重複資料檢查:檢查資料中的重複值。重複值可能改變資料分佈,影響下游模型。

    # 檢查重複行
    def check_duplicate_rows(df):
        return df.duplicated().sum()
    
    # 範例用法
    duplicate_rows = check_duplicate_rows(df)
    print(duplicate_rows)
    

    內容解密:

    • def check_duplicate_rows(df)::定義一個函式來檢查 DataFrame 中的重複行。
    • return df.duplicated().sum():傳回重複行的總數。
    • duplicate_rows = check_duplicate_rows(df):呼叫函式檢查重複行。
    • print(duplicate_rows):列印重複行的結果。
  3. 資料架構驗證:驗證輸入資料的架構是否符合預期,以檢測錯誤輸入。

  4. 特徵型別約束:對個別特徵型別進行約束,例如確保某個特徵是數值型。

  5. 特徵範圍約束:對個別特徵的範圍進行約束,例如檢查年齡是否在合理範圍內。

  6. 特徵統計:跟蹤特徵的平均值、最小-最大範圍、標準差等統計量,以檢測異常行為。

  7. 異常檢測:使用異常檢測方法來檢測不尋常的資料點。

非結構化資料的監控

對於非結構化資料,如影像、文字或音訊,可以引入簡單的特徵來進行資料品質監控,例如影像的亮度或顏色溫度,文字的長度,音訊的波頻分佈等。

挑戰與解決方案

  1. 監控過程的執行:設定監控系統可能耗時耗力,尤其是需要將領域專家知識編碼到監控系統中時。

  2. 管理多個觸點:設計監控框架以檢測關鍵問題而不至於被過多的警示淹沒。

  3. 追蹤根源:在複雜的管道中,追蹤資料品質問題的根源可能困難,需要設定資料譜系和追蹤機制。

14.4 模型品質與相關性

即使軟體系統功能正常且資料品質良好,也不能保證機器學習(ML)模型會如預期般運作。其中一個可能出現的問題是模型衰退(model decay),即模型的效能隨著時間的推移而下降,無論是突然發生還是逐漸惡化。

模型衰退的定義與成因

模型衰退,也稱為模型漂移(model drift)或模型陳舊(staleness),指的是模型的效能隨著時間而下降的現象。這種情況可能由多種原因引起,例如資料的變化或模型訓練所依據的真實世界關係的變化。模型衰退的速度可能差異很大;有些模型可以持續多年無需更新,而其他模型可能需要每天重新訓練以適應新的資料。

監控模型衰退的方法

監控模型衰退的一種方法是定期追蹤關鍵效能指標,並將其與歷史基準進行比較。如果這些指標開始顯著下降,可能表明模型已經衰退。定期重新訓練模型可以幫助解決模型漂移的問題。

兩種主要的模型漂移型別

  1. 資料漂移(Data Drift):當模型應用於之前未曾遇到的輸入資料時,例如來自新人口統計的資料,就會發生資料漂移。這意味著原始資料集對於模型的泛化能力不夠充分。

  2. 概念漂移(Concept Drift):當資料中的關係發生變化時,例如使用者行為的演變,就會發生概念漂移。持續監控模型漂移並採取適當的措施非常重要,其中一個解決方案是重新訓練模型以維持其準確性和效率。

模型漂移的可能成因

  • 全球環境的變化,例如疫情、戰爭、危機或立法變革的開始。
  • 有意的商業變革,例如在新地區推出應用程式或針對新的使用者群體。
  • 當惡意行為者試圖適應模型的行為時發生的對抗性適應。
  • 模型回饋迴圈,其中模型本身影響現實。例如,推薦系統使用當前商品熱度作為特徵並經常推薦它,因此該商品變得更加熱門,從而形成自我強化。

輸出漂移(Output Drift)

有些人將輸出漂移定義為機器學習模型產生的預測、推薦或其他輸出的變化。這種變化可以透過將「新」輸出資料與「舊」輸出資料進行統計測試或描述性統計來檢測。例如,如果一個很少推薦顧客購買太陽眼鏡的模型現在卻將它們推播到每個推薦區塊中,這可能表明輸出漂移。

解決模型漂移

透過識別和解決輸出漂移,可以幫助確保模型繼續產生可靠和準確的結果。模型漂移可能導致模型錯誤增加或預測不正確,在嚴重的情況下,模型可能會在一夜之間變得不適用。持續監控模型漂移並採取適當措施以維持模型的準確性和有效性至關重要。

資料漂移的詳細說明

資料漂移,也稱為特徵漂移或協變數偏移,指的是機器學習模型的輸入資料發生了變化,使得模型不再適用於新的資料。這種情況可能發生在資料中變數的分佈與模型訓練時的分佈顯著不同時。因此,即使模型在類別似於「舊」資料上仍然表現良好,但在新資料上的表現可能會很差。

資料漂移的例子

一個用於預測使用者線上上市場購買可能性的機器學習模型,如果被應用於透過不同的廣告活動獲得的新使用者群體,就可能會發生資料漂移。如果新使用者來自不同的來源,例如Facebook,而模型在訓練期間沒有足夠來自該來源的範例,則它可能對這部分新使用者表現不佳。同樣,如果將模型應用於新的地理區域或人口統計區段,或者資料中重要特徵的分佈隨時間發生變化,也可能會發生資料漂移。

處理資料漂移

要解決資料漂移,可能需要使用新資料重新訓練模型,或者為新的資料區段建立新的模型。監控資料和模型的效能,可以幫助及早發現資料漂移並採取糾正措施。

圖表說明

此圖示展示了概念漂移和資料漂移之間的區別。在概念漂移中,相同的輸入可能會導致新的預期輸出;而在資料漂移中,輸入資料發生了變化,但模型並未相應調整。

graph LR
    A[概念漂移] -->|相同的輸入可能導致新的輸出|> B[輸出變化]
    C[資料漂移] -->|輸入資料變化,模型未調整|> D[模型效能下降]

內容解密:

上述Plantuml圖表清晰地展示了概念漂移和資料漂移的不同之處。左側的概念漂移表示,即使輸入相同,模型的輸出也可能因為真實世界關係的變化而改變。右側的資料漂移則表示,當輸入資料的分佈發生變化,而模型的訓練資料並未包含這些變化時,模型的效能就會下降。理解這兩種漂移對於維護模型的準確性和可靠性至關重要。

14.4 模型品質與相關性

在生產環境中維護機器學習(ML)模型的效能,監控是至關重要的環節。模型的表現可能會因為資料漂移(data drift)或概念漂移(concept drift)而隨時間下降。這些變化可能導致模型的預測準確性降低,甚至使模型完全失效。

14.4.1 資料漂移

資料漂移是指輸入特徵的分佈隨時間發生變化,這種變化可能會影響模型的效能。資料漂移並非資料本身的問題,因此需要在模型層級進行修正。

14.4.2 概念漂移

概念漂移發生在模型學習到的模式不再有效時,即使輸入特徵的分佈保持不變。根據變化的規模,概念漂移可能導致模型準確性下降或使模型完全過時。

概念漂移有多種型別,包括漸進式概念漂移、突然的概念漂移和迴圈概念漂移。漸進式或增量式漂移發生在外部因素隨時間變化時,導致模型的效能逐漸下降(參見圖14.8)。這種漂移通常是可預期的,可能由多種因素引起,包括消費者行為的變化、經濟變化或來自物理感測器的資料變化。

圖14.8 漸進式概念漂移

為瞭解決漸進式概念漂移的問題,可能需要使用新資料重新訓練模型,甚至完全重建模型。為了確定是否需要這樣做,監控模型在時間上的表現至關重要,以確保其繼續做出準確和可靠的預測。模型的效能下降或“老化”的速度可能因具體應用和使用的資料而有很大差異。

為了估計模型的老化速度,使用舊資料進行測試並測量不同重新訓練頻率下的模型效能是有幫助的。這可以提供一個指示,表明應該多久更新一次模型以保持其準確性。同時,也需要考慮外部因素的影響,例如市場變化或新產品的推出,這些可能會影響模型的輸入和輸出之間的關係,並導致概念漂移。

監控ML模型的效能並根據需要定期重新訓練是維持其在生產環境中有效性的關鍵。

突然的概念漂移通常是由於外部環境的突然或劇烈變化引起的,這種變化很難被忽視。這類別變化可能會影響所有型別的模型,即使是通常“穩定”的模型。例如,COVID-19大流行幾乎在一夜之間影響了移動和購物模式,導致需求預測模型無法預測某些產品的突增或因邊境關閉而取消的大部分航班。除了像大流行或股市崩盤這樣的事件外,突然的概念漂移也可能由於中央銀行的利率變化、生產線的技術革新或應用程式介面的重大更新而發生。這些變化可能導致模型無法適應未見的模式,變得過時或因使用者旅程的變化而變得無關緊要。

在ML系統中,某些事件或模式隨時間重複出現是很常見的事情。例如,人們在假日季節或一週中的某些天可能會表現出不同的行為。這些重複出現的變化,也被稱為迴圈漂移,可以在系統設計中被預期和考慮(參見圖14.9)。例如,我們可以建立一組模型,在特定條件下應用,或將迴圈變化和特殊事件納入系統設計中,以考慮這種迴圈漂移,防止模型效能下降。

圖14.9 迴圈概念漂移

14.4.3 如何監控

監控模型品質有兩個主要目的:

  • 給予您對模型可靠性的信心
  • 在出現問題時提醒您

有效的監控設定應該提供足夠的背景,以便有效地識別和解決模型出現的任何問題。這可能涉及三個主要場景:

  • 重新訓練模型
  • 重建模型
  • 使用備份策略

資料漂移對於表格資料可能比對於其他資料形式(如影像或語音)更為重要。如果預測和真實資料可用之間存在延遲,這可能是監控代理指標(包括資料和預測漂移)的訊號。對於高風險或關鍵模型,您可能會使用更細粒度的監控和特定的指標(例如,公平性)。低風險模型可能只需要監控與模型型別相關的標準指標。

有數百種不同的指標可以用來評估ML模型的效能(參見第5章)。我們將涵蓋這些指標可以被歸入的幾個類別。

內容解密:

  1. 監控目的:監控的主要目的是為了確保模型的可靠性,並在出現問題時及時通知相關人員。
  2. 監控場景:根據問題的性質,可能需要重新訓練模型、重建模型或採用備份策略。
  3. 資料漂移的重要性:資料漂移對不同型別的資料影響不同,尤其是對於表格資料。
  4. 指標選擇:根據模型的風險程度和型別,選擇合適的監控指標。

模型品質指標評估模型的預測品質。這些指標可以在真實值或反饋可用時計算,可能包括:

  • 迴歸模型的平均絕對誤差和均方根誤差
  • 分類別模型的準確度、精確率和F1分數
  • 排序模型的Top-k準確度和平均精確率

這些指標幫助我們瞭解模型的表現,並根據需要進行調整,以維持其在生產環境中的有效性。