optuna.pruners.HyperbandPruner
- class optuna.pruners.HyperbandPruner(min_resource=1, max_resource='auto', reduction_factor=3, bootstrap_count=0)[source]
Hyperband を利用したプルーナー
SuccessiveHalving (SHA) ではハイパーパラメータとして設定する 設定数 \(n\) が必要です。与えられた有限の予算 \(B\) に対して、 全ての設定は平均的に \(B \over n\) のリソースを持ちます。 ご覧の通り、\(B\) と \(B \over n\) の間にはトレードオフが存在します。 Hyperband はこのトレードオフを、 固定された予算に対して異なる \(n\) の値を試すことで解決します。
Note
Hyperband 論文では
RandomSampler
の対応物が使用されています。Optuna ではデフォルトで
TPESampler
が使用されます。ベンチマーク結果 から、
optuna.pruners.HyperbandPruner
は両方のサンプラーをサポートしていることが確認できます。
Note
TPESampler
でHyperbandPruner
を使用する場合、TPESampler
の特性を最大限に活用するため、n_trials
やtimeout
を大きく設定することを推奨します。TPESampler
は起動時にデフォルトで \(10\) のTrial
を使用するためです。Hyperband は複数の
SuccessiveHalvingPruner
を実行し、 現在のTrial
のブラケット ID に基づいてトライアルを収集します。TPESampler
が探索空間を適応させるためには、 各ブラケットで少なくとも \(10\) 以上のTrial
が必要です。例えば、
HyperbandPruner
に 4 つのプルーナーがある場合、 起動には少なくとも \(4 \times 10\) のトライアルが消費されます。Note
Hyperband には複数の
SuccessiveHalvingPruner
が存在します。 各SuccessiveHalvingPruner
は論文中で「ブラケット」と呼ばれます。 ブラケットの数は Hyperband の早期停止動作を制御する重要な要素であり、min_resource
、max_resource
、reduction_factor
によって \(\mathrm{The\ number\ of\ brackets} = \mathrm{floor}(\log_{\texttt{reduction}\_\texttt{factor}} (\frac{\texttt{max}\_\texttt{resource}}{\texttt{min}\_\texttt{resource}})) + 1\) として自動的に決定されます。 ブラケット数が過度に大きくならないよう、reduction_factor
を設定してください(一般的な使用ケースでは 4~6 程度)。 詳細は 原論文 の 3.6 節を参照してください。Note
HyperbandPruner
はStudy
のstudy_name
とnumber
を引数とする関数で各トライアルのブラケット ID を計算します。 プルーニングアルゴリズムの再現性を確保するため、study_name
を指定してください。使用例
Hyperband プルーニングアルゴリズムを使用して目的関数を最小化します。
import numpy as np from sklearn.datasets import load_iris from sklearn.linear_model import SGDClassifier from sklearn.model_selection import train_test_split import optuna X, y = load_iris(return_X_y=True) X_train, X_valid, y_train, y_valid = train_test_split(X, y) classes = np.unique(y) n_train_iter = 100 def objective(trial): alpha = trial.suggest_float("alpha", 0.0, 1.0) clf = SGDClassifier(alpha=alpha) for step in range(n_train_iter): clf.partial_fit(X_train, y_train, classes=classes) intermediate_value = clf.score(X_valid, y_valid) trial.report(intermediate_value, step) if trial.should_prune(): raise optuna.TrialPruned() return clf.score(X_valid, y_valid) study = optuna.create_study( direction="maximize", pruner=optuna.pruners.HyperbandPruner( min_resource=1, max_resource=n_train_iter, reduction_factor=3 ), ) study.optimize(objective, n_trials=20)
- Parameters:
min_resource (int) – 論文中で \(r\) と表記されるトライアルに割り当てる最小リソースを指定するパラメータ。 \(r\) が小さいほど高速に結果が得られますが、大きい \(r\) は構成間の判定の信頼性を高めます。
SuccessiveHalvingPruner
の詳細を参照してください。トライアルに割り当てる最大リソースを指定するパラメータ。論文中の \(R\) は
max_resource / min_resource
に対応します。 この値は最大イテレーション数(例:ニューラルネットワークのエポック数)を表し、 これと一致させる必要があります。"auto"
を指定すると、完了したトライアルから最大リソースが推定されます。 デフォルト値は"auto"
です。Note
"auto"
を指定すると、最大リソースは最初のトライアル(並列実行時は最初のトライアルの1つ)のreport()
で報告された最大ステップ数になります。最大リソースが決定されるまで、 トライアルはプルーニングされません。Note
中間値のステップ数がトライアルごとに変化する場合は、
max_resource
に最大ステップ数を手動で指定してください。reduction_factor (int) – 論文中で \(\eta\) と表記される昇格可能なトライアルの削減率を指定するパラメータ。
SuccessiveHalvingPruner
の詳細を参照してください。bootstrap_count (int) – トライアルが昇格可能となる前に必要とするトライアル数を指定するパラメータ。
max_resource
が"auto"
の場合と組み合わせることはできません。SuccessiveHalvingPruner
の詳細を参照してください。
メソッド
prune
(study, trial)Judge whether the trial should be pruned based on the reported values.
- prune(study, trial)[source]
報告された値に基づいてトライアルをプルーニングするかどうかを判定します。
このメソッドはライブラリの利用者が直接呼び出すものではありません。代わりに、
optuna.trial.Trial.report()
とoptuna.trial.Trial.should_prune()
が 目的関数内でプルーニング機構を実装するためのインターフェースを提供します。- Parameters:
study (Study) – 対象のスタディオブジェクト。
trial (FrozenTrial) – 対象のトライアルオブジェクト(FrozenTrial)。 このオブジェクトを変更する前にコピーを作成してください。
- Returns:
トライアルをプルーニングするかどうかを示すブール値。
- Return type: