メインコンテンツまでスキップ

スイープ構成の定義

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

スイープ構成の形で戦略を定義します。構成は以下のいずれかで指定してください:

  1. Jupyter NotebookまたはPythonスクリプトを使用している場合は、Pythonのネストされたディクショナリデータ構造。
  2. コマンドライン(CLI)を使用している場合は、YAMLファイル。

以下のコードスニペットは、Jupyter NotebookやPythonスクリプト内、またはYAMLファイル内でスイープ構成を定義する方法の例を示しています。構成キーは、後続のセクションで詳細に定義されています。

JupyterノートブックやPythonスクリプト内で、スイープをPythonディクショナリデータ構造として定義します。
sweep_configuration = {
'method': 'random',
'name': 'sweep',
'metric': {
'goal': 'minimize',
'name': 'validation_loss'
},
'parameters': {
'batch_size': {'values': [16, 32, 64]},
'epochs': {'values': [5, 10, 15]},
'lr': {'max': 0.1, 'min': 0.0001}
}
}

:::注意

  1. PythonスクリプトやJupyterノートブック内で、スイープが最適化するために定義した正確なメトリック名をログ(wandb.log)に記録してください。
  2. W&Bスイープエージェントを開始した後は、スイープ構成を変更することはできません。 :::

例えば、W&Bスイープでトレーニング中の検証精度を最大化したい場合、Pythonスクリプト内で検証精度をval_lossという変数に格納します。YAML構成ファイルでは、以下のように定義します。

metric:
goal: maximize
name: val_loss

PythonスクリプトやJupyterノートブックでval_loss変数(この例では)をW&Bにログに記録する必要があります。

wandb.log({
'val_loss': validation_loss
})

スイープ構成の構造

スイープ構成はネストされており、キーはさらにキーを値として持つことができます。以下にトップレベルのキーを一覧し、簡単に説明した後に、次のセクションで詳しく述べます。

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

検索タイプのメソッド

以下のリストは、ハイパーパラメーター検索方法を説明しています。検索戦略は method で指定します。

  • grid - 各ハイパーパラメーターの値のすべての組み合わせを繰り返します。計算コストが高いことがあります。
  • random - 提供された分布に基づいて、各反復でランダムなセットのハイパーパラメーター値を選択します。
  • bayes - ハイパーパラメーターの関数としてメトリックスコアの確率モデルを作成し、メトリックを改善する可能性が高いパラメーターを選択します。ベイジアンハイパーパラメーター検索方法は、ガウスプロセスを使用してパラメーターとモデルメトリックの関係をモデル化し、改善の確率を最適化するためのパラメーターを選択します。この戦略では、metricキーを指定する必要があります。連続パラメーターの数が少ない場合にはうまく機能するが、スケールは悪い。
method: random

:::警告 ランダムおよびベイズ探索は、コマンドライン、Pythonスクリプト内、またはUIからプロセスを停止するまで永遠に実行されます。連続した探索空間の中で検索を行う場合、グリッド検索も永遠に実行されます。 :::

設定キー

method

スイープ構成のmethodキーで、検索戦略を指定します。

method説明
gridグリッド検索は、パラメータ値のすべての組み合わせを繰り返し検索します。
randomランダム検索は、各反復でパラメータ値のランダムなセットを選択します。
bayesベイズハイパーパラメータ検索方法では、ガウス過程を使用して、パラメータとモデル指標の関係をモデル化し、改善の確率を最適化するパラメータを選択します。この戦略では、metricキーを指定する必要があります。

parameters

スイープの間に探索するハイパーパラメーターを記述します。それぞれのハイパーパラメーターについて、名前と可能な値を定数リスト(任意のmethodに対して)として指定するか、randomまたはbayes用にdistributionを指定します。 | 値 | 説明 | | --------------- | ------------------------------------------------------------------- | | values | このハイパーパラメーターに対して有効なすべての値を指定します。gridと互換性があります。 | | value | このハイパーパラメーターに対して単一の有効な値を指定します。gridと互換性があります。 | | distribution | (str) 下の分布表から分布を選択します。指定されていない場合、valuesが設定されている場合はcategoricalmaxminが整数に設定されている場合はint_uniformmaxminが小数に設定されている場合はuniformvalueが設定されている場合はconstantがデフォルトになります。 | | probabilities | randomを使用する際に、valuesの各要素を選択する確率を指定します。 | | min, max | (intor float) 最大値と最小値。intの場合、int_uniform分布のハイパーパラメーター用。floatの場合、uniform分布のハイパーパラメーター用。 | | mu | (float) normalまたはlognormal分布のハイパーパラメータに対する平均パラメータ。 | | sigma | (float) normalまたはlognormal分布のハイパーパラメータに対する標準偏差パラメータ。 | | q | (float) 量子化パラメータのステップサイズ。 | | parameters | ルートレベルパラメータ内に他のパラメータをネストします。 |

parameter_name:
value: 1.618

distribution

ランダム (random) またはベイズ (bayes) の探索メソッドを選択した場合に、値の分布方法を指定します。

説明
constant定数分布。value を指定する必要があります。
categoricalカテゴリ分布。values を指定する必要があります。
int_uniform整数に対する離散一様分布。maxmin を整数で指定する必要があります。
uniform連続一様分布。maxmin を浮動小数点で指定する必要があります。
q_uniform量子化された一様分布。round(X / q) * q を返し、X は一様分布です。q はデフォルトで 1
log_uniform対数一様分布。exp(min)exp(max) の間にある値 X を返し、自然対数が minmax の間で一様に分布します。
log_uniform_values対数一様分布。log(X)log(min)log(max) の間で一様に分布するような、minmax の間にある値 X を返します。
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逆対数一様分布。log(1/X)minmax の間で一様に分布するような値 X を返します。
inv_log_uniform_values逆対数一様分布。log(1/X)log(1/max)log(1/min) の間で一様に分布するような値 X を返します。
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

parameter_name:
distribution: constant
value: 2.71828

metric

最適化するメトリックを記述します。このメトリックは、トレーニングスクリプトによってW&Bに明示的にログされる必要があります。

キー説明
name最適化するメトリックの名前。
goalminimize もしくは maximize(デフォルトは minimize)。
target最適化するメトリックの目標値。スイープ内の任意のrunがその目標値を達成した場合、スイープの状態は finished に設定されます。これは、アクティブなrunを持つすべてのエージェントがジョブを終了することを意味しますが、スイープには新しいrunが開始されません。

例えば、モデルの検証ロスを最小化したい場合は以下のようになります。

# valid_lossとして検証損失を返すモデルトレーニングコード
wandb.log({"val_loss" : valid_loss})

metric:
name: val_acc
goal: maximize
注意

最適化するメトリクスはトップレベルのメトリクスである必要があります。

スイープのメトリクスをサブディレクトリ内にログしないでください。先程のコード例では、検証ロス("loss": val_loss)をログしたいと思っています。まず、それを辞書に定義します。しかし、wandb.logに渡される辞書では、トラッキングするキーと値のペアが指定されていません。

val_metrics = {
"loss": val_loss,
"acc": val_acc
}

# 不正確。辞書のキーと値のペアが提供されていません。
wandb.log({"val_loss", val_metrics})

代わりに、メトリクスをトップレベルでログしてください。例えば、辞書を作成した後、辞書をwandb.logメソッドに渡す際にキーと値のペアを指定します。

val_metrics = {
"loss": val_loss,
"acc": val_acc
}

wandb.log({"val_loss", val_metrics["loss"]})

early_terminate

早期終了は、性能が低い実行を停止することでハイパーパラメータの検索を高速化するオプション機能です。早期停止がトリガされると、エージェントは現在の実行を停止し、次のハイパーパラメーターセットを試みます。

キー説明
type停止アルゴリズムを指定する

以下の停止アルゴリズムをサポートしています。

type説明
hyperbandハイパーバンド法 を使用する

hyperband

Hyperband 停止は、プログラムを停止するか、いわゆる "ブラケット" と呼ばれる1つ以上のプリセット・イテレーションカウントで続行するかどうかを評価します。実行がブラケットに達すると、そのメトリクス値は、これまでに報告されたすべてのメトリクス値と比較され、値が高すぎる場合 (目標が最小化の場合) または低すぎる場合 (目標が最大化の場合) W&B Run が終了します。

ブラケットは、ログされたイテレーションの数に基づいています。ブラケットの数は、最適化するメトリックをログする回数に対応します。イテレーションは、ステップ、エポック、またはその間のものに対応することができます。ステップカウンターの数値は、ブラケットの計算には使用されません。

注意

ブラケットスケジュールを作成するには、min_iter または max_iter のいずれかを指定してください。

キー説明
min_iter最初のブラケットのイテレーションを指定する
max_iter最大イテレーション数を指定します。
sブラケットの総数を指定します(max_iter に必要)
etaブラケット乗数スケジュールを指定します(デフォルト: 3)。
備考

ハイパーバンド早期終了器は、数分ごとにどのW&B Runsを終了させるかをチェックします。ランまたは反復が短い場合、終了ランのタイムスタンプが指定されたブラケットと異なる場合があります。

early_terminate:
type: hyperband
min_iter: 3

この例のブラケットは [3, 3*eta, 3*eta*eta, 3*eta*eta*eta] で、[3, 9, 27, 81] と等しいです。

command

/usr/bin/env python train.py --param1=value1 --param2=value2
備考

UNIXシステムでは、/usr/bin/envが環境に基づいて適切なPythonインタープリタが選択されることを保証します。

commandキーの下に値を指定することで、フォーマットと内容を変更することができます。ファイル名などの固定されたコマンドの要素は、直接含めることができます(以下の例を参照)。

コマンドの可変要素については、以下のマクロをサポートしています。

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

デフォルトのコマンドフォーマットは以下のように定義されています。

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

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

command:
- ${env}
- python3
- ${program}
- ${args}
Was this page helpful?👍👎