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

Note

TPESamplerHyperbandPruner を使用する場合、 TPESampler の特性を最大限に活用するため、 n_trialstimeout を大きく設定することを推奨します。 TPESampler は起動時にデフォルトで \(10\)Trial を使用するためです。

Hyperband は複数の SuccessiveHalvingPruner を実行し、 現在の Trial のブラケット ID に基づいてトライアルを収集します。 TPESampler が探索空間を適応させるためには、 各ブラケットで少なくとも \(10\) 以上の Trial が必要です。

例えば、HyperbandPruner に 4 つのプルーナーがある場合、 起動には少なくとも \(4 \times 10\) のトライアルが消費されます。

Note

Hyperband には複数の SuccessiveHalvingPruner が存在します。 各 SuccessiveHalvingPruner は論文中で「ブラケット」と呼ばれます。 ブラケットの数は Hyperband の早期停止動作を制御する重要な要素であり、 min_resourcemax_resourcereduction_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

HyperbandPrunerStudystudy_namenumber を引数とする関数で各トライアルのブラケット 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 の詳細を参照してください。

  • max_resource (str | int) –

    トライアルに割り当てる最大リソースを指定するパラメータ。論文中の \(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:

bool