AutoML を設定して自然言語処理モデルをトレーニングする
適用対象:Azure CLI ML 拡張機能 v2 (現行)
Python SDK azure-ai-ml v2 (現行)
この記事では、Azure Machine Learning の自動 ML を使用して自然言語処理 (NLP) モデルをトレーニングする方法について学びます。 Azure Machine Learning Python SDK v2 または Azure Machine Learning CLI v2 を使用して、自動 ML で NLP モデルを作成できます。
自動 ML は、ML専門家やデータサイエンティストが独自のテキストデータを持ち込み、多クラステキスト分類、マルチラベルテキスト分類、名前付きエンティティ認識(NER)などのタスクのためのカスタムモデルを構築できるようにするNLPをサポートします。
Azure Machine Learning データラベリング機能とシームレスに統合し、テキストデータにラベルを付けたり、既存のラベル付きデータを持ち込んだりすることが可能です。 自動 ML では、モデルトレーニングの高速化のために、マルチ GPU コンピューティング クラスター上で分散トレーニングを使用するオプションが用意されています。 結果として得られるモデルは、Azure Machine Learning の MLOps 機能を活用することで、大規模に運用することが可能です。
前提条件
適用対象: Azure CLI ML 拡張機能 v2 (現行)
Azure のサブスクリプション。 Azure のサブスクリプションをお持ちでない方は、今すぐ Azure Machine Learningの無料版または有料版にサインアップしてお試しください。
GPU トレーニング コンピューティング搭載の Azure Machine Learning ワークスペース。 ワークスペースを作成するには、「ワークスペース リソースの作成」を参照してください。 Azure が提供する GPU インスタンス の詳細については、GPU最適化仮想マシンサイズをご覧ください。
警告
多言語モデルのサポートや、より長い最大シーケンスを持つモデルの使用は、英語以外のデータセットや長範囲のドキュメントなど、いくつかの自然言語処理のユースケースで必要とされています。 その結果、NC_v3 シリーズや ND シリーズのような,モデルトレーニングを成功させるために GPU メモリをより多く必要とするシナリオが考えられます。
Azure Machine Learning CLI v2 がインストールされていること。 最新バージョンの更新およびインストール方法については、「CLI (v2) のインストールと設定」を参照してください。
この記事では、自動化された機械学習実験の設定にある程度精通していることを前提としています。 方法に従って、自動化された機械学習実験の主要な設計パターンについて確認してください。
NLP タスクを選択します
達成したい NLP のタスクを決定します。 現在、自動 ML では、以下のようなディープニューラルネットワークを用いた NLP タスクがサポートされています。
タスク | AutoML ジョブの構文 | 説明 |
---|---|---|
複数ステキスト分類 | CLI v2: text_classification SDK v2: text_classification() |
複数のクラスが存在し、各サンプルは正確に1つのクラスに分類される可能性があります。 タスクは、各サンプルの正しいクラスを予測します。 たとえば、映画のスクリプトを 「コメディ」または「ロマンチック」として分類します。 |
複数ラベルテキスト分類 | CLI v2: text_classification_multilabel SDK v2: text_classification_multilabel() |
クラスは複数存在し、各サンプルは任意の数のクラスを割り当てることができます。 タスクは、各サンプルのすべてのクラスを予測します たとえば、映画のスクリプトを 「コメディ」、「ロマンチック」または「コメディとロマンチック」として分類します。 |
名前付きエンティティの認識 (NER) | CLI v2:text_ner SDK v2: text_ner() |
シーケンス内のトークンには、複数のタグが考えられます。 タスクは、各シーケンスのすべてのトークンについてタグを予測します。 たとえば、コントラクトや財務ドキュメントなどの非構造化テキストからドメイン固有のエンティティを抽出します。 |
しきい値
しきい値は、予測される確率が正のラベルにつながるしきい値をユーザーが選択できるようにするマルチラベル機能です。 値を小さくするとラベルが増えます。これはユーザーがリコールを重視する場合に適していますが、このオプションを使用すると誤検知が増える可能性があります。 値を大きくするとラベルが減ります。これは精度を重視するユーザーに適していますが、このオプションを選択すると、偽陰性が増える可能性があります。
データの準備
自動 ML における NLP の実験では、マルチクラスおよびマルチラベルの分類タスクのために、.csv
形式のデータを用意できます。 NER タスクでは、区切りにスペースを使用し、CoNLL フォーマットに準拠した2列の.txt
ファイルがサポートされています。 次のセクションでは、各タスクで受け入れられるデータフォーマットの詳細について説明します。
複数クラス
多クラス分類の場合、データセットには複数のテキスト列と 正確に1 つのラベル列を含むことができます。 次の例では、テキスト列が 1 つのみです。
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"
複数ラベル
マルチラベル分類の場合、データセット列はマルチクラスと同じですが、ラベル列のデータには特別なフォーマット要件があります。 2つの受け入れ可能なフォーマットとその例は、以下の表のとおりです。
ラベル列のフォーマットオプション | 複数ラベル | 1 つのラベル | ラベルなし |
---|---|---|---|
プレーンテキスト | "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フォーマットが必要です。 ファイルは正確に2列でなければならず、各行において、トークンとラベルは空白1つで区切られます。
たとえば、次のように入力します。
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 がデータをキャプチャできなかったり、モデル推論の失敗が発生したり、モデルのパフォーマンスが低下したりする可能性があります。
タスク | データ検証チェック |
---|---|
すべてのタスク | 少なくとも 50 個のトレーニング サンプルが必要です |
複数クラスと複数ラべル | トレーニング データと検証データには、以下の条件を満たす必要があります - 同じ列のセット - 左から右へ同じ順番で列が並びます - 同じ名前の列のデータ型が同じであること - 少なくとも 2 つの一意のラベル - 各データセット内の一意の列名 (たとえば、トレーニング セットには Age という名前の複数の列を含めることができません) |
複数クラスのみ | なし |
複数ラベルのみ | -ラベル列のフォーマットは受理されたフォーマットである必要があります 少なくとも 1 つのサンプルは 0 または 2 以上のラベルを持つべきで、そうでなければ multiclass タスクになるはずです-すべてのラベルは str またはint のフォーマットで、重複しないようにしてください。 ラベル 1 とラベル'1' の両方を持つことはできません |
NER のみ | -ファイルの先頭が空の行であってはなりません - 各行は空の行であるか、トークンとラベルの間にちょうど1つのスペースがあり、ラベルの後に空白がない {token} {label} というフォーマットでなければなりません- すべてのラベルは I- 、B- で始まるか、ちょうどO である必要があります。 大文字小文字は区別される-2 つのサンプルの間にちょうど1つの空の行があります -ファイルの末尾にちょうど1つの空の行があります |
実験を構成する
自動 ML の NLP 機能は、タスク固有の automl
タイプのジョブを通じてトリガーされます。これは、分類、回帰、予測タスクのための自動 ML 実験を送信するのと同じワークフローです。 experiment_name
、compute_name
、データ入力などのパラメーターをそれらの実験と同じように設定します。
ただし、主な違いは次のとおりです:
primary_metric
は報告のみを目的としているため、無視して構いません。 現在、自動 ML は、NLP のために1回の実行で1つのモデルを学習するだけで、モデルの選択もありません。label_column_name
パラメーターは、 複数クラスおよび複数ラベルのテキスト分類タスクにのみ必要です。- ご利用のデータセット内のサンプルの 10% を超える部分に 128 を超えるトークンが含まれている場合は、長い範囲と見なされます。
適用対象: Azure CLI ML 拡張機能 v2 (現行)
CLI v2 AutoML ジョブの場合は、次のように YAML ファイルで実験を構成します。
言語の設定
NLP 機能の一部として、自動 ML では、BERT モデルファミリーのような言語固有の多言語事前トレーニング済みテキスト DNN モデルを活用し、104言語をサポートしています。 現在、言語選択のデフォルトは英語です。
次の表は、タスク型および言語に基づいて適用されるモデルをまとめたものです。 サポートされる言語とそのコードの完全なリストを参照してください。
タスクの種類 | dataset_language の構文 |
テキスト モードのアルゴリズム |
---|---|---|
複数ラベルテキスト分類 | "eng" "deu" "mul" |
英語 BERT uncased ドイツ語 BERT 多言語 BERT その他のすべての言語では、自動 ML によって多言語 BERT が適用されます。 |
複数ステキスト分類 | "eng" "deu" "mul" |
英語 BERTcased 多言語 BERT その他のすべての言語では、自動 ML によって多言語 BERT が適用されます。 |
固有表現認識 (NER) | "eng" "deu" "mul" |
英語 BERTcased ドイツ語 BERT 多言語 BERT その他のすべての言語では、自動 ML によって多言語 BERT が適用されます。 |
適用対象: Azure CLI ML 拡張機能 v2 (現行)
データセットの言語は、構成 YAML ファイルの featurization セクションで指定できます。 BERT は、自動 ML 実験トレーニングの特徴付けプロセスでも使用されます。詳しくは、自動 ML における BERT 統合と特徴づけをご覧ください。
featurization:
dataset_language: "eng"
分散トレーニング
Azure Machine Learning コンピューティング クラスターで分散トレーニングを使用して NLP 実験を実行することもできます。
AutoML ジョブを送信する
適用対象: Azure CLI ML 拡張機能 v2 (現行)
AutoML ジョブを送信するために、.yml ファイルへのパス、ワークスペース名、リソース グループ、サブスクリプション ID を指定して、次の CLI v2 コマンドを実行できます。
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]
コード例
適用対象: Azure CLI ML 拡張機能 v2 (現行)
各 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 上で実行することをお勧めします。
サポートされているハイパーパラメーター
次の表は、AutoML NLP でサポートされているハイパーパラメーターについて説明したものです。
パラメーター名 | 説明 | 構文 |
---|---|---|
gradient_accumulation_steps | オプティマイザーのステップ関数を呼び出して勾配降下の 1 ステップを実行する前に、勾配の合計が算出される逆方向操作の数。 これを利用することで、GPU に適合する最大サイズよりも gradient_accumulation_steps 倍大きい有効なバッチ サイズを使用することができます。 |
正の整数にする必要があります。 |
learning_rate | 初期学習率。 | 範囲 (0, 1) の float にする必要があります。 |
learning_rate_scheduler | 学習率スケジューラの種類。 | linear, cosine, cosine_with_restarts, polynomial, constant, constant_with_warmup から選択する必要があります。 |
model_name | サポートされているモデルの 1 つに付けた名前。 | 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 | トレーニング エポックの数。 | 正の整数にする必要があります。 |
training_batch_size | トレーニング バッチ サイズ。 | 正の整数にする必要があります。 |
validation_batch_size | 検証バッチ サイズ。 | 正の整数にする必要があります。 |
warmup_ratio | 0 から learning_rate までの線形ウォームアップに使用されるトレーニング ステップの合計の比率。 | 範囲 [0, 1] の float にする必要があります。 |
weight_decay | オプティマイザーが sgd、adam、または adamw の場合の荷重減衰の値。 | 範囲 [0, 1] の float にする必要があります。 |
すべての個別のハイパーパラメーターでは、整数型の training_batch_size
や文字列型の model_name
ハイパーパラメーターなど、選択肢のディストリビューションのみを許可します。 learning_rate
など、すべての連続ハイパーパラメーターでは、すべてのディストリビューションをサポートしています。
スイープ設定を構成する
スイープ関連のパラメーターはすべて構成できます。 以下の各例に示すように、各モデルに条件付きのハイパーパラメーターを使用して、複数のモデル サブスペースを構築できます。
ここでは、一般的な HyperDrive ジョブで使用できるのと同じ離散型および連続型のディストリビューション オプションがサポートされています。 モデルを調整するハイパーパラメーターに関するページにある 9 つのオプションをすべて確認してください
適用対象: Azure CLI ML 拡張機能 v2 (現行)
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 トレーニング ジョブの実験予算 (実験が終了するまでの分単位での時間) を指定できます。 何も指定しない場合、既定の実験タイムアウトは 7 日 (最大 60 日) です。
また、AutoML NLP では trial_timeout_minutes
(個々のトライアルが終了するまでに実行できる分単位の最大時間) と max_nodes
(ジョブに活用するバッキング コンピューティング クラスターからのノードの最大数) もサポートされています。 これらのパラメーターも limits
セクションに属します。
適用対象: Azure CLI ML 拡張機能 v2 (現行)
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 に更新されます。 |
下の例に示すように、スイープ関連のすべてのパラメーターを構成できます。
適用対象: Azure CLI ML 拡張機能 v2 (現行)
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 コンピューティング クラスターを活用することをお勧めします。