これは、このセクションの複数ページの印刷可能なビューです。 印刷するには、ここをクリックしてください.

このページの通常のビューに戻る.

sweep configuration を定義する

スイープの設定ファイルを作成する方法を学びましょう。

A W&B Sweep は、ハイパーパラメータの値を探索するための戦略と、それを評価するコードを組み合わせたものです。この戦略はすべてのオプションを試すというシンプルなものから、ベイズ最適化やハイパーバンド(BOHB)のように複雑なものまであります。

Sweep configuration を Python 辞書 または YAML ファイルで定義します。Sweep configuration をどのように定義するかは、あなたが sweep をどのように管理したいかによって異なります。

以下のガイドでは、sweep configuration のフォーマット方法について説明します。Sweep configuration options で、トップレベルの sweep configuration キーの包括的なリストをご覧ください。

基本構造

両方のスイープ設定フォーマットオプション (YAML および Python 辞書) は、キーと値のペアおよびネストされた構造を利用します。

スイープ設定内でトップレベルキーを使用して、sweep 検索の特性を定義します。たとえば、スイープの名前(name キー)、検索するパラメータ(parameters キー)、パラメータ空間を検索する方法(method キー)、その他があります。

例えば、以下のコードスニペットは、YAML ファイルと Python 辞書の両方で定義された同じスイープ設定を示しています。スイープ設定内には、programnamemethodmetric、および parameters という5つのトップレベルキーが指定されています。

スイープをコマンドライン (CLI) からインタラクティブに管理したい場合、YAML ファイルでスイープ設定を定義します。

program: train.py
name: sweepdemo
method: bayes
metric:
  goal: minimize
  name: validation_loss
parameters:
  learning_rate:
    min: 0.0001
    max: 0.1
  batch_size:
    values: [16, 32, 64]
  epochs:
    values: [5, 10, 15]
  optimizer:
    values: ["adam", "sgd"]

Python スクリプトまたは Jupyter ノートブックでトレーニングアルゴリズムを定義する場合は、Python 辞書データ構造でスイープを定義します。

以下のコードスニペットは、sweep_configuration という変数名でスイープ設定を格納します:

sweep_configuration = {
    "name": "sweepdemo",
    "method": "bayes",
    "metric": {"goal": "minimize", "name": "validation_loss"},
    "parameters": {
        "learning_rate": {"min": 0.0001, "max": 0.1},
        "batch_size": {"values": [16, 32, 64]},
        "epochs": {"values": [5, 10, 15]},
        "optimizer": {"values": ["adam", "sgd"]},
    },
}

トップレベルの parameters キーの中に、以下のキーがネストされています:learning_ratebatch_sizeepoch、および optimizer。指定したネストされたキーごとに、1つ以上の値、分布、確率などを提供できます。詳細については、Sweep configuration optionsparameters セクションを参照してください。

二重ネストパラメータ

Sweep configurations はネストされたパラメータをサポートします。ネストされたパラメータを区切るには、トップレベルのパラメータ名の下に追加の parameters キーを使用します。スイープ設定は多層ネストをサポートします。

ベイズまたはランダムなハイパーパラメータ検索を使用する場合、確率分布を指定します。各ハイパーパラメータについて:

  1. スイープ設定でトップレベル parameters キーを作成します。
  2. parameters キーの中に次のものをネストします:
    1. 最適化したいハイパーパラメータの名前を指定します。
    2. distribution キーのために使用したい分布を指定します。ハイパーパラメータ名の下に distribution キーと値のペアをネストします。
    3. 探索する1つ以上の値を指定します。その値(または値のリスト)は分布キーと整合している必要があります。
      1. (オプション) トップレベルのパラメータ名の下に追加のパラメータキーを使用して、ネストされたパラメータを区切ります。

Sweep configuration テンプレート

次のテンプレートには、パラメータを構成し、検索制約を指定する方法を示しています。hyperparameter_name をあなたのハイパーパラメータの名前と、<> 内の任意の値で置き換えます。

program: <insert>
method: <insert>
parameter:
  hyperparameter_name0:
    value: 0  
  hyperparameter_name1: 
    values: [0, 0, 0]
  hyperparameter_name: 
    distribution: <insert>
    value: <insert>
  hyperparameter_name2:  
    distribution: <insert>
    min: <insert>
    max: <insert>
    q: <insert>
  hyperparameter_name3: 
    distribution: <insert>
    values:
      - <list_of_values>
      - <list_of_values>
      - <list_of_values>
early_terminate:
  type: hyperband
  s: 0
  eta: 0
  max_iter: 0
command:
- ${Command macro}
- ${Command macro}
- ${Command macro}
- ${Command macro}      

Sweep configuration の例

program: train.py
method: random
metric:
  goal: minimize
  name: loss
parameters:
  batch_size:
    distribution: q_log_uniform_values
    max: 256 
    min: 32
    q: 8
  dropout: 
    values: [0.3, 0.4, 0.5]
  epochs:
    value: 1
  fc_layer_size: 
    values: [128, 256, 512]
  learning_rate:
    distribution: uniform
    max: 0.1
    min: 0
  optimizer:
    values: ["adam", "sgd"]
sweep_config = {
    "method": "random",
    "metric": {"goal": "minimize", "name": "loss"},
    "parameters": {
        "batch_size": {
            "distribution": "q_log_uniform_values",
            "max": 256,
            "min": 32,
            "q": 8,
        },
        "dropout": {"values": [0.3, 0.4, 0.5]},
        "epochs": {"value": 1},
        "fc_layer_size": {"values": [128, 256, 512]},
        "learning_rate": {"distribution": "uniform", "max": 0.1, "min": 0},
        "optimizer": {"values": ["adam", "sgd"]},
    },
}

ベイズハイパーバンドの例

program: train.py
method: bayes
metric:
  goal: minimize
  name: val_loss
parameters:
  dropout:
    values: [0.15, 0.2, 0.25, 0.3, 0.4]
  hidden_layer_size:
    values: [96, 128, 148]
  layer_1_size:
    values: [10, 12, 14, 16, 18, 20]
  layer_2_size:
    values: [24, 28, 32, 36, 40, 44]
  learn_rate:
    values: [0.001, 0.01, 0.003]
  decay:
    values: [1e-5, 1e-6, 1e-7]
  momentum:
    values: [0.8, 0.9, 0.95]
  epochs:
    value: 27
early_terminate:
  type: hyperband
  s: 2
  eta: 3
  max_iter: 27

以下のタブで early_terminate の最小または最大のイテレーション回数を指定する方法を示します:

この例のブラケットは [3, 3*eta, 3*eta*eta, 3*eta*eta*eta] で、結果として [3, 9, 27, 81] になります。

early_terminate:
  type: hyperband
  min_iter: 3

この例のブラケットは [27/eta, 27/eta/eta] で、[9, 3] になります。

early_terminate:
  type: hyperband
  max_iter: 27
  s: 2

コマンドの例

program: main.py
metric:
  name: val_loss
  goal: minimize

method: bayes
parameters:
  optimizer.config.learning_rate:
    min: !!float 1e-5
    max: 0.1
  experiment:
    values: [expt001, expt002]
  optimizer:
    values: [sgd, adagrad, adam]

command:
- ${env}
- ${interpreter}
- ${program}
- ${args_no_hyphens}
/usr/bin/env python train.py --param1=value1 --param2=value2
python train.py --param1=value1 --param2=value2

以下のタブで一般的なコマンドマクロを指定する方法を示します:

{$interpreter} マクロを削除し、値を明示的に提供して Python インタプリタをハードコードします。例えば、以下のコードスニペットはその方法を示しています:

command:
  - ${env}
  - python3
  - ${program}
  - ${args}

次の例では、sweep configuration のパラメータで指定されていないコマンドライン引数を追加する方法を示します:

command:
  - ${env}
  - ${interpreter}
  - ${program}
  - "--config"
  - "your-training-config.json"
  - ${args}

あなたのプログラムが引数パースを使用しない場合、すべての引数を渡すのを避け、wandb.init がスイープパラメータを自動的に wandb.config に取り込むことを利用できます:

command:
  - ${env}
  - ${interpreter}
  - ${program}

ツールのように引数を渡すコマンドを変更できます Hydra が期待する方法です。詳細については、Hydra with W&B を参照してください。

command:
  - ${env}
  - ${interpreter}
  - ${program}
  - ${args_no_hyphens}

1 - Sweep configuration オプション

スイープ設定は、ネストされたキーと値のペアで構成されます。スイープ設定内のトップレベルのキーを使用して、スイープ検索の特性を定義します。例えば、検索するパラメータ(parameter キー)、パラメータ空間を検索するための方法論(method キー)などがあります。

以下のテーブルはトップレベルのスイープ設定キーとその簡単な説明を示しています。各キーについての詳細情報は、該当するセクションを参照してください。

トップレベルキー 説明
program (必須)実行するトレーニングスクリプト
entity このスイープのエンティティ
project このスイープのプロジェクト
description スイープのテキスト説明
name W&B UIに表示されるスイープの名前。
method (必須)検索戦略
metric 最適化するメトリック(特定の検索戦略と停止基準でのみ使用)
parameters (必須)検索するパラメータの範囲
early_terminate 任意の早期停止基準
command トレーニングスクリプトに引数を渡して呼び出すためのコマンド構造
run_cap このスイープの最大 run 数

スイープ設定の構造については、スイープ設定の構造を参照してください。

metric

metric トップレベルスイープ設定キーを使用して、最適化するメトリックの名前、目標、そして対象のメトリックを指定します。

キー 説明
name 最適化するメトリックの名前。
goal minimize または maximize のいずれか(デフォルトは minimize)。
target 最適化するメトリックの目標値。このスイープは、指定した目標値に run が到達した場合や到達する場合、新しい run を作成しません。アクティブなエージェントが run を実行中の場合(runがターゲットに到達した場合)、エージェントが新しい run を作成するのを停止する前に、run が完了するのを待ちます。

parameters

YAML ファイルまたは Python スクリプト内で、parameters をトップレベルキーとして指定します。parameters キーの中に、最適化したいハイパーパラメータの名前を提供します。一般的なハイパーパラメーターには、学習率、バッチサイズ、エポック数、オプティマイザーなどがあります。あなたのスイープ設定で定義された各ハイパーパラメータに対して、1つ以上の検索制約を指定します。

以下のテーブルは、サポートされているハイパーパラメータ検索制約を示しています。ハイパーパラメータとユースケースに基づいて、以下のサーチ制約のいずれかを使用して、スイープエージェントに検索する場所(分布の場合)または何を(valuevaluesなど)検索または使用するかを指示します。

検索制約 説明
values このハイパーパラメータのすべての有効な値を指定します。gridと互換性があります。
value このハイパーパラメータの単一の有効な値を指定します。gridと互換性があります。
distribution 確率 分布 を指定します。この表の後の注記ではデフォルト値に関する情報について説明しています。
probabilities randomを使用する際に、valuesのそれぞれの要素を選択する確率を指定します。
min, max intまたはfloat)最大値と最小値。intの場合、int_uniform で分布されたハイパーパラメータ用。floatの場合、uniformで分布されたハイパーパラメータ用。
mu ( float ) normal または lognormal で分布されたハイパーパラメータの平均パラメータ。
sigma ( float ) normal または lognormal で分布されたハイパーパラメータの標準偏差パラメータ。
q ( float ) 量子化されたハイパーパラメーターの量子化ステップサイズ。
parameters ルートレベルのパラメーター内に他のパラメーターをネストします。

method

methodキーを使用して、ハイパーパラメータ検索戦略を指定します。選択できるハイパーパラメーター検索戦略は、グリッド検索、ランダム検索、およびベイズ探索です。

グリッド検索

ハイパーパラメータのすべての組み合わせを反復します。グリッド検索は、各反復で使用するハイパーパラメータ値のセットに対して無知な決定を下します。グリッド検索は計算的に高コストになる可能性があります。

グリッド検索は、連続的な検索空間内を検索している場合、永遠に実行されます。

ランダム検索

分布に基づいて、各反復でランダムかつ無知なハイパーパラメータ値のセットを選択します。ランダム検索は、コマンドラインやあなたの python スクリプト、または W&B アプリUI でプロセスを停止しない限り、永遠に実行されます。

ランダム(method: random)検索を選択した場合、metricキーで分布空間を指定します。

ベイズ探索

ランダム検索グリッド検索とは対照的に、ベイズモデルを使用して情報に基づく決定を行います。ベイズ最適化は、確率モデルを使用して、代理関数の値をテストする反復プロセスを経て、どの値を使用するかを決定します。ベイズ探索は、少数の連続的なパラメータに対して効果的ですが、スケールがうまくいかないことがあります。ベイズ探索に関する詳細情報は、ベイズ最適化の入門書を参照してください。

ベイズ探索は、コマンドラインやあなたの python スクリプト、または W&B アプリUI でプロセスを停止しない限り、永遠に実行されます。

ランダムおよびベイズ探索の分布オプション

parameter キー内で、ハイパーパラメーターの名前をネストします。次に、distributionキーを指定し、値の分布を指定します。

以下のテーブルでは、W&B がサポートする分布を示しています。

distributionキーの値 説明
constant 定数分布。使用する定数値(value)を指定する必要があります。
categorical カテゴリ分布。このハイパーパラメータのすべての有効な値(values)を指定する必要があります。
int_uniform 整数上の離散一様分布。maxmin を整数として指定する必要があります。
uniform 連続一様分布。maxmin を浮動小数点数として指定する必要があります。
q_uniform 量子化一様分布。X が一様である場合、round(X / q) * q を返します。q はデフォルトで 1
log_uniform 対数一様分布。exp(min)exp(max) の間で X を返し、自然対数が minmax の間で一様に分布。
log_uniform_values 対数一様分布。minmax の間で X を返し、log(X)log(min)log(max) の間で一様に分布。
q_log_uniform 量子化対数一様分布。Xlog_uniform である場合、round(X / q) * q を返します。q はデフォルトで 1
q_log_uniform_values 量子化対数一様分布。Xlog_uniform_values である場合、round(X / q) * q を返します。q はデフォルトで 1
inv_log_uniform 逆対数一様分布。X を返し、log(1/X)minmax の間で一様に分布。
inv_log_uniform_values 逆対数一様分布。X を返し、log(1/X)log(1/max)log(1/min) の間で一様に分布。
normal 正規分布。返される値は平均 mu(デフォルト 0)と標準偏差 sigma(デフォルト 1)で通常に分布。
q_normal 量子化正規分布。Xnormal である場合、round(X / q) * q を返します。q はデフォルトで 1
log_normal 対数正規分布。X の自然対数 log(X) が平均 mu(デフォルト 0)と標準偏差 sigma(デフォルト 1)で通常に分布する値 X を返します。
q_log_normal 量子化対数正規分布。Xlog_normal である場合、round(X / q) * q を返します。q はデフォルトで 1

early_terminate

実行のパフォーマンスが悪い場合に停止させるために早期終了(early_terminate)を使用します。早期終了が発生した場合、W&B は現在の run を停止し、新しいハイパーパラメータの値のセットで新しい run を作成します。

停止アルゴリズム

Hyperband ハイパーパラメータ最適化は、プログラムが停止すべきか、先に進むべきかを、bracketsと呼ばれるあらかじめ設定されたイテレーション数で評価します。

W&B run が bracket に到達したとき、sweep はその run のメトリックを過去に報告されたすべてのメトリック値と比較します。run のメトリック値が高すぎる場合(目標が最小化の場合)、または run のメトリックが低すぎる場合(目標が最大化の場合)、sweep は run を終了します。

ベースの反復数に基づいて bracket が設定されます。bracket の数は、最適化するメトリックをログした回数に対応します。反復はステップ、エポック、またはその中間に対応することができます。ステップカウンタの数値は bracket 計算に使用されません。

キー 説明
min_iter 最初の bracket の反復を指定
max_iter 最大反復数を指定。
s bracket の合計数を指定( max_iter に必要)
eta bracket 倍数スケジュールを指定(デフォルト: 3)。
strict より厳格にオリジナルの Hyperband 論文に従って run を厳しく削減する「strict」モードを有効にします。デフォルトでは false。

command

command キー内のネストされた値を使用して、形式と内容を修正できます。ファイル名などの固定コンポーネントを直接含めることができます。

W&B は、コマンドの可変コンポーネントのために次のマクロをサポートしています:

コマンドマクロ 説明
${env} Unix システムでは /usr/bin/env、Windows では省略されます。
${interpreter} python に展開されます。
${program} スイープ設定 program キーで指定されたトレーニングスクリプトファイル名。
${args} --param1=value1 --param2=value2 の形式でのハイパーパラメーターとその値。
${args_no_boolean_flags} ハイパーパラメータとその値が --param1=value1 の形式であるが、ブールパラメータは True の場合を --boolean_flag_param の形にし、False の場合は省略します。
${args_no_hyphens} param1=value1 param2=value2 の形式でのハイパーパラメータとその値。
${args_json} JSON としてエンコードされたハイパーパラメーターとその値。
${args_json_file} JSON としてエンコードされたハイパーパラメータとその値を含むファイルへのパス。
${envvar} 環境変数を渡す方法。${envvar:MYENVVAR} __ は MYENVVAR 環境変数の値に展開されます。 __