本文是分為兩部分的系列文章的第一篇,探討機器學習 (ML) 的資料工程和特徵工程主題,重點在於監督式學習工作。第一部分討論在 Google Cloud 的 ML 管線中前處理資料的最佳做法。本文著重說明如何使用 TensorFlow 和開放原始碼 TensorFlow Transform (tf.Transform
) 程式庫來準備資料、訓練模型,以及部署模型以進行預測。本文重點說明 ML 資料前處理的挑戰,並說明在 Google Cloud 上有效執行資料轉換的選項和情境。
本文假設您已熟悉 BigQuery、Dataflow、Vertex AI 和 TensorFlow Keras API。
第二份文件「搭配 Google Cloud 進行 ML 資料前處理」提供逐步教學課程,說明如何實作 tf.Transform
管線。
簡介
ML 可協助您自動找出資料中複雜且可能實用的模式。這些模式會濃縮在 ML 模型中,然後可用於新的資料點,此程序稱為「進行預測」或「執行推論」。
建構 ML 模型是一個多步驟程序。每個步驟都有其技術和概念上的挑戰。本分為兩部分的系列文章著重於監督式學習工作,以及選取、轉換和擴增來源資料的程序,以建立目標變數的強大預測訊號。這些運算結合了領域知識與資料科學技術。這些運算是 特徵工程 的精髓。
實際應用 ML 模型的訓練資料集大小可能輕易達到或超過 1 TB。因此,您需要大規模資料處理架構,才能有效率地分散式處理這些資料集。當您使用 ML 模型進行預測時,必須將您用於訓練資料的相同轉換套用至新的資料點。藉由套用相同的轉換,您就能以模型預期的形式將即時資料集呈現給 ML 模型。
本文討論了特徵工程運算在不同精細程度層級 (執行個體層級、完整掃描和時間範圍彙總) 的這些挑戰。本文也說明在 Google Cloud 上執行 ML 資料轉換的選項和情境。
本文也概述 TensorFlow Transform (tf.Transform
),這是一個適用於 TensorFlow 的程式庫,可讓您透過資料前處理管線定義執行個體層級和完整掃描資料轉換。這些管線會透過 Apache Beam 執行,並建立構件,讓您在預測期間套用與模型部署時相同的轉換。
ML 資料前處理
本節介紹資料前處理運算和資料整備階段。本節也討論前處理運算的類型及其精細程度。
資料工程與特徵工程的比較
ML 資料前處理同時包含資料工程和特徵工程。資料工程是將原始資料轉換為整備資料的程序。特徵工程接著會調整整備資料,以建立 ML 模型預期的特徵。這些詞彙具有下列含義:
- 原始資料 (或僅稱為 資料)
- 資料的來源格式,未經任何 ML 事先準備。在此情況下,資料可能採用原始格式 (位於資料湖中) 或轉換格式 (位於資料倉儲中)。資料倉儲中的轉換資料可能已從其原始格式轉換,以用於分析。不過,在此情況下,「原始資料」表示資料尚未針對您的 ML 工作進行特別準備。如果資料是從串流系統傳送,最終呼叫 ML 模型進行預測,則資料也會被視為原始資料。
- 整備資料
- 資料集採用適用於您的 ML 工作的形式:資料來源已剖析、聯結並放入表格形式。整備資料會彙總及摘要為正確的精細程度,例如,資料集中的每一列代表一位獨特的客戶,而每一欄代表客戶的摘要資訊,例如過去六週的總支出。在整備資料表中,不相關的欄已捨棄,且無效的記錄已篩除。對於監督式學習工作,目標特徵會呈現。
- 工程化特徵
- 資料集具有模型預期的已調整特徵,也就是說,特徵是透過對整備資料集中的欄執行特定的 ML 專用運算所建立,並在訓練和預測期間為您的模型建立新特徵,如稍後「前處理運算」一節所述。這些運算的範例包括將數值欄調整為介於 0 和 1 之間的值、裁剪值,以及 單熱編碼 類別特徵。
下圖 (圖 1) 顯示準備前處理資料所涉及的步驟:
實際上,來自相同來源的資料通常處於不同的整備階段。例如,資料倉儲中表格的欄位可能會直接用作工程化特徵。同時,相同表格中的另一個欄位可能需要經過轉換,才能成為工程化特徵。同樣地,資料工程和特徵工程運算可能會在相同的資料前處理步驟中合併。
前處理運算
資料前處理包含多個運算。每個運算都旨在協助 ML 建構更佳的預測模型。這些前處理運算的詳細資訊不在本文的範圍內,但本節會簡要說明部分運算。
對於結構化資料,資料前處理運算包括下列項目:
- 資料清理:從原始資料中移除或修正具有損毀或無效值的記錄,並移除缺少大量欄的記錄。
- 執行個體選取和分割:從輸入資料集中選取資料點,以建立 訓練集、評估 (驗證) 集和測試集。此程序包括適用於重複隨機取樣、少數類別過度取樣和分層分割的技術。
- 特徵調整:提升 ML 特徵的品質,包括調整數值和正規化數值、補插遺失值、裁剪離群值,以及調整偏斜分佈的值。
- 特徵轉換:將數值特徵轉換為類別特徵 (透過 分組),並將類別特徵轉換為數值表示法 (透過單熱編碼、計數學習、稀疏特徵嵌入等)。部分模型僅適用於數值或類別特徵,而其他模型則可處理混合類型特徵。即使模型可以同時處理這兩種類型,它們仍可受益於相同特徵的不同表示法 (數值和類別)。
- 特徵擷取:使用 PCA、嵌入擷取和 雜湊 等技術,藉由建立較低維度、更強大的資料表示法來減少特徵數量。
- 特徵選取:使用 篩選或包裝方法 選取輸入特徵的子集,以訓練模型,並忽略不相關或多餘的特徵。如果特徵缺少大量值,特徵選取也可能僅僅涉及捨棄特徵。
- 特徵建構:使用 多項式展開 (透過使用單變數數學函式) 或 特徵交叉 (以擷取特徵互動) 等典型技術來建立新特徵。特徵也可以透過使用 ML 使用案例領域的業務邏輯來建構。
當您使用非結構化資料 (例如,圖片、音訊或文字文件) 時,深度學習會取代以領域知識為基礎的特徵工程,方法是將其摺疊到模型架構中。卷積層是自動特徵前處理器。建構正確的模型架構需要一些資料的經驗知識。此外,還需要進行一些前處理,例如下列項目:
- 適用於文字文件:詞幹還原和詞形還原、TF-IDF 計算和 n 元語法 擷取、嵌入查詢。
- 適用於圖片:裁剪、調整大小、裁切、高斯模糊和 Canary 篩選器。
- 適用於所有資料類型 (包括文字和圖片):遷移學習,將完全訓練模型的倒數第二層視為特徵工程步驟。
前處理精細程度
本節討論資料轉換類型的精細程度。本節說明當使用套用至訓練資料的轉換準備新的資料點以進行預測時,此觀點為何至關重要。
前處理和轉換運算可根據運算精細程度分類如下:
訓練和預測期間的執行個體層級轉換。這些是簡單明瞭的轉換,其中轉換只需要來自相同執行個體的值。例如,執行個體層級轉換可能包括將特徵的值裁剪為某個臨界值、多項式展開另一個特徵、將兩個特徵相乘,或比較兩個特徵以建立布林值標記。
這些轉換必須在訓練和預測期間以相同方式套用,因為模型將根據轉換後的特徵而非原始輸入值進行訓練。如果資料未以相同方式轉換,則模型會表現不佳,因為它會呈現值分佈與其訓練時不同的資料。如需詳細資訊,請參閱「前處理挑戰」一節中關於訓練-服務偏差的討論。
訓練期間的全域掃描轉換,但預測期間的執行個體層級轉換。在此情境中,轉換是有狀態的,因為它們使用一些預先計算的統計資料來執行轉換。在訓練期間,您會分析整個訓練資料主體,以計算最小值、最大值、平均值和變異數等數量,以便轉換訓練資料、評估資料和預測時的新資料。
例如,若要正規化用於訓練的數值特徵,您需要計算整個訓練資料的平均值 (μ) 和標準差 (σ)。此計算稱為「全域掃描」 (或「分析」) 運算。當您部署模型以進行預測時,會正規化新資料點的值,以避免訓練-服務偏差。因此,在訓練期間計算的 μ 和 σ 值會用於調整特徵值,這是下列簡單的執行個體層級運算:
$$ value_{scaled} = (value_{raw} - \mu) \div \sigma $$全域掃描轉換包括下列項目:
- 使用從訓練資料集計算的 min 和 max 調整數值特徵的 MinMax 比例。
- 使用在訓練資料集上計算的 μ 和 σ 調整數值特徵的標準比例 (Z 分數正規化)。
- 使用分位數分組數值特徵。
- 使用中位數 (數值特徵) 或眾數 (類別特徵) 補插遺失值。
- 透過擷取輸入類別特徵的所有相異值 (詞彙表),將字串 (名義值) 轉換為整數 (索引)。
- 計算詞彙 (特徵值) 在所有文件 (執行個體) 中出現的次數,以計算 TF-IDF。
- 計算輸入特徵的 PCA,以將資料投影到較低維度的空間 (具有線性相關特徵)。
您應僅使用訓練資料來計算 μ、σ、min 和 max 等統計資料。如果您為這些運算新增測試和評估資料,則表示您正在將評估和測試資料中的 資訊洩漏 給模型訓練。這樣做會影響測試和評估結果的可靠性。為了確保您對所有資料集套用一致的轉換,您會使用從訓練資料計算的相同統計資料來轉換測試和評估資料。
訓練和預測期間的歷史彙總。這涉及建立業務彙總、衍生和標記,作為預測工作的輸入訊號,例如,建立客戶的 新近性、頻率和消費金額 (RFM) 指標,以建構傾向模型。這些類型的特徵可以預先計算並儲存在特徵商店中,以便在模型訓練、批次評分和線上預測部署期間使用。您也可以在訓練和預測之前對這些彙總執行額外的特徵工程 (例如,轉換和調整)。
訓練期間的歷史彙總,但預測期間的即時彙總。此方法涉及透過摘要時間內的即時值來建立特徵。在此方法中,要彙總的執行個體是透過時間視窗子句定義的。例如,如果您想要訓練模型,根據過去 5 分鐘、過去 10 分鐘、過去 30 分鐘和其他間隔的路徑交通指標來估計計程車行程時間,則可以使用此方法。您也可以使用此方法,根據過去 3 分鐘內計算的溫度和震動值移動平均值來預測引擎零件的故障。雖然這些彙總可以離線準備以進行訓練,但它們是在部署期間從資料串流即時計算的。
更精確地說,當您準備訓練資料時,如果彙總值不在原始資料中,則該值會在資料工程階段建立。原始資料通常儲存在資料庫中,格式為
(實體、時間戳記、值)
。在先前的範例中,實體
是計程車路線的路線區段識別碼,以及引擎故障的引擎零件識別碼。您可以使用視窗運算來計算(實體、時間索引、時間範圍內的彙總值)
,並將彙總特徵用作模型訓練的輸入。當部署用於即時 (線上) 預測的模型時,模型預期從彙總值衍生的特徵作為輸入。因此,您可以使用 Apache Beam 等串流處理技術,從串流到您系統的即時資料點計算彙總。串流處理技術會根據時間視窗彙總即時資料,因為新的資料點會到達。您也可以在訓練和預測之前對這些彙總執行額外的特徵工程 (例如,轉換和調整)。
Google Cloud 上的 ML 管線
本節討論在 Google Cloud 上使用受管理服務訓練和部署 TensorFlow ML 模型的一般端對端管線的核心元件。本節也討論您可以在何處實作不同類別的資料前處理運算,以及您在實作這類轉換時可能面臨的常見挑戰。「tf.Transform 的運作方式」一節說明 TensorFlow Transform 程式庫如何協助解決這些挑戰。
高階架構
下圖 (圖 2) 顯示用於訓練和部署 TensorFlow 模型的一般 ML 管線的高階架構。圖表中的標籤 A、B 和 C 是指管線中可進行資料前處理的不同位置。下列各節提供關於這些步驟的詳細資訊。
管線包含下列步驟:
- 匯入原始資料後,表格資料會儲存在 BigQuery 中,而圖片、音訊和影片等其他資料則儲存在 Cloud Storage 中。本系列文章的第二部分使用儲存在 BigQuery 中的表格資料作為範例。
- 資料工程 (準備) 和特徵工程是使用 Dataflow 大規模執行的。此執行作業會產生 ML 就緒的訓練集、評估集和測試集,這些資料集會儲存在 Cloud Storage 中。理想情況下,這些資料集會儲存為 TFRecord 檔案,這是 TensorFlow 運算的最佳化格式。
- TensorFlow 模型 訓練器套件 會提交至 Vertex AI Training,後者會使用先前步驟中的前處理資料來訓練模型。此步驟的輸出是訓練完成的 TensorFlow SavedModel,其會匯出至 Cloud Storage。
- 訓練完成的 TensorFlow 模型會部署至 Vertex AI Prediction 作為服務,該服務具有 REST API,因此可用於線上預測。相同的模型也可用於批次預測工作。
- 模型部署為 REST API 後,用戶端應用程式和內部系統可以透過傳送包含一些資料點的請求來叫用 API,並接收來自模型的預測回應。
- 為了協調和自動化此管線,您可以使用 Vertex AI Pipelines 作為排程器,以叫用資料準備、模型訓練和模型部署步驟。
您也可以使用 Vertex AI Feature Store 來儲存輸入特徵以進行預測。例如,您可以定期從最新的原始資料建立工程化特徵,並將其儲存在 Vertex AI Feature Store 中。用戶端應用程式會從 Vertex AI Feature Store 擷取所需的輸入特徵,並將其傳送至模型以接收預測。
前處理的執行位置
在圖 2 中,標籤 A、B 和 C 顯示資料前處理運算可以在 BigQuery、Dataflow 或 TensorFlow 中進行。下列各節說明這些選項的運作方式。
選項 A:BigQuery
一般而言,邏輯會在 BigQuery 中實作,以執行下列運算:
- 取樣:從資料中隨機選取子集。
- 篩選:移除不相關或無效的執行個體。
- 分割:分割資料以產生訓練集、評估集和測試集。
BigQuery SQL 指令碼可用作 Dataflow 前處理管線的來源查詢,這是圖 2 中的資料處理步驟。例如,如果系統在加拿大使用,且資料倉儲具有來自世界各地的交易,則最好在 BigQuery 中篩選以取得僅限加拿大的訓練資料。BigQuery 中的特徵工程既簡單又可擴充,並支援實作執行個體層級和歷史彙總特徵轉換。
不過,如果您僅將模型用於批次預測 (評分),或者特徵是在 BigQuery 中預先計算,但儲存在 Vertex AI Feature Store 中以在線上預測期間使用,則建議您僅將 BigQuery 用於特徵工程。如果您計畫部署模型以進行線上預測,且線上特徵商店中沒有工程化特徵,則必須複製 SQL 前處理運算,以轉換其他系統產生的原始資料點。換句話說,您需要實作兩次邏輯:一次在 SQL 中以前處理 BigQuery 中的訓練資料,第二次在取用模型的應用程式邏輯中以前處理線上資料點以進行預測。
例如,如果您的用戶端應用程式是以 Java 撰寫,則您需要以 Java 重新實作邏輯。這可能會因為實作差異而導致錯誤,如稍後本文「前處理挑戰」一節的訓練-服務偏差中所述。維護兩種不同的實作也會造成額外的額外負荷。每當您變更 SQL 中的邏輯以前處理訓練資料時,您都需要相應地變更 Java 實作,以前處理部署時間的資料。
如果您僅將模型用於批次預測 (例如,使用 Vertex AI 批次預測),且您的評分資料來源來自 BigQuery,則您可以將這些前處理運算實作為 BigQuery SQL 指令碼的一部分。在這種情況下,您可以使用相同的前處理 SQL 指令碼來準備訓練和評分資料。
全域掃描有狀態轉換不適合在 BigQuery 中實作。如果您使用 BigQuery 進行全域掃描轉換,則需要輔助表格來儲存有狀態轉換所需的數量,例如調整數值特徵的平均值和變異數。此外,在 BigQuery 上使用 SQL 實作全域掃描轉換會增加 SQL 指令碼的複雜性,並在訓練和評分 SQL 指令碼之間建立錯綜複雜的依附性。
選項 B:Dataflow
如圖 2 所示,您可以在 Apache Beam 中實作計算成本高昂的前處理運算,並使用 Dataflow 大規模執行這些運算。Dataflow 是適用於批次和串流資料處理的全受管理自動擴充服務。當您使用 Dataflow 時,您也可以使用外部專用程式庫進行資料處理,這與 BigQuery 不同。
Dataflow 可以執行執行個體層級轉換,以及歷史和即時彙總特徵轉換。特別是,如果您的 ML 模型預期輸入特徵 (例如 total_number_of_clicks_last_90sec
),則 Apache Beam 視窗函式 可以根據彙總即時 (串流) 事件資料 (例如,點擊事件) 的時間視窗值來計算這些特徵。在先前關於 轉換精細程度 的討論中,這稱為「訓練期間的歷史彙總,但預測期間的即時彙總」。
下圖 (圖 3) 顯示 Dataflow 在處理串流資料以進行近乎即時預測中的角色。
如圖 3 所示,在處理期間,稱為資料點的事件會擷取到 Pub/Sub 中。Dataflow 會取用這些資料點、根據時間彙總計算特徵,然後呼叫已部署的 ML 模型 API 進行預測。接著,預測會傳送至輸出 Pub/Sub 佇列。預測可以從 Pub/Sub 中由監控或控制等下游系統取用,也可以推送回 (例如,作為通知) 原始請求用戶端。預測也可以儲存在低延遲資料儲存區 (例如 Cloud Bigtable) 中,以進行即時擷取。Cloud Bigtable 也可用於累積和儲存這些即時彙總,以便在需要進行預測時可以查詢。
相同的 Apache Beam 實作可用於批次處理來自離線資料儲存區 (例如 BigQuery) 的訓練資料,以及串流處理即時資料以部署線上預測。
在其他典型的架構 (例如圖 2 所示的架構) 中,用戶端應用程式會直接呼叫已部署的模型 API 進行線上預測。在這種情況下,如果前處理運算是在 Dataflow 中實作以準備訓練資料,則運算不會套用至直接傳送到模型的預測資料。因此,這類轉換應在部署期間整合到模型中,以進行線上預測。
Dataflow 可用於執行全域掃描轉換,方法是以大規模計算所需的統計資料。不過,這些統計資料需要儲存在某處,以便在預測期間用於轉換預測資料點。透過使用 TensorFlow Transform (tf.Transform
) 程式庫,您可以直接將這些統計資料嵌入模型中,而無需將其儲存在其他位置。稍後「tf.Transform 的運作方式」一節會說明此方法。
選項 C:TensorFlow
如圖 2 所示,您可以在 TensorFlow 模型本身中實作資料前處理和轉換運算。如圖所示,您為訓練 TensorFlow 模型實作的前處理會在模型匯出和部署以進行預測時,成為模型的組成部分。TensorFlow 模型中的轉換可以透過下列其中一種方式完成:
- 在
input_fn
函式和serving_fn
函式中實作所有執行個體層級轉換邏輯。input_fn
函式使用tf.data.Dataset
API 準備資料集,以訓練模型。serving_fn
函式接收並準備資料以進行預測。 - 透過使用Keras 預處理層或建立自訂層,將轉換程式碼直接放入您的 TensorFlow 模型中。
在 serving_fn
函式中的轉換邏輯程式碼,定義了您 SavedModel 的服務介面,以進行線上預測。如果您在 serving_fn
函式的轉換邏輯程式碼中,實作了與準備訓練資料時所用的相同轉換,即可確保在提供服務時,將相同的轉換套用至新的預測資料點。
然而,由於 TensorFlow 模型會獨立處理每個資料點或以小批次處理,因此您無法從所有資料點計算彙總。因此,完整傳遞轉換無法在您的 TensorFlow 模型中實作。
預處理挑戰
以下是實作資料預處理的主要挑戰
訓練-服務偏斜。訓練-服務偏斜指的是訓練期間和服務期間的效能(預測效能)差異。這種偏斜可能是因為您在訓練和服務管道中處理資料的方式不一致所導致。例如,如果您的模型是以對數轉換的特徵進行訓練,但在服務期間呈現的是原始特徵,則預測輸出可能不準確。
如果轉換成為模型本身的一部分,則可以簡單地處理執行個體層級的轉換,如先前在選項 C:TensorFlow中所述。在這種情況下,模型服務介面(
serving_fn
函式)預期原始資料,而模型會在內部轉換此資料,然後才計算輸出。這些轉換與套用在原始訓練和預測資料點上的轉換相同。完整傳遞轉換。您無法在 TensorFlow 模型中實作完整傳遞轉換,例如縮放和正規化轉換。在完整傳遞轉換中,必須預先在訓練資料上計算某些統計資料(例如,縮放數值特徵的
max
和min
值),如選項 B:Dataflow中所述。然後必須將這些值儲存在某處,以便在模型服務期間用於預測,以執行個體層級轉換的方式轉換新的原始資料點,從而避免訓練-服務偏斜。您可以使用 TensorFlow Transform (tf.Transform
) 程式庫,將統計資料直接嵌入您的 TensorFlow 模型中。稍後的tf.Transform 的運作方式會說明此方法。預先準備資料以提高訓練效率。將執行個體層級轉換實作為模型的一部分,可能會降低訓練過程的效率。發生這種效能降低的原因是,在每個週期中,相同的轉換會重複套用至相同的訓練資料。假設您有 1,000 個特徵的原始訓練資料,並且您套用混合的執行個體層級轉換來產生 10,000 個特徵。如果您將這些轉換實作為模型的一部分,然後將原始訓練資料饋送至模型,則這些 10,000 個運算會針對每個執行個體執行 N 次,其中 N 是週期數。此外,如果您使用加速器(GPU 或 TPU),則當 CPU 執行這些轉換時,加速器會閒置,這並非有效率地使用您昂貴的加速器。
理想情況下,訓練資料是在訓練之前轉換的,使用 選項 B:Dataflow 下所述的技術,其中 10,000 個轉換運算只針對每個訓練執行個體執行一次。然後將轉換後的訓練資料呈現給模型。不會再套用其他轉換,而且加速器會一直處於忙碌狀態。此外,使用 Dataflow 可協助您使用完全受管理的服務,大規模預處理大量資料。
預先準備訓練資料可以提高訓練效率。然而,在模型外部實作轉換邏輯(選項 A:BigQuery 或 選項 B:Dataflow 中所述的方法)並未解決訓練-服務偏斜的問題。除非您將工程特徵儲存在特徵儲存區中,以供訓練和預測使用,否則轉換邏輯必須實作在某處,以便套用至用於預測的新資料點,因為模型介面預期的是轉換後的資料。TensorFlow Transform (
tf.Transform
) 程式庫可以協助您解決此問題,如下一節所述。
tf.Transform 的運作方式
tf.Transform
程式庫適用於需要完整傳遞的轉換。tf.Transform
程式庫的輸出會匯出為 TensorFlow 圖形,代表執行個體層級的轉換邏輯,以及從完整傳遞轉換計算出的統計資料,以用於訓練和服務。針對訓練和服務使用相同的圖形可以防止偏斜,因為在兩個階段中都會套用相同的轉換。此外,tf.Transform
程式庫可以在 Dataflow 上的批次處理管道中大規模執行,以預先準備訓練資料並提高訓練效率。
下圖 4 顯示 tf.Transform
程式庫如何預處理和轉換資料以進行訓練和預測。以下各節說明此過程。
tf.Transform
預處理和轉換資料的行為。轉換訓練和評估資料
您可以使用在 tf.Transform
Apache Beam API 中實作的轉換來預處理原始訓練資料,並在 Dataflow 上大規模執行。預處理會在以下階段中進行
- 分析階段: 在分析階段期間,會使用完整傳遞運算,在訓練資料上計算有狀態轉換所需的統計資料(例如平均值、變異數和分位數)。此階段會產生一組轉換成品,包括
transform_fn
圖形。transform_fn
圖形是 TensorFlow 圖形,其中包含作為執行個體層級運算的轉換邏輯。它包含在分析階段中計算出的統計資料作為常數。 - 轉換階段: 在轉換階段期間,
transform_fn
圖形會套用至原始訓練資料,其中計算出的統計資料會用於以執行個體層級方式處理資料記錄(例如,縮放數值欄)。
像這樣的兩階段方法解決了執行完整傳遞轉換的預處理挑戰。
當預處理評估資料時,只會套用執行個體層級運算,使用 transform_fn
圖形中的邏輯和從訓練資料的分析階段計算出的統計資料。換句話說,您不會以完整傳遞方式分析評估資料,以計算新的統計資料,例如 μ 和 σ,來正規化評估資料中的數值特徵。相反地,您會使用從訓練資料計算出的統計資料,以執行個體層級方式轉換評估資料。
轉換後的訓練和評估資料會在用於訓練模型之前,使用 Dataflow 大規模準備。這種批次資料準備過程解決了預先準備資料以提高訓練效率的預處理挑戰。如圖 4 所示,模型內部介面預期的是轉換後的特徵。
將轉換附加至匯出的模型
如前所述,由 tf.Transform
管道產生的 transform_fn
圖形會儲存為匯出的 TensorFlow 圖形。匯出的圖形包含作為執行個體層級運算的轉換邏輯,以及在完整傳遞轉換中計算出的所有統計資料作為圖形常數。當匯出訓練後的模型以進行服務時,transform_fn
圖形會附加至 SavedModel,作為其 serving_fn
函式的一部分。
當為預測提供模型服務時,模型服務介面預期的是原始格式的資料點(也就是在任何轉換之前)。但是,模型內部介面預期的是轉換後的格式的資料。
transform_fn
圖形(現在是模型的一部分)會對傳入的資料點套用所有預處理邏輯。它會在預測期間的執行個體層級運算中使用儲存的常數(例如 μ 和 σ 來正規化數值特徵)。因此,transform_fn
圖形會將原始資料點轉換為轉換後的格式。轉換後的格式是模型內部介面預期的格式,以便產生預測,如圖 4 所示。
這種機制解決了訓練-服務偏斜的預處理挑戰,因為用於轉換訓練和評估資料的相同邏輯(實作)也會套用至預測服務期間轉換新的資料點。
預處理選項摘要
下表摘要說明本文討論的資料預處理選項。在表格中,「不適用」表示「不適用」。
資料預處理選項 | 執行個體層級 (無狀態轉換) |
訓練期間完整傳遞,服務期間執行個體層級(有狀態轉換) |
訓練和服務期間的即時(視窗)彙總(串流轉換) |
---|---|---|---|
BigQuery (SQL) |
批次評分:良好—在訓練和批次評分期間,會將相同的轉換實作套用至資料。 線上預測:不建議—您可以處理訓練資料,但會導致訓練-服務偏斜,因為您使用不同的工具處理服務資料。 |
批次評分:不建議. 線上預測:不建議. 雖然您可以使用使用 BigQuery 計算出的統計資料進行執行個體層級批次/線上轉換,但這並不容易,因為您必須維護統計資料儲存區,以便在訓練期間填入並在預測期間使用。 |
批次評分:不適用—這類彙總是根據即時事件計算的。 線上預測:不建議—您可以處理訓練資料,但會導致訓練-服務偏斜,因為您使用不同的工具處理服務資料。 |
Dataflow (Apache Beam) |
批次評分:良好—在訓練和批次評分期間,會將相同的轉換實作套用至資料。 線上預測:良好—如果服務時的資料來自 Pub/Sub 以供 Dataflow 使用。否則,會導致訓練-服務偏斜。 |
批次評分:不建議. 線上預測:不建議. 雖然您可以使用使用 Dataflow 計算出的統計資料進行執行個體層級批次/線上轉換,但這並不容易,因為您必須維護統計資料儲存區,以便在訓練期間填入並在預測期間使用。 |
批次評分:不適用—這類彙總是根據即時事件計算的。 線上預測:良好—在訓練(批次)和服務(串流)期間,會將相同的 Apache Beam 轉換套用至資料。 |
Dataflow (Apache Beam + TFT) |
批次評分:良好—在訓練和批次評分期間,會將相同的轉換實作套用至資料。 線上預測:建議—它可以避免訓練-服務偏斜,並預先準備訓練資料。 |
批次評分:建議. 線上預測:建議. 建議同時使用這兩種方法,因為訓練期間的轉換邏輯和計算出的統計資料會儲存為 TensorFlow 圖形,並附加至匯出的模型以進行服務。 |
批次評分:不適用—這類彙總是根據即時事件計算的。 線上預測:良好—在訓練(批次)和服務(串流)期間,會將相同的 Apache Beam 轉換套用至資料。 |
TensorFlow * |
批次評分:不建議. 線上預測:不建議. 為了在兩種情況下都能提高訓練效率,最好預先準備訓練資料。 |
批次評分:不可能. 線上預測:不可能. |
批次評分:不適用—這類彙總是根據即時事件計算的。 線上預測:不可能. |
* 使用 TensorFlow 時,交叉、嵌入和單熱編碼等轉換應宣告式地執行為 feature_columns
欄。
後續步驟
- 若要實作
tf.Transform
管道並使用 Dataflow 執行,請閱讀本系列的第二部分,使用 TensorFlow Transform 進行 ML 的資料預處理。 - 參加 Coursera 關於在 Google Cloud 上使用 TensorFlow 進行 ML 的專業課程。
- 在ML 規則中瞭解 ML 工程的最佳做法。
- 如需更多參考架構、圖表和最佳做法,請瀏覽 TFX Cloud 解決方案。