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

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

Define a sweep configuration

sweep の 設定ファイルを作成する方法について説明します。

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

Python 辞書または YAML ファイルで sweep configuration を定義します。sweep configuration の定義方法は、sweep の管理方法によって異なります。

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

基本構造

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

sweep configuration 内のトップレベルキーを使用して、sweep の名前 (name キー)、検索するパラメータ (parameters キー)、パラメータ空間を検索する方法 (method キー) など、sweep 検索の特性を定義します。

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

コマンドライン (CLI) からインタラクティブに Sweeps を管理する場合は、YAML ファイルで sweep configuration を定義します。

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 notebook でトレーニングアルゴリズムを定義する場合は、Python 辞書データ構造で sweep を定義します。

次のコードスニペットは、sweep_configuration という変数に 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 configuration は、ネストされたパラメータをサポートしています。ネストされたパラメータを区切るには、トップレベルのパラメータ名の下に追加の parameters キーを使用します。sweep config は、複数レベルのネスティングをサポートしています。

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

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

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"]},
    },
}

Bayes hyperband の例

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 が sweep パラメータを wandb.config に自動的に取り込むことを利用できます。

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

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

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

1 - Sweep configuration options

sweep configurationは、ネストされたキーと値のペアで構成されています。sweep configuration内のトップレベルキーを使用して、検索するパラメータ(parameter キー)、パラメータ空間を検索する方法(method キー)など、sweep検索の品質を定義します。

以下の表は、トップレベルのsweep configurationキーと簡単な説明を示しています。各キーの詳細については、それぞれのセクションを参照してください。

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

sweep configurationの構造化方法の詳細については、Sweep configurationの構造を参照してください。

metric

metric トップレベルのsweep configurationキーを使用して、最適化する名前、目標、およびターゲットメトリックを指定します。

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

parameters

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

次の表は、サポートされているハイパーパラメータ検索制約を示しています。ハイパーパラメータとユースケースに基づいて、以下の検索制約のいずれかを使用して、sweep agentに検索場所(分布の場合)または検索または使用するもの(valuevaluesなど)を指示します。

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

method

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

グリッド検索

ハイパーパラメータ値のすべての組み合わせを反復処理します。グリッド検索は、各反復で使用するハイパーパラメータ値のセットについて、情報に基づかない決定を行います。グリッド検索は、計算コストが高くなる可能性があります。

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

ランダム検索

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

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

ベイズ探索

ランダムおよびグリッド検索とは対照的に、ベイズモデルは情報に基づいた決定を行います。ベイズ最適化は、確率モデルを使用して、目的関数を評価する前に代用関数で値をテストする反復プロセスを通じて、使用する値を決定します。ベイズ探索は、連続パラメータの数が少ない場合にはうまく機能しますが、スケールは劣ります。ベイズ探索の詳細については、ベイズ最適化入門論文を参照してください。

ベイズ探索は、コマンドライン、Pythonスクリプト内、またはW&B App UIからプロセスを停止しない限り、永久に実行されます。

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

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

次の表は、W&Bがサポートする分布を示しています。

distributionキーの値 説明
constant 定数分布。使用する定数(value)を指定する必要があります。
categorical カテゴリ分布。このハイパーパラメータの有効な値(values)をすべて指定する必要があります。
int_uniform 整数に対する離散一様分布。maxminを整数として指定する必要があります。
uniform 連続一様分布。maxminをfloatとして指定する必要があります。
q_uniform 量子化された一様分布。round(X / q) * qを返します。ここで、Xは一様です。qのデフォルトは1です。
log_uniform 対数一様分布。exp(min)exp(max)の間の値Xを返します。自然対数はminmaxの間で均等に分布します。
log_uniform_values 対数一様分布。minmaxの間の値Xを返します。log(X)log(min)log(max)の間で均等に分布します。
q_log_uniform 量子化された対数一様分布。round(X / q) * qを返します。ここで、Xlog_uniformです。qのデフォルトは1です。
q_log_uniform_values 量子化された対数一様分布。round(X / q) * qを返します。ここで、Xlog_uniform_valuesです。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 量子化された正規分布。round(X / q) * qを返します。ここで、Xnormalです。Qのデフォルトは1です。
log_normal 対数正規分布。自然対数log(X)が平均mu(デフォルト0)および標準偏差sigma(デフォルト1)で正規分布するように、値Xを返します。
q_log_normal 量子化された対数正規分布。round(X / q) * qを返します。ここで、Xlog_normalです。qのデフォルトは1です。

early_terminate

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

停止アルゴリズム

Hyperbandハイパーパラメータ最適化は、プログラムを停止するか、事前設定された1つ以上の反復回数(ブラケットと呼ばれる)で続行するかを評価します。

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

ブラケットは、ログに記録された反復回数に基づいています。ブラケットの数は、最適化するメトリックをログに記録する回数に対応します。反復は、ステップ、エポック、またはその間の何かに対応できます。ステップカウンターの数値は、ブラケットの計算には使用されません。

キー 説明
min_iter 最初のブラケットの反復を指定します
max_iter 最大反復回数を指定します。
s ブラケットの総数を指定します(max_iterに必要)。
eta ブラケット乗数スケジュールを指定します(デフォルト:3)。
strict 元のHyperband論文に厳密に従って、runをより積極的にプルーニングする「strict」モードを有効にします。デフォルトはfalseです。

command

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

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

コマンドマクロ 説明
${env} Unixシステムでは/usr/bin/env、Windowsでは省略。
${interpreter} pythonに展開されます。
${program} sweep configurationの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環境変数の値に展開されます。