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 を示しています。この構成では、program、name、method、metric、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 スクリプトやノートブックでトレーニングアルゴリズムを定義する場合は、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_rate、batch_size、epoch、optimizer というキーがネストされています。指定する各ネストされたキーに対して、1 つ以上の値、分布、確率などを提供できます。詳細については、Sweep configuration options の parameters セクションを参照してください。
2 重にネストされたパラメータ
sweep configuration はネストされたパラメータをサポートしています。ネストされたパラメータを定義するには、トップレベルのパラメータ名の下にさらに parameters キーを含めます。
以下の例は、nested_category_1、nested_category_2、nested_category_3 という 3 つのネストされたパラメータを持つ sweep configuration を示しています。各ネストされたパラメータには、momentum と weight_decay という 2 つの追加パラメータが含まれています。
nested_category_1、nested_category_2、nested_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]
{
"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 を実際のハイパーパラメータの名前に、<> で囲まれた値を適切な値に置き換えてください。
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 の例
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
マクロとカスタムコマンド引数の例
より複雑なコマンドライン引数の場合、マクロを使用して環境変数、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_size、test、optimizer パラメータの値を渡しています。
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
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 options の Command 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')