設定 AutoML 以訓練自然語言處理模型
適用於:Azure CLI ml 延伸模組 v2 (目前)Python SDK azure-ai-ml v2 (目前)
在本文中,您將了解如何在 Azure Machine Learning 中使用自動化 ML 對自然語言處理 (NLP) 模型進行定型。 您可以透過 Azure Machine Learning Python SDK 第 2 版或 Azure Machine Learning CLI 第 2 版,使用自動化 ML 來建立 NLP 模型。
自動化 ML 支援 NLP,讓 ML 專業人員和資料科學家能夠使用自己的文字資料,並建置用於 NLP 工作的自訂模型。 NLP 工作包括多類別文字分類、多標籤文字分類,以及具名實體辨識 (NER)。
您可以與 Azure Machine Learning 資料標記功能緊密整合,以將文字資料標籤或攜帶現有的標籤資料。 自動化 ML 可供您選擇在多 GPU 計算叢集上使用分散式定型,以加速模型定型。 使用 Azure Machine Learning 的 MLOps 功能,您可以對產生的模型進行大規模運作。
必要條件
Azure 訂閱。 如果您沒有 Azure 訂用帳戶,請立即註冊以試用免費或付費版本的 Azure Machine Learning。
使用 GPU 定型計算的 Azure Machine Learning 工作區。 若要建立工作區,請參閱建立工作區資源。 如需 Azure 所提供 GPU 執行個體的更多詳細資料,請參閱 GPU 最佳化虛擬機器大小。
警告
對於數個 NLP 使用案例,例如非英文資料集和較長範圍文件,需要支援多語系模型以及使用較長最大序列長度的模型。 因此,這些案例可能需要較高的 GPU 記憶體,模型定型才能成功,例如 NC_v3 系列或 ND 系列。
已安裝 Azure Machine Learning CLI 第 2 版。 如需更新及安裝最新版本的指引,請參閱安裝和設定 CLI (第 2 版)。
本文假設您大致上已熟悉如何設定自動化機器學習實驗。 請遵循操作說明,以查看主要的自動化機器學習實驗設計模式。
選取 NLP 工作
判斷您想要完成的 NLP 工作。 目前,自動化 ML 支援下列深度神經網路 NLP 工作。
Task | AutoML 作業語法 | 描述 |
---|---|---|
多類別文字分類 | CLI 第 2 版:text_classification SDK 第 2 版: text_classification() |
有多個可能的類別,而且每個範例都可以分類為完全相同的一個類別。 工作是預測每個樣本的正確類別。 例如,將電影腳本分類為「喜劇」或「浪漫」。 |
多標籤文字分類 | CLI 第 2 版:text_classification_multilabel SDK 第 2 版: text_classification_multilabel() |
有多個可能的類別,而且每個範例都可以指派任何數目的類別。 工作是預測每個範例的所有類別 例如,將電影腳本分類為「喜劇」或「浪漫」,或是「喜劇和浪漫」。 |
具名實體辨識 (NER) | CLI 第 2 版:text_ner SDK 第 2 版: text_ner() |
循序權杖有多個可能的標記。 工作是預測每個序列所有權杖的標記。 例如,從非結構化文字 (例如合約或財務文件) 擷取網域特定實體。 |
閾值
閾值是一種多標籤功能,可讓使用者挑選預測機率會產生正值標籤的閾值。 較低的值允許較多的標籤,當使用者更關心召回率時這是比較好的選擇,但可能會造成較多誤判為真。 較高的值允許較少的標籤,更適合關心精確度的使用者,但此選項可能會導致更多誤否定。
準備資料
針對自動化 ML 中的 NLP 實驗,您可以針對多類別和多標籤分類工作,以 .csv
格式帶入您的資料。 對於 NER 工作,支援兩個資料行的 .txt
檔案,其中使用空格做為分隔符號且遵守 CoNLL 格式。 下列各節提供每個工作所接受資料格式的詳細資料。
多類別
針對多類別分類,資料集可以包含數個文字資料行,而只包含一個標籤資料行。 下列範例只有一個文字資料行。
text,labels
"I love watching Chicago Bulls games.","NBA"
"Tom Brady is a great player.","NFL"
"There is a game between Yankees and Orioles tonight","MLB"
"Stephen Curry made the most number of 3-Pointers","NBA"
多標籤
針對多重標籤分類,資料集資料行會與多類別相同,不過,標籤資料行中的資料有特殊格式需求。 下表提供兩個接受的格式和範例。
標籤資料行格式選項 | 多標籤 | 一個標籤 | 沒有任何標籤 |
---|---|---|---|
純文字 | "label1, label2, label3" |
"label1" |
"" |
使用引號的 Python 清單 | "['label1','label2','label3']" |
"['label1']" |
"[]" |
重要
會使用不同的剖析器來讀取這些格式的標籤。 如果您使用純文字格式,請僅在標籤中使用字母、數字和 '_'
。 所有其他字元都會辨識為標籤的分隔符號。
例如,如果您的標籤是 "cs.AI"
,則會顯示為 "cs"
和 "AI"
。 而使用 Python 清單格式時,標籤會是 "['cs.AI']"
,其會顯示為 "cs.AI"
。
純文字格式的多標籤範例資料。
text,labels
"I love watching Chicago Bulls games.","basketball"
"The four most popular leagues are NFL, MLB, NBA and NHL","football,baseball,basketball,hockey"
"I like drinking beer.",""
使用引號格式 Python 清單中的多標籤資料範例。
text,labels
"I love watching Chicago Bulls games.","['basketball']"
"The four most popular leagues are NFL, MLB, NBA and NHL","['football','baseball','basketball','hockey']"
"I like drinking beer.","[]"
具名實體辨識 (NER)
不同於多類別或多標籤是採用 .csv
格式資料集,具名實體辨識需要使用 CoNLL 格式。 檔案必須只包含兩個資料行,且在每個資料列中,都會以單一空格來分隔標記和標籤。
例如,
Hudson B-loc
Square I-loc
is O
a O
famous O
place O
in O
New B-loc
York I-loc
City I-loc
Stephen B-per
Curry I-per
got O
three O
championship O
rings O
資料驗證
在模型定型之前,自動化 ML 會對輸入資料套用資料驗證檢查,以確保可以正確前置處理資料。 如果上述任何檢查失敗,執行就會失敗,並顯示相關的錯誤訊息。 以下是針對每個工作傳遞資料驗證檢查的需求。
注意
某些資料驗證檢查適用於定型和驗證集,而其他資料驗證則僅適用於定型集。 如果測試資料集無法通過資料驗證,即表示自動化 ML 無法加以擷取,而且可能會發生模型推斷失敗或模型效能下降。
Task | 資料驗證檢查 |
---|---|
所有工作 | 至少需要 50 個定型範例 |
多類別和多標籤 | 定型資料和驗證資料必須具有 - 一組相同的資料行 - 資料行順序從左至右相同 - 相同名稱資料行的資料類型相同 - 至少兩個唯一標籤 - 每個資料集內的唯一資料行名稱 (例如,定型集不能有多個名為 Age 的資料行) |
僅限多類別 | 無 |
僅限多標籤 | - 標籤資料行格式必須採用接受的格式 - 至少一個範例應有 0 或 2 個以上的標籤,否則應該是 multiclass 工作 - 所有標籤都應該採用 str 或 int 格式,且不重疊。 您不應該同時擁有 1 標籤和 '1' 標籤 |
僅限 NER | - 檔案開頭不應該為空行 - 每一行都必須是空行或遵循 {token} {label} 格式,其中權杖與標籤之間只有一個空格,且標籤之後沒有空白字元 - 所有標籤的開頭都必須為 I- 、B- 或僅為 O 。 區分大小寫 - 兩個樣本之間僅一個空行 - 檔案結尾僅一個空行 |
設定實驗
自動化 ML 的 NLP 功能是透過工作特定 automl
類型作業進行觸發,這是提交自動化 ML 實驗以進行分類、迴歸和預測工作的相同工作流程。 您可以如同在這些實驗中的方式來設定參數,例如 experiment_name
和 compute_name
資料輸入。
但是,仍有一些主要差異:
- 您可以忽略
primary_metric
,因為其僅供報告用途。 目前,自動化 ML 針對 NLP 每個執行僅定型一個模型,而且沒有任何模式選擇。 - 只有多類別和多標籤文字分類工作才需要
label_column_name
參數。 - 如果資料集中有 10% 以上的樣本包含超過 128 個語彙基元,則會視為長範圍。
針對 CLI 第 2 版自動化 ML 作業,您可以在 YAML 檔案中設定實驗,如下所示。
語言設定
在 NLP 功能中,自動化 ML 支援 104 種語言,並利用語言特定和多語系預先定型的文字 DNN 模型,例如 BERT 系列模型。 目前,語言選擇預設為英文。
下表摘要說明根據工作類型和語言套用的模型。 請參閱支援的語言及其程式碼的完整清單。
工作類型 | dataset_language 的語法 |
文字模式演算法 |
---|---|---|
多標籤文字分類 | "eng" "deu" "mul" |
英文 BERT 不區分大小寫 德文 BERT 多語系 BERT 針對所有其他語言,自動化 ML 會套用多語系 BERT |
多類別文字分類 | "eng" "deu" "mul" |
英文 BERT 區分大小寫 多語系 BERT 針對所有其他語言,自動化 ML 會套用多語系 BERT |
具名實體辨識 (NER) | "eng" "deu" "mul" |
英文 BERT 區分大小寫 德文 BERT 多語系 BERT 針對所有其他語言,自動化 ML 會套用多語系 BERT |
您可以在設定 YAML 檔案的特徵化區段中指定資料集語言。 自動化 ML 實驗定型的特徵化程序中也會使用 BERT,深入了解自動化 ML (SDK v1) 中的 BERT 整合和特徵化。
featurization:
dataset_language: "eng"
分散式訓練
您也可以在 Azure Machine Learning 計算叢集上使用分散式定型來執行 NLP 實驗。
提交 AutoML 作業
若要提交 AutoML 作業,您可以使用 .yml 檔案的路徑、工作區名稱、資源群組和訂用帳戶識別碼來執行下列 CLI 第 2 版命令。
az ml job create --file ./hello-automl-job-basic.yml --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION]
程式碼範例
請參閱下列每個 NLP 工作的 YAML 檔案範例。
模型掃掠和超參數微調 (預覽)
重要
此功能目前處於公開預覽。 此預覽版本沒有服務等級協定,不建議用於處理生產工作負載。 可能不支援特定功能,或可能已經限制功能。
如需詳細資訊,請參閱 Microsoft Azure 預覽版增補使用條款。
AutoML NLP 可讓您透過設定中的超參數搜尋空間,提供超參數模型和組合的清單。Hyperdrive 會產生數個子執行,每個子執行都是特定 NLP 模型的微調執行,以及根據提供的搜尋空間所選擇和掃掠的一組超參數值。
支援的模型演算法
以下為 AutoML NLP 目前針對微調所提供的所有預先訓練文字 DNN 模型:
- bert-base-cased
- bert-large-uncased
- bert-base-multilingual-cased
- bert-base-german-cased
- bert-large-cased
- distilbert-base-cased
- distilbert-base-uncased
- roberta-base
- roberta-large
- distilroberta-base
- xlm-roberta-base
- xlm-roberta-large
- xlnet-base-cased
- xlnet-large-cased
請注意,大型模型大於對應的基底模型。 它們通常效能更高,但訓練會佔用更多 GPU 記憶體和時間。 因此,其 SKU 需求更嚴格:建議在 ND 系列的 VM 上執行,以獲得最佳結果。
支援的模型演算法:HuggingFace (預覽)
有了在 Azure Machine Learning 管線上執行的新後端,您便可額外使用 HuggingFace Hub 中的任何文字/權杖分類模型,用於文字分類、權杖分類,這是轉換器連結庫的一部分 (例如 microsoft/deberta-large-mnli)。 您也可以在 Azure Machine Learning 模型登錄中找到策劃的模型清單,這些模型已與管線元件進行驗證。
若使用任何 HuggingFace 模型,將會使用管線元件來觸發執行。 如果同時使用舊版和 HuggingFace 模型,所有執行/試用版將會使用元件來觸發。
支援的超參數
下表描述 AutoML NLP 支援的超參數。
參數名稱 | 描述 | 語法 |
---|---|---|
gradient_accumulation_steps | 在呼叫最佳化工具的步階函式將梯度下降一個步階之前,要先加總梯度的逆向作業數目。 這是為了使用有效的批次大小,其大小是 gradient_accumulation_steps 的倍數,比 GPU 大小上限還大。 |
必須是正整數。 |
learning_rate | 初始學習速率。 | 必須是範圍 (0, 1) 內的浮點數。 |
learning_rate_scheduler | 學習率排程器的類型。 | 必須從 linear, cosine, cosine_with_restarts, polynomial, constant, constant_with_warmup 中選擇。 |
model_name | 其中一個受支援模型的名稱。 | 必須從 bert_base_cased, bert_base_uncased, bert_base_multilingual_cased, bert_base_german_cased, bert_large_cased, bert_large_uncased, distilbert_base_cased, distilbert_base_uncased, roberta_base, roberta_large, distilroberta_base, xlm_roberta_base, xlm_roberta_large, xlnet_base_cased, xlnet_large_cased 中選擇。 |
number_of_epochs | 定型 Epoch 的數目。 | 必須是正整數。 |
training_batch_size | 定型批次大小。 | 必須是正整數。 |
validation_batch_size | 驗證批次大小。 | 必須是正整數。 |
warmup_ratio | 用於線性準備的總訓練步階比例為 0 到 learning_rate。 | 必須是範圍 [0, 1] 內的浮點數。 |
weight_decay | 當最佳化工具為 sgd、adam 或 adamw 時的權重衰減值。 | 必須是範圍 [0, 1] 內的浮點數。 |
所有離散超參數都只允許選擇分佈,例如整數類型 training_batch_size
和字串類型 model_name
超參數。 所有連續超參數 (例如 learning_rate
) 都支援所有分佈。
設定掃掠設定
您可以設定所有與掃掠相關的參數。 您可以使用個別模型的超參數條件來建構多個模型子空間,如各個超參數微調範例所示。
這裡支援和一般 HyperDrive 作業可用的相同離散和連續分佈選項。 請參閱超參數微調模型中的所有九個選項
limits:
timeout_minutes: 120
max_trials: 4
max_concurrent_trials: 2
sweep:
sampling_algorithm: grid
early_termination:
type: bandit
evaluation_interval: 10
slack_factor: 0.2
search_space:
- model_name:
type: choice
values: [bert_base_cased, roberta_base]
number_of_epochs:
type: choice
values: [3, 4]
- model_name:
type: choice
values: [distilbert_base_cased]
learning_rate:
type: uniform
min_value: 0.000005
max_value: 0.00005
用於掃掠的取樣方法
在掃掠超參數時,您必須指定取樣方法,以用於掃掠定義的參數空間。 目前,參數支援下列取樣方法搭配 sampling_algorithm
參數:
取樣類型 | AutoML 作業語法 |
---|---|
隨機取樣 | random |
格線取樣 | grid |
貝氏取樣 | bayesian |
實驗預算
您可以在 limits
中使用 timeout_minutes
參數,為 AutoML NLP 訓練作業選擇性地指定實驗逾時預算 - 實驗終止前的分鐘數。 如不指定,則預設的實驗逾時為七天 (最長 60 天)。
AutoML NLP 也支援 trial_timeout_minutes
,個別試用版在終止前可執行的分鐘數上限;以及 max_nodes
,支援計算叢集中可用於作業的節點數上限。 這些參數也屬於 [limits
] 區段。
limits:
timeout_minutes: 60
trial_timeout_minutes: 20
max_nodes: 2
提前終止原則
您可以使用提前終止原則自動結束效果不佳的執行。 提早終止可改善計算效率,節省原本花費在較不具期望設定上的計算資源。 AutoML NLP 支援使用 early_termination
參數的提早終止原則。 如果未指定終止原則,則會執行所有設定,直到完成。
深入了解如何設定超參數掃掠的提早終止原則。
掃掠的資源
您可以指定 max_trials
和 max_concurrent_trials
進行掃掠,來控制超參數掃掠上所花費的資源。
參數 | 詳細資料 |
---|---|
max_trials |
要掃掠的設定數目上限的參數。 必須為介於 1 到 1000 之間的整數。 只探索給定模型演算法的預設超參數時,請將此參數設定為 1。 預設值是 1。 |
max_concurrent_trials |
可同時執行的執行數目上限。 如果已指定,必須是介於 1 到 100 之間的整數。 預設值是 1。 注意: max_concurrent_trials 會限制在 max_trials 。 例如,如果使用者設定 max_concurrent_trials=4 、max_trials=2 ,則值會在內部更新為 max_concurrent_trials=2 、max_trials=2 。 |
您可以如這個範例所示,設定所有掃掠相關參數。
sweep:
limits:
max_trials: 10
max_concurrent_trials: 2
sampling_algorithm: random
early_termination:
type: bandit
evaluation_interval: 2
slack_factor: 0.2
delay_evaluation: 6
已知問題
處理偏低的分數或較高的遺失值:
有些資料集不論 NLP 工作為何,所產生的分數都可能非常低,有時甚至為零。 此分數會伴隨較高的遺失值,表示神經網路無法收歛。 這些分數可能在某些 GPU SKU 上會更頻繁出現。
雖然這類情況不常見,但可能且最好的處理方式是利用超參數微調並提供更廣泛的值,特別是針對學習速率等超參數。 在生產環境中提供超參數微調功能之前,建議遇到這些問題的使用者使用 NC6 或 ND6 計算叢集。 這些叢集通常有相當穩定的定型結果。