Transformers documentation

ハイパーパラメータ検索

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

ハイパーパラメータ検索

学習率、バッチサイズ、エポック数などのハイパーパラメータは、トレーニングの結果に大きく影響します。Trainer.hyperparameter_search() は、異なる値の組み合わせで複数の試行を実行し、最適な組み合わせを見つけ、それを返します。

各トライアルでは、model_initで新しいモデルを初期化し、新しいハイパーパラメータをサンプリングして、完全なトレーニングループを実行し、検索バックエンドに目的関数を報告します。バックエンドは、各目的関数を用いて次のトライアルを決定します。すべてのトライアルが完了すると、最適なハイパーパラメータが~trainer.utils.BestRunとして返されます。

モデルの初期化

各トライアルでは、以前のランの状態を避けるために新しいモデルから開始します。model_init は各トライアルの開始時に呼び出され、新しいモデルインスタンスを返すため、すべてのトライアルが同じ初期重みから開始されます。

from transformers import AutoModelForCausalLM

def model_init(trial):
    return AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-0.6B")

trainer = Trainer(
    model_init=model_init,
    args=args,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset,
)

model=とmodel_init=を同時に渡さないでください。そうしないとTrainerはエラーを発生させます。

探索空間を定義する

探索空間を定義する関数を作成します。形式はバックエンドによって異なります。hp_space 関数を定義しない場合、デフォルトの探索は learning_rate、num_train_epochs、per_device_train_batch_size を対象とします。

# install one of these hyperparam search backends
pip install optuna
pip install wandb
pip install ray[tune]
Optuna
Ray Tune
Weights & Biases

Optunaは、ハイパーパラメータ最適化のための軽量フレームワークです。

def hp_space(trial):
    return {
        "learning_rate": trial.suggest_float("learning_rate", 1e-6, 1e-4, log=True),
        "per_device_train_batch_size": trial.suggest_categorical("per_device_train_batch_size", [16, 32, 64, 128]),
    }

検索を実行

最適化の目標を定義するために、任意の compute_objective 関数を指定できます。存在する場合は eval_loss がデフォルトとなり、存在しない場合はすべてのメトリック値の合計が使用されます。このフォールバックに依存しないようにするには、明示的な関数を渡してください。探索の backend は、指定された direction で n_trials 回のランにわたって目標を最適化します。

def compute_objective(metrics):
    return metrics["eval_loss"]

best_run = trainer.hyperparameter_search(
    hp_space=hp_space,
    compute_objective=compute_objective,
    n_trials=30,               # how many trials to run
    direction="minimize",      # or "maximize" for metrics like accuracy/F1
    backend="optuna",          # "optuna", "ray", or "wandb"
)

hyperparameter_search() は、目的関数の値と最適なハイパーパラメータの組み合わせを含む ~trainer.utils.BestRun を返します。

best_run = trainer.hyperparameter_search(...)

best_run.objective        # 0.38  (best eval loss)
best_run.hyperparameters  # {"learning_rate": 5e-5, "num_train_epochs": 4, ...}

最適なハイパーパラメータをTrainingArgumentsに適用し、フルデータセットで再学習を実行します。

Update on GitHub