メインコンテンツへスキップ
W&B Sweeps は、ハイパーパラメータの値を探索する戦略と、それらを評価するコードを組み合わせたものです。その戦略は、すべての選択肢を試す単純なものから、ベイズ最適化や Hyperband (BOHB) のような複雑なものまで多岐にわたります。 sweep configuration は、Python 辞書 または YAML ファイルで定義します。どちらの形式を使用するかは、Sweeps をどのように管理したいかによって決まります。
コマンドラインから Sweep を初期化し、sweep agent を開始したい場合は、YAML ファイルで sweep configuration を定義してください。Python スクリプトやノートブック内で完結して Sweep を初期化・開始したい場合は、Python 辞書で定義してください。
以下のガイドでは、sweep configuration のフォーマット方法について説明します。トップレベルの sweep configuration キーの網羅的なリストについては、Sweep configuration options を参照してください。

基本構造

YAML と Python 辞書の両方の形式で、キーと値のペア、およびネストされた構造を利用します。 sweep configuration 内のトップレベルキーを使用して、Sweeps の名前 (name キー)、探索するパラメータ (parameters キー)、パラメータ空間を探索する手法 (method キー) など、探索の特性を定義します。 例えば、以下のコードスニペットは、YAML ファイルと Python 辞書で定義された同じ sweep configuration を示しています。この構成では、programnamemethodmetricparameters の 5 つのトップレベルキーが指定されています。
コマンドライン(CLI)から対話的に Sweeps を管理したい場合は、YAML ファイルで sweep configuration を定義します。
config.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"]
トップレベルの parameters キーの中には、learning_ratebatch_sizeepochoptimizer というキーがネストされています。指定する各ネストされたキーに対して、1 つ以上の値、分布、確率などを提供できます。詳細については、Sweep configuration optionsparameters セクションを参照してください。

2 重にネストされたパラメータ

sweep configuration はネストされたパラメータをサポートしています。ネストされたパラメータを定義するには、トップレベルのパラメータ名の下にさらに parameters キーを含めます。 以下の例は、nested_category_1nested_category_2nested_category_3 という 3 つのネストされたパラメータを持つ sweep configuration を示しています。各ネストされたパラメータには、momentumweight_decay という 2 つの追加パラメータが含まれています。
nested_category_1nested_category_2nested_category_3 はプレースホルダーです。ユースケースに合った名前に置き換えてください。
以下のコードスニペットは、YAML ファイルと Python 辞書の両方でネストされたパラメータを定義する方法を示しています。
program: sweep_nest.py
name: nested_sweep
method: random
metric:
  name: loss
  goal: minimize
parameters:
  optimizer:
    values: ['adam', 'sgd']
  fc_layer_size:
    values: [128, 256, 512]
  dropout:
    values: [0.3, 0.4, 0.5]
  epochs:
    value: 1
  learning_rate:
    distribution: uniform
    min: 0
    max: 0.1
  batch_size:
    distribution: q_log_uniform_values
    q: 8
    min: 32
    max: 256
  nested_category_1:
    parameters:
      momentum:
        distribution: uniform
        min: 0.0
        max: 0.9
      weight_decay:
        values: [0.0001, 0.0005, 0.001]
  nested_category_2:
    parameters:
      momentum:
        distribution: uniform
        min: 0.0
        max: 0.9
      weight_decay:
        values: [0.1, 0.2, 0.3]
  nested_category_3:
    parameters:
      momentum:
        distribution: uniform
        min: 0.5
        max: 0.7
      weight_decay:
        values: [0.2, 0.3, 0.4]
sweep configuration で定義されたネストされたパラメータは、W&B run configuration で指定されたキーを上書きします。例として、ネストされたデフォルト値で Run を初期化する train.py スクリプトがあるとします。
def main():
    # ネストされた設定でRunを初期化
    with  wandb.init(config={"nested_param": {"manual_key": 1}}) as run:
        # ここにトレーニングコードを記述
sweep configuration では、トップレベルの "parameters" キーの下にネストされたパラメータを定義しています。
sweep_configuration = {
    "method": "grid",
    "metric": {"name": "score", "goal": "minimize"},
    "parameters": {
        "top_level_param": {"value": 0},
        "nested_param": {
            "parameters": {
                "learning_rate": {"value": 0.01},
                "double_nested_param": {
                    "parameters": {"x": {"value": 0.9}, "y": {"value": 0.8}}
                },
            }
        },
    },
}

sweep_id = wandb.sweep(sweep=sweep_configuration, project="<project>")
wandb.agent(sweep_id, function=main, count=4)
Sweep の実行中、run.config["nested_param"] は Sweep の設定によって定義されたサブツリー (learning_rate, double_nested_param) を反映し、wandb.init(config=...) で定義された manual_key含まれません

Sweep configuration テンプレート

以下のテンプレートは、パラメータの設定方法と探索の制約の指定方法を示しています。hyperparameter_name を実際のハイパーパラメータの名前に、<> で囲まれた値を適切な値に置き換えてください。
config.yaml
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}      
指数表記を使用して数値を表現するには、YAML の !!float オペレーターを追加して値を浮動小数点数にキャストします。例えば、min: !!float 1e-5 のように記述します。詳細は Command example を参照してください。

Sweep configuration の例

config.yaml
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"]

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

マクロとカスタムコマンド引数の例

より複雑なコマンドライン引数の場合、マクロを使用して環境変数、Python インタープリター、および追加の引数を渡すことができます。W&B は定義済みマクロ と、sweep configuration で指定できるカスタムコマンドライン引数をサポートしています。 例えば、以下の sweep configuration (sweep.yaml) は、Sweep の実行時に ${env}${interpreter}${program} マクロが適切な値に置き換えられて Python スクリプト (run.py) を実行するコマンドを定義しています。 --batch_size=${batch_size}--test=True--optimizer=${optimizer} 引数は、カスタムマクロを使用して sweep configuration で定義された batch_sizetestoptimizer パラメータの値を渡しています。
sweep.yaml
program: run.py
method: random
metric:
  name: validation_loss
parameters:
  learning_rate:
    min: 0.0001
    max: 0.1
command:
  - ${env}
  - ${interpreter}
  - ${program}
  - "--batch_size=${batch_size}"
  - "--optimizer=${optimizer}"
  - "--test=True"
関連する Python スクリプト (run.py) では、argparse モジュールを使用してこれらのコマンドライン引数をパースできます。
run.py
# run.py  
import wandb
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--batch_size', type=int)
parser.add_argument('--optimizer', type=str, choices=['adam', 'sgd'], required=True)
parser.add_argument('--test', type=str2bool, default=False)
args = parser.parse_args()

# W&B Runを初期化
with wandb.init('test-project') as run:
    run.log({'validation_loss':1})
sweep configuration で使用できる定義済みマクロのリストについては、Sweep configuration optionsCommand macros セクションを参照してください。

ブール引数

argparse モジュールは、デフォルトではブール引数を直接サポートしていません。ブール引数を定義するには、action パラメータを使用するか、ブール値の文字列表現をブール型に変換するカスタム関数を使用します。 例として、以下のコードスニペットを使用してブール引数を定義できます。ArgumentParser の引数として store_true または store_false を渡します。
import wandb
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--test', action='store_true')
args = parser.parse_args()

args.test  # --test が渡されれば True、そうでなければ False になります
また、ブール値の文字列表現をブール型に変換するカスタム関数を定義することもできます。例えば、以下のコードスニペットは、文字列をブール値に変換する str2bool 関数を定義しています。
def str2bool(v: str) -> bool:
  """文字列をブール値に変換します。
  argparseがデフォルトでブール引数をサポートしていないために必要です。
  """
  if isinstance(v, bool):
      return v
  return v.lower() in ('yes', 'true', 't', '1')