Transformers documentation
ハイパーパラメータ検索
ハイパーパラメータ検索
学習率、バッチサイズ、エポック数などのハイパーパラメータは、トレーニングの結果に大きく影響します。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は、ハイパーパラメータ最適化のための軽量フレームワークです。
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]),
}Ray Tuneは、スケーラブルなハイパーパラメータチューニングライブラリであり、トライアルを複数のマシンに分散して実行することもできます。
from ray import tune
def hp_space(trial):
return {
"learning_rate": tune.loguniform(1e-6, 1e-4),
"per_device_train_batch_size": tune.choice([16, 32, 64, 128]),
}Weights & Biasesは、ハイパーパラメータ検索が組み込まれた実験トラッキングプラットフォームです。ベイズ、ランダム、グリッドの各検索戦略に対応しています。
def hp_space(trial):
return {
"method": "random",
"metric": {"name": "objective", "goal": "minimize"},
"parameters": {
"learning_rate": {"distribution": "uniform", "min": 1e-6, "max": 1e-4},
"per_device_train_batch_size": {"values": [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