モデルのハイパーパラメーター調整 (v2)

適用対象:Azure CLI ml extension v2 (現行)Python SDK azure-ai-ml v2 (現行)

SweepJob の種類によって、Azure Machine Learning SDK v2 と CLI v2 を使用した効率的なハイパーパラメーター調整を自動化します。

  1. トライアル用のパラメーター検索領域を定義する
  2. スイープ ジョブのサンプリング アルゴリズムを指定する
  3. 最適化する目的を指定する
  4. パフォーマンスの低いジョブ用に早期終了ポリシーを指定する
  5. スイープ ジョブの制限を定義する
  6. 定義済みの構成で実験を開始する
  7. トレーニング ジョブを視覚化する
  8. モデルに最適な構成を選択する

ハイパーパラメーター調整とは

ハイパーパラメーターは、モデルのトレーニング プロセスを制御できるようにする調整可能なパラメーターです。 たとえば、ニューラル ネットワークでは、隠れ層の数と各層内のノードの数を決定します。 モデルのパフォーマンスは、ハイパーパラメーターに大きく依存します。

ハイパーパラメーター調整 (別名、ハイパーパラメーターの最適化) は、最適なパフォーマンスを得られるハイパーパラメーターの構成を見つけるプロセスです。 通常、このプロセスは計算負荷が高く、手動で行われます。

Azure Machine Learning を使用すると、ハイパーパラメーターの調整を自動化し、実験を並行して行ってハイパーパラメーターを効率的に最適化できます。

検索空間を定義する

各ハイパーパラメーターに対して定義された値の範囲を調べることで、ハイパーパラメーターを調整します。

ハイパーパラメーターは、不連続値でも連続値でもよく、パラメーター式で記述された値の分布になります。

不連続ハイパーパラメーター

不連続ハイパーパラメーターは、不連続値の中の Choice として指定します。 Choice には次のものを指定できます。

  • 1 つまたは複数のコンマ区切りの値
  • range オブジェクト
  • 任意の list オブジェクト
from azure.ai.ml.sweep import Choice

command_job_for_sweep = command_job(
    batch_size=Choice(values=[16, 32, 64, 128]),
    number_of_hidden_layers=Choice(values=range(1,5)),
)

この場合、batch_size は値 [16, 32, 64, 128] のいずれかになり、number_of_hidden_layers は値 [1, 2, 3, 4] のいずれかになります。

次の高度な不連続ハイパーパラメーターは、分布を使用して指定することもできます。

  • QUniform(min_value, max_value, q) - round(Uniform(min_value, max_value) / q) * q などの値を返します
  • QLogUniform(min_value, max_value, q) - round(exp(Uniform(min_value, max_value)) / q) * q などの値を返します
  • QNormal(mu, sigma, q) - round(Normal(mu, sigma) / q) * q などの値を返します
  • QLogNormal(mu, sigma, q) - round(exp(Normal(mu, sigma)) / q) * q などの値を返します

連続ハイパーパラメーター

連続ハイパーパラメーターは、連続した範囲の値にわたる分布として指定します。

  • Uniform(min_value, max_value) - min_value と max_value の間で均等に分布した値を返します
  • LogUniform(min_value, max_value) - 戻り値の対数が均等に分布するように、exp(Uniform(min_value, max_value)) に従って得られた値を返します
  • Normal(mu, sigma): 平均ミューと標準偏差シグマを使用して正規分布された実際の値を返します
  • LogNormal(mu, sigma) - 戻り値の対数が正規分布されるように、exp(Normal(mu, sigma)) に従って得られた値を返します

パラメーター空間定義の例を次に示します。

from azure.ai.ml.sweep import Normal, Uniform

command_job_for_sweep = command_job(   
    learning_rate=Normal(mu=10, sigma=3),
    keep_probability=Uniform(min_value=0.05, max_value=0.1),
)

このコードでは、2 つのパラメーター learning_ratekeep_probability で検索空間を定義します。 learning_rate は、平均値 10 と標準偏差 3 の正規分布になります。 keep_probability は、最小値 0.05 と最大値 0.1 の一様分布になります。

CLI では、スイープ ジョブの YAML スキーマを使用して、YAML 内の検索領域を定義できます。

    search_space:
        conv_size:
            type: choice
            values: [2, 5, 7]
        dropout_rate:
            type: uniform
            min_value: 0.1
            max_value: 0.2

ハイパーパラメーター空間のサンプリング

ハイパーパラメーター空間に対して使用するパラメーター サンプリング方法を指定します。 Azure Machine Learning では次の方法がサポートされます。

  • ランダム サンプリング
  • グリッド サンプリング
  • ベイジアン サンプリング

ランダム サンプリング

ランダム サンプリングでは、不連続および連続のハイパーパラメーターがサポートされます。 これは、パフォーマンスの低いジョブの早期終了をサポートしています。 一部のユーザーは、ランダム サンプリングを使用して最初の検索を行った後、検索空間を絞り込んで、結果を改善します。

ランダム サンプリングでは、定義済みの探索空間からハイパーパラメーター値がランダムに選択されます。 コマンド ジョブを作成した後、スイープ パラメーターを使用してサンプリング アルゴリズムを定義できます。

from azure.ai.ml.sweep import Normal, Uniform, RandomParameterSampling

command_job_for_sweep = command_job(   
    learning_rate=Normal(mu=10, sigma=3),
    keep_probability=Uniform(min_value=0.05, max_value=0.1),
    batch_size=Choice(values=[16, 32, 64, 128]),
)

sweep_job = command_job_for_sweep.sweep(
    compute="cpu-cluster",
    sampling_algorithm = "random",
    ...
)

sobol

sobol は、スイープ ジョブの種類でサポートされるランダム サンプリングの種類です。 sobol を使用すると、シードを使用して結果を再現し、検索領域の分布をより均等に対象にすることができます。

sobol を使用するには、RandomParameterSampling クラスを使用して、以下の例に示すようにシードとルールを追加します。

from azure.ai.ml.sweep import RandomParameterSampling

sweep_job = command_job_for_sweep.sweep(
    compute="cpu-cluster",
    sampling_algorithm = RandomParameterSampling(seed=123, rule="sobol"),
    ...
)

グリッド サンプリング

グリッド サンプリングでは、不連続ハイパーパラメーターがサポートされます。 検索空間を徹底的に検索する予算を確保できる場合は、グリッド サンプリングを使用します。 パフォーマンスの低いジョブの早期終了がサポートされています。

グリッド サンプリングでは、考えられるすべての値に対して単純なグリッド検索を実行します。 グリッド サンプリングは choice ハイパーパラメーターでのみ使用できます。 たとえば、次の空間には 6 個のサンプルがあります。

from azure.ai.ml.sweep import Choice

command_job_for_sweep = command_job(
    batch_size=Choice(values=[16, 32]),
    number_of_hidden_layers=Choice(values=[1,2,3]),
)

sweep_job = command_job_for_sweep.sweep(
    compute="cpu-cluster",
    sampling_algorithm = "grid",
    ...
)

ベイジアン サンプリング

ベイジアン サンプリングは、ベイジアン最適化アルゴリズムに基づいています。 新しいサンプルによって主要メトリックが改善されるように、前のサンプルの実行結果に基づいてサンプルを選択します。

ベイジアン サンプリングは、ハイパーパラメーター空間を探索するための十分な予算がある場合に推奨されます。 最適な結果を得るために、ジョブの最大数は、調整するハイパーパラメーターの数の 20 倍以上にすることをお勧めします。

同時実行ジョブ数は調整プロセスの有効性に影響を与えます。 同時実行ジョブ数が少ないほど、サンプリングの収束が向上する可能性があります。これは、並列処理の次数が小さいほど、以前に完了したジョブの恩恵を受けるジョブの数が増えるためです。

ベイジアン サンプリングでは、検索空間に対して choiceuniformquniform 分布のみがサポートされています。

from azure.ai.ml.sweep import Uniform, Choice

command_job_for_sweep = command_job(   
    learning_rate=Uniform(min_value=0.05, max_value=0.1),
    batch_size=Choice(values=[16, 32, 64, 128]),
)

sweep_job = command_job_for_sweep.sweep(
    compute="cpu-cluster",
    sampling_algorithm = "bayesian",
    ...
)

スイープの目的を指定する

ハイパーパラメーター調整で最適化する主要メトリックと目標を指定して、スイープ ジョブの目的を定義します。 各トレーニング ジョブは、この主要メトリックに対して評価されます。 早期終了ポリシーでは、主要メトリックを使用してパフォーマンスの低いジョブを特定します。

  • primary_metric:主要メトリックの名前は、トレーニング スクリプトによってログされているメトリック名と完全に一致する必要があります。
  • goal: Maximize または Minimize のいずれかを指定できます。ジョブを評価する際に主要メトリックを最大化するか最小化するかを決定します。
from azure.ai.ml.sweep import Uniform, Choice

command_job_for_sweep = command_job(   
    learning_rate=Uniform(min_value=0.05, max_value=0.1),
    batch_size=Choice(values=[16, 32, 64, 128]),
)

sweep_job = command_job_for_sweep.sweep(
    compute="cpu-cluster",
    sampling_algorithm = "bayesian",
    primary_metric="accuracy",
    goal="Maximize",
)

このサンプルでは "accuracy" を最大化します。

ハイパーパラメーターの調整のためのログ メトリック

モデルのトレーニング スクリプトで主要メトリックを、同じ対応するメトリック名を使用したモデルのトレーニング中にログして、ハイパーパラメーターの調整のために SweepJob からアクセスできるようにする必要があります

次のサンプル スニペットで、トレーニング スクリプトの主要メトリックをログします。

import mlflow
mlflow.log_metric("accuracy", float(val_accuracy))

トレーニング スクリプトでは val_accuracy が計算され、主要メトリック "accuracy" としてログされます。 メトリックがログされるたびに、これをハイパーパラメーター調整サービスが受信します。 レポートの頻度は、ご自身で決定してください。

トレーニング ジョブの値のログに関する詳細については、Azure Machine Learning トレーニング ジョブでのログの有効化に関する記事を参照してください。

早期終了ポリシーを指定する

早期終了ポリシーによって、パフォーマンスの低いジョブは自動的に終了されます。 早期終了によって、計算効率が向上します。

次のパラメーターを構成して、ポリシーを適用するタイミングを制御できます。

  • evaluation_interval: ポリシーを適用する頻度。 トレーニング スクリプトによってログに記録されるたびに、主要メトリックは 1 間隔としてカウントされます。 evaluation_interval に 1 を指定すると、トレーニング スクリプトが主要メトリックを報告するたびにポリシーが適用されます。 evaluation_interval に 2 を指定すると、ポリシーは 1 回おきに適用されます。 指定しないと、evaluation_interval は既定で 0 に設定されます。
  • delay_evaluation: 指定した間隔数の期間、最初のポリシー評価を遅延させます。 これは省略可能なパラメーターです。すべての構成を最小数の間隔で実行できるようにして、トレーニング ジョブの早期終了を回避します。 指定すると、このポリシーは delay_evaluation 以上の evaluation_interval の倍数ごとに適用されます。 指定しないと、delay_evaluation は既定で 0 に設定されます。

Azure Machine Learning では、以下の早期終了ポリシーがサポートされています。

バンディット ポリシー

バンディット ポリシーは、Slack 要素/Slack 量と評価間隔に基づきます。 最も成功したジョブの指定 Slack 要素/Slack 量の範囲内に主要メトリックがないとき、バンディット ポリシーによりジョブが終了します。

次の構成パラメーターを指定します。

  • slack_factor または slack_amount: パフォーマンスが最善のトレーニング ジョブに関して許可される Slack。 slack_factor は、許可される Slack を比率として指定します。 slack_amount は、許可される Slack を比率ではなく絶対量として指定します。

    たとえば、間隔 10 で適用されるバンディット ポリシーについて考えてみます。 主要メトリックを最大化するという目標があり、間隔 10 で最善のパフォーマンスになるジョブで主要メトリックが 0.8 であると報告されたとします。 ポリシーで 0.2 の slack_factor が指定された場合、間隔 10 で最適なメトリックになるトレーニング ジョブのうち、0.66 (0.8/(1+slack_factor)) 未満のものが終了されます。

  • evaluation_interval: (省略可能) ポリシーを適用する頻度

  • delay_evaluation: (省略可能) 指定した間隔数の期間、最初のポリシー評価を遅延します

from azure.ai.ml.sweep import BanditPolicy
sweep_job.early_termination = BanditPolicy(slack_factor = 0.1, delay_evaluation = 5, evaluation_interval = 1)

この例では、評価間隔 5 から始めて、メトリックが報告される間隔ごとに早期終了ポリシーが適用されます。 最適なメトリックが (1/(1 + 0.1) 未満、または最善のパフォーマンスのジョブのうち 91% 未満のジョブはすべて終了されます。

中央値の停止ポリシー

中央値の停止は、ジョブによって報告された主要メトリックの移動平均に基づく早期終了ポリシーです。 このポリシーは、すべてのトレーニング ジョブを対象に移動平均を計算し、主要メトリック値が平均の中央値よりも低いジョブを終了します。

このポリシーでは、次の構成パラメーターを指定できます。

  • evaluation_interval: ポリシーを適用する頻度 (省略可能なパラメーター)。
  • delay_evaluation: 指定した間隔数の期間、最初のポリシー評価を遅延させます (省略可能なパラメーター)。
from azure.ai.ml.sweep import MedianStoppingPolicy
sweep_job.early_termination = MedianStoppingPolicy(delay_evaluation = 5, evaluation_interval = 1)

この例では、評価間隔 5 から始めて、間隔ごとに早期終了ポリシーが適用されます。 すべてのトレーニング ジョブで、最適な主要メトリックが間隔 1:5 に対して移動平均の中央値未満の場合、ジョブは間隔 5 で停止されます。

切り捨て選択ポリシー

切り捨て選択を使用すると、各評価間隔で、パフォーマンスが最も低いジョブのうち、ある割合が取り消されます。 ジョブは、主要メトリックを使用して比較されます。

このポリシーでは、次の構成パラメーターを指定できます。

  • truncation_percentage: 各評価間隔で終了するパフォーマンスが最も低いジョブの割合。 1 ~ 99 の整数値。
  • evaluation_interval: (省略可能) ポリシーを適用する頻度
  • delay_evaluation: (省略可能) 指定した間隔数の期間、最初のポリシー評価を遅延します
  • exclude_finished_jobs: ポリシーを適用するときに、完了したジョブを除外するかどうかを指定します
from azure.ai.ml.sweep import TruncationSelectionPolicy
sweep_job.early_termination = TruncationSelectionPolicy(evaluation_interval=1, truncation_percentage=20, delay_evaluation=5, exclude_finished_jobs=true)

この例では、評価間隔 5 から始めて、間隔ごとに早期終了ポリシーが適用されます。 ジョブは、間隔 5 でのそのパフォーマンスが間隔 5 のすべてのジョブのパフォーマンスの下位 20% に含まれる場合、間隔 5 で終了します。ポリシーを適用したときに完了済みのジョブは除外されます。

終了なしポリシー (既定)

ポリシーを指定しないと、ハイパーパラメーター調整サービスでは、すべてのトレーニング ジョブが完了まで実行されます。

sweep_job.early_termination = None

早期終了ポリシーを選択する

  • 先のジョブまで終了せずに節約する保守的なポリシーでは、evaluation_interval 1 および delay_evaluation 5 で中央値の停止ポリシーを検討します。 これらは保守的な設定であり、(評価データに基づいて) 主要メトリックに関する損失なしで約 25% から 35% の節約を実現できます。
  • より積極的な節約では、バンディット ポリシーをより小さい許容される Slack で使用するか、切り捨て選択ポリシーをより大きな切り捨て率で使用します。

スイープ ジョブの制限を設定する

スイープ ジョブの制限を設定して、リソースの予算を制御します。

  • max_total_trials: トライアル ジョブの最大数。 1 ~ 1000 の整数にする必要があります。
  • max_concurrent_trials: (省略可能) 同時に実行できるトライアル ジョブの最大数。 指定しない場合、max_total_trials 数のジョブが並列で起動されます。 指定する場合は、1 から 1000 の整数にする必要があります。
  • timeout: スイープ ジョブ全体を実行できる最大時間 (秒単位)。 この制限に達すると、システムにより、すべてのトライアルを含めてスイープ ジョブがキャンセルされます。
  • trial_timeout: 各トライアル ジョブを実行できる最大時間 (秒単位)。 この制限に達すると、システムによってトライアルがキャンセルされます。

注意

max_total_trials と timeout の両方を指定した場合、これら 2 つのしきい値のうちの最初のものに達すると、ハイパーパラメーター調整実験は終了します。

注意

同時実行トライアル ジョブの数は、指定したコンピューティング先で使用可能なリソースによって制御されます。 目的の同時実行可能性のために、使用可能なリソースをコンピューティング先に確保する必要があります。

sweep_job.set_limits(max_total_trials=20, max_concurrent_trials=4, timeout=1200)

このコードにより、ハイパーパラメーター調整実験が、スイープ ジョブ全体のタイムアウトが 1200 秒で、一度に 4 つのトライアル ジョブを実行して合計で最大 20 個のトライアル ジョブを使用するように構成されます。

ハイパーパラメーター調整実験を構成する

ハイパーパラメーター調整実験を構成するには、以下を指定します。

  • 定義済みのハイパーパラメーター検索空間
  • サンプリング アルゴリズム
  • 早期終了ポリシー
  • 目的
  • リソース制限
  • CommandJob または CommandComponent
  • SweepJob

SweepJob は、コマンドまたはコマンド コンポーネントでハイパーパラメーター スイープを実行できます。

Note

sweep_job で使用するコンピューティング先には、同時実行レベルを満たすのに十分なリソースが必要です。 コンピューティング先の詳細については、「コンピューティング ターゲット」を参照してください。

ハイパーパラメーター調整実験を構成します。

from azure.ai.ml import MLClient
from azure.ai.ml import command, Input
from azure.ai.ml.sweep import Choice, Uniform, MedianStoppingPolicy
from azure.identity import DefaultAzureCredential

# Create your base command job
command_job = command(
    code="./src",
    command="python main.py --iris-csv ${{inputs.iris_csv}} --learning-rate ${{inputs.learning_rate}} --boosting ${{inputs.boosting}}",
    environment="AzureML-lightgbm-3.2-ubuntu18.04-py37-cpu@latest",
    inputs={
        "iris_csv": Input(
            type="uri_file",
            path="https://azuremlexamples.blob.core.windows.net/datasets/iris.csv",
        ),
        "learning_rate": 0.9,
        "boosting": "gbdt",
    },
    compute="cpu-cluster",
)

# Override your inputs with parameter expressions
command_job_for_sweep = command_job(
    learning_rate=Uniform(min_value=0.01, max_value=0.9),
    boosting=Choice(values=["gbdt", "dart"]),
)

# Call sweep() on your command job to sweep over your parameter expressions
sweep_job = command_job_for_sweep.sweep(
    compute="cpu-cluster",
    sampling_algorithm="random",
    primary_metric="test-multi_logloss",
    goal="Minimize",
)

# Specify your experiment details
sweep_job.display_name = "lightgbm-iris-sweep-example"
sweep_job.experiment_name = "lightgbm-iris-sweep-example"
sweep_job.description = "Run a hyperparameter sweep job for LightGBM on Iris dataset."

# Define the limits for this sweep
sweep_job.set_limits(max_total_trials=20, max_concurrent_trials=10, timeout=7200)

# Set early stopping on this one
sweep_job.early_termination = MedianStoppingPolicy(
    delay_evaluation=5, evaluation_interval=2
)

command_job は関数として呼び出されるため、スイープ入力にパラメーター式を適用できます。 その後、sweep 関数は、trialsampling-algorithmobjectivelimits、および compute を使用して構成されます。 上記のコード スニペットは、サンプル ノートブック「Command または CommandComponent でハイパーパラメーター スイープを実行する」から抜粋したものです。 このサンプルでは、learning_rate パラメーターと boosting パラメーターが調整されます。 ジョブの早期停止は MedianStoppingPolicy によって決定されます。これは、すべてのトレーニング ジョブの平均の中央値よりも主要メトリック値が低いジョブを停止します (MedianStoppingPolicy クラスのリファレンスを参照してください)。

パラメーター値を受け取り、解析し、調整されるトレーニング スクリプトに渡す方法を確認するには、このコード サンプルを参照してください

重要

ハイパーパラメーターのスイープ ジョブはすべて、モデルと "すべてのデータ ローダー" の再構築を含め、トレーニングをゼロから再開します。 このコストを最小限に抑えるには、Azure Machine Learning パイプラインまたは手動プロセスを使用して、トレーニング ジョブの前に可能な限り多くのデータを準備します。

ハイパーパラメーター調整実験を送信する

ハイパーパラメーター調整構成を定義したら、ジョブを送信します

# submit the sweep
returned_sweep_job = ml_client.create_or_update(sweep_job)
# get a URL for the status of the job
returned_sweep_job.services["Studio"].endpoint

ハイパーパラメーター調整のジョブを視覚化する

Azure Machine Learning スタジオで、すべてのハイパーパラメーター調整ジョブを視覚化できます。 ポータルで実験を表示する方法の詳細については、スタジオでのジョブ レコードの表示に関する記事を参照してください。

  • メトリック グラフ: この視覚化では、ハイパーパラメーター調整の期間にわたってハイパードライブの子ジョブごとにログされたメトリックが追跡されます。 各線は 1 つの子実行を表し、各ポイントはランタイムのその反復での主要メトリックの値を測定します。

    ハイパーパラメーター調整のメトリック グラフ

  • 並列座標グラフ:この視覚化を使用すると、主要メトリックのパフォーマンスと個々のハイパーパラメーター値の相関関係が示されます。 グラフは、軸を移動する (軸ラベルをクリックしてドラッグする)、および 1 つの軸全体の値を強調表示する (1 つの軸をクリックし、軸に沿って垂直方向にドラッグして、目的の値の範囲を強調表示する) ことで、インタラクティブになります。 並列座標グラフには、グラフの一番右の部分に軸が含まれ、そのジョブ インスタンスに設定されているハイパーパラメーターに対応する最適なメトリック値がプロットされます。 この軸は、グラフのグラデーションの凡例を、より読みやすい形式でデータに射影するために用意されています。

    ハイパーパラメーター調整の並行座標グラフ

  • 2 次元散布図:この視覚化を使用すると、2 つの個別のハイパーパラメーターの間の相関関係が、関連付けられている主要メトリック値と共に表示されます。

    ハイパーパラメーター調整の 2 次元散布図

  • 3 次元散布図:この視覚化は 2D と同じですが、主要メトリック値と相関関係にある 3 つのハイパーパラメーター ディメンションを使用できます。 グラフをクリックしてドラッグし、グラフの方向を変更し、3D 空間内のさまざまな相関関係を表示することもできます。

    ハイパーパラメーター調整の 3 次元散布図

最良のトライアル ジョブを見つける

すべてのハイパーパラメーター調整ジョブが完了したら、最良のトライアルの出力を取得します。

# Download best trial model output
ml_client.jobs.download(returned_sweep_job.name, output_name="model")

CLI を使用して、最良のトライアル ジョブに関するすべての既定および名前付き出力と、スイープ ジョブのログをダウンロードできます。

az ml job download --name <sweep-job> --all

必要に応じて、最良のトライアルの出力のみをダウンロードします

az ml job download --name <sweep-job> --output-name model

リファレンス

次のステップ