hyperparameter-tuning について
計算予算内で機械学習モデルのハイパーパラメーターを探索する、AIエージェント向けスキルです。探索空間の設計、試行の評価と枝刈り、結果分析を行い、最終学習に使う値を選びます。
主な機能
- 01カテゴリ、整数、浮動小数点の探索空間定義
- 02グリッド、ランダム、ベイズ、Hyperbandの選択
- 03交差検証またはホールドアウトによる評価
- 04成績の低い試行の早期打ち切り
- 05パラメーターの重要度と相互作用の分析
- 06最終モデル学習用パラメーターの選定
活用シーン
- 01目標指標に合わせたモデルの調整
- 02試行予算内での探索手法の比較
- 03計算資源節約のための低成績試行の終了
- 04モデル性能に影響するパラメーターの確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ seb1n/ awesome-ai-agent-skills --skill hyperparameter-tuningインストール後、Claude Code で/hyperparameter-tuningを入力して読み込まれたか確認します。
詳細
ハイパーパラメーターのチューニング
このスキルを使うと、AI エージェントは機械学習モデルに最適なハイパーパラメーター構成を体系的に探索できます。探索空間の定義、探索戦略(グリッド、ランダム、ベイズ、Hyperband)の選択、交差検証による試行の実行、性能の低い構成を除外するための早期終了の適用、結果の分析による最良のパラメーターの特定を扱います。エージェントは探索と活用のバランスを取り、与えられた計算予算内で優れた構成を見つけます。
ワークフロー
-
探索空間を定義する: 各ハイパーパラメーターの型(カテゴリ、整数、浮動小数点数)と範囲を指定します。桁違いの範囲にわたるパラメーター(例:1e-5 から 1e-1 までの学習率)には、対数一様分布を使用します。関連するパラメーターをグループ化し、特定のパラメーターがほかのパラメーターの値に応じて適用される条件付き探索空間を定義します。
-
探索戦略を選択する: 計算予算と探索空間の大きさに基づいて、チューニングアルゴリズムを選択します。グリッドサーチは網羅的ですが、小規模な探索空間でしか実用的ではありません。ランダムサーチは優れたベースラインとなり、より大きな探索空間にも対応できます。ベイズ最適化(Tree-structured Parzen Estimators または Gaussian Processes)は、評価にコストがかかる場合に最もサンプル効率が高くなります。Hyperband と ASHA は、深層学習のワークロード向けに、早期終了とランダムサーチを組み合わせます。
-
評価を設定する: 小規模から中規模のデータセットで信頼性の高い性能推定を行うには、k 分割交差検証(通常は 5 分割)を設定します。大規模なデータセットや計算コストの高いモデルでは、単一のホールドアウト検証セットを使用します。最適化する評価指標(例:検証 F1、AUC-ROC、RMSE)と、最小化するか最大化するかを定義します。
-
枝刈りを適用して試行を実行する: 探索を実行し、可能な場合は試行を並列で開始します。中間結果(例:数エポックの学習後)に基づいて性能の低い試行を早期に終了する枝刈りを有効にし、より有望な構成に計算リソースを割り当てます。
-
結果を分析して選択する: 最適化の履歴を調べ、どのハイパーパラメーターが最も重要かを把握します(重要度分析)。等高線プロットや平行座標プロットを使って、パラメーター間の相互作用を可視化します。最良の構成を選択し、そのパラメーターを使って完全な学習セットで最終モデルを再学習します。
対応テクノロジー
- フレームワーク: Optuna、Ray Tune、scikit-learn GridSearchCV/RandomizedSearchCV、Hyperopt、Keras Tuner
- 枝刈りアルゴリズム: 中央値による枝刈り、Hyperband(Successive Halving)、ASHA
- ベイズ手法: TPE(Tree-structured Parzen Estimators)、GP(Gaussian Process)、CMA-ES
- 可視化: Optuna visualization(plotly)、TensorBoard HParams、Weights & Biases Sweeps
- 分散実行: Ray Tune クラスター、分散ストレージを使用した Optuna(MySQL、PostgreSQL)
使用方法
エージェントにモデル、データセット、チューニングするハイパーパラメーターとその範囲、計算予算(試行回数または実行時間)、および目標指標を指定します。エージェントはチューニングのワークフローを実行し、性能分析とともに最良のハイパーパラメーター構成を返します。
例
例 1:ランダムフォレストをチューニングする Optuna Study
import optuna
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import cross_val_score
import numpy as np
X, y = load_breast_cancer(return_X_y=True)
def objective(trial):
params = {
"n_estimators": trial.suggest_int("n_estimators", 50, 500, step=50),
"max_depth": trial.suggest_int("max_depth", 3, 30),
"min_samples_split": trial.suggest_int("min_samples_split", 2, 20),
"min_samples_leaf": trial.suggest_int("min_samples_leaf", 1, 10),
"max_features": trial.suggest_categorical("max_features", ["sqrt", "log2", None]),
"criterion": trial.suggest_categorical("criterion", ["gini", "entropy"]),
}
clf = RandomForestClassifier(**params, random_state=42, n_jobs=-1)
scores = cross_val_score(clf, X, y, cv=5, scoring="f1")
return scores.mean()
study = optuna.create_study(direction="maximize", sampler=optuna.samplers.TPESampler(seed=42))
study.optimize(objective, n_trials=100, show_progress_bar=True)
print(f"Best F1: {study.best_value:.4f}")
print(f"Best params: {study.best_params}")
# Visualization
fig_importance = optuna.visualization.plot_param_importances(study)
fig_history = optuna.visualization.plot_optimization_history(study)
fig_contour = optuna.visualization.plot_contour(study, params=["n_estimators", "max_depth"])
例 2:早期終了を備えたニューラルネットワーク向け Ray Tune
import torch
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset, random_split
from ray import tune
from ray.tune.schedulers import ASHAScheduler
from ray.air import session
import numpy as np
def train_nn(config):
X = torch.randn(2000, 20)
y = (X[:, 0] + X[:, 1] * 2 > 0).long()
dataset = TensorDataset(X, y)
train_set, val_set = random_split(dataset, [1600, 400])
train_loader = DataLoader(train_set, batch_size=config["batch_size"], shuffle=True)
val_loader = DataLoader(val_set, batch_size=256)
model = nn.Sequential(
nn.Linear(20, config["hidden_size"]),
nn.ReLU(),
nn.Dropout(config["dropout"]),
nn.Linear(config["hidden_size"], config["hidden_size"] // 2),
nn.ReLU(),
nn.Linear(config["hidden_size"] // 2, 2),
)
optimizer = torch.optim.Adam(model.parameters(), lr=config["lr"], weight_decay=config["weight_decay"])
criterion = nn.CrossEntropyLoss()
for epoch in range(50):
model.train()
for xb, yb in train_loader:
loss = criterion(model(xb), yb)
optimizer.zero_grad()
loss.backward()
optimizer.step()
model.eval()
correct, total = 0, 0
with torch.no_grad():
for xb, yb in val_loader:
correct += (model(xb).argmax(1) == yb).sum().item()
total += yb.size(0)
session.report({"val_accuracy": correct / total})
search_space = {
"hidden_size": tune.choice([64, 128, 256]),
"lr": tune.loguniform(1e-4, 1e-1),
"dropout": tune.uniform(0.1, 0.5),
"batch_size": tune.choice([32, 64, 128]),
"weight_decay": tune.loguniform(1e-5, 1e-2),
}
scheduler = ASHAScheduler(max_t=50, grace_period=5, reduction_factor=3)
result = tune.run(
train_nn,
config=search_space,
num_samples=50,
scheduler=scheduler,
metric="val_accuracy",
mode="max",
resources_per_trial={"cpu": 2},
)
print(f"Best config: {result.best_config}")
print(f"Best val accuracy: {result.best_result['val_accuracy']:.4f}")
ベストプラクティス
- 学習率、重み減衰、正則化の強さには対数一様分布を使用してください。 最適値が複数の桁にわたることが多いためです。
- まずランダムサーチを開始し、 有望な探索空間の領域をすばやく特定してから、ベイズ最適化に切り替えて細かく探索してください。
- 早期停止/枝刈りを有効にして、 数エポック後に明らかに性能が劣る設定に計算リソースを浪費しないようにしてください。
- データセットが小さい場合(サンプル数が 50k 未満)は、目的スコアに必ず交差検証を使用してください。 性能推定のばらつきを抑え、単一の検証用データ分割への過適合を防げます。
- チューニング後にハイパーパラメーターの重要度分析を実行し、 実際に重要なパラメーターを把握してください。多くの場合、性能差の大半を左右するのは 2~3 個のパラメーターだけです。
- 事前に計算予算(試行回数、GPU 時間、または実時間)を設定し、 その予算を最も有効に活用できる探索戦略を選んでください。
エッジケース
- 探索空間が非常に大きい場合(10 次元超): 高次元ではベイズ最適化の性能が低下します。まずランダムサーチまたは Hyperband を使用し、その後、最初の探索で特定した重要度上位 3~5 個のパラメーターを対象にベイズ最適化を実行してください。
- 目的関数がノイジーな場合: 交差検証スコアのばらつきが大きいと、単一の試行結果は信頼できません。CV の分割数を増やす、反復 k 分割交差検証を使用する、または設定を比較する前に複数のシードで平均を取る、といった方法があります。
- 相関のあるハイパーパラメーター: 学習率とバッチサイズのように、強く相互作用するハイパーパラメーターがあります。Optuna の等高線プロットまたは fANOVA 重要度を使用して相互作用を検出し、相関のあるパラメーター群をまとめて調整することを検討してください。
- 評価コストが高い場合(1 試行あたり 1 時間超): Hyperband のようなマルチフィデリティ手法を使用し、まず少ない予算で学習させ、有望な設定だけを完全な学習に進めてください。また、初期スクリーニングには代理ベンチマークや小規模なプロキシデータセットの使用も検討してください。
- カテゴリの組み合わせが爆発する場合: 複数のカテゴリ型ハイパーパラメーターによって組み合わせが爆発する場合は、条件付き探索空間を使用して無効な組み合わせを枝刈りし、実効的な空間サイズを縮小してください。