ml-hyperparameter-tuning について
機械学習のハイパーパラメーター探索を設計・実行するためのガイドです。ベースラインと固定した評価手順を整えたうえで、探索方法や結果の検証を扱います。
主な機能
- 01グリッド・ランダム・ベイズ探索の比較
- 02連続・離散・条件付き空間の設計
- 03プルーニングと早期停止の活用
- 04試行の記録と探索結果の分析
活用シーン
- 01モデルに合う探索方法の選択
- 02有望でない試行の計算量削減
- 03最良設定の汎化性能の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ josiahsiegel/ claude-plugin-marketplace --skill ml-hyperparameter-tuningインストール後、Claude Code で/ml-hyperparameter-tuningを入力して読み込まれたか確認します。
詳細
ML ハイパーパラメータ調整
概要
ハイパーパラメータ探索の設計と実行には、このスキルを使用します。調整では、固定された評価プロトコルのもとで、有効なベースラインを改善します。データの検証、リークを防ぐ分割、指標の選定、再現可能な学習、シンプルなベースラインの準備が整う前に調整を始めないでください。
探索戦略の選択
| 戦略 | 使用する場面 | 備考 |
|---|---|---|
| 知見に基づく手動探索 | 初期のデバッグや非常に限られた予算 | 学習曲線やドメイン知識を活用できる場合に最適です |
| グリッドサーチ | カテゴリ変数や離散パラメータが少ない場合 | 高次元では非効率です |
| ランダムサーチ | 幅広い探索空間に対する強力なデフォルト | 重要なパラメータが一部だけの場合、グリッドサーチを上回ることがよくあります |
| ベイズ最適化/TPE | 試行予算が中程度で、各試行のコストが高い場合 | 構造化された連続/離散空間に適しています |
| Hyperband/ASHA | 早期の性能指標が得られる深層学習の試行が多数ある場合 | 比較可能な学習曲線と適切な早期停止指標が必要です |
| 集団ベース学習 | スケジュールや非定常のハイパーパラメータを扱う場合 | 複雑ですが、RL や大規模な学習予算で役立ちます |
| AutoML | 強力なベースラインや表形式データの生産性が必要な場合 | リーク、説明可能性、デプロイの制約を検証してください |
Optuna は、Python による探索の柔軟なデフォルトです。Ray Tune は、分散スイープ、スケジューラ、Ray Train との統合に優れています。FLAML は、コスト効率の高い AutoML を重視しています。AutoGluon は、表形式データ、マルチモーダル、時系列のベースライン構築に役立ちます。W&B sweeps は、実験トラッキングとの統合に優れています。
プルーニングを使った Optuna の目的関数(Python のひな形)
Optuna では、検証スコアの中間値に基づき、学習ループの早い段階で有望でない試行をプルーニングできます。
import optuna
import torch
import torch.nn as nn
import torch.optim as optim
def train_and_validate(config, trial, model, train_loader, val_loader, device):
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=config["lr"])
for epoch in range(10): # 10 Epochs max
model.train()
for inputs, targets in train_loader:
inputs, targets = inputs.to(device), targets.to(device)
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()
# Validation epoch
model.eval()
val_loss = 0.0
with torch.no_grad():
for inputs, targets in val_loader:
inputs, targets = inputs.to(device), targets.to(device)
outputs = model(inputs)
val_loss += criterion(outputs, targets).item()
val_loss /= len(val_loader)
# Report intermediate value to Optuna for pruning check
trial.report(val_loss, epoch)
# Handle pruning (stop execution of this trial if criteria are met)
if trial.should_prune():
raise optuna.exceptions.TrialPruned()
return val_loss
def objective(trial: optuna.Trial, model_class, train_loader, val_loader, device):
# Search Space Configuration
config = {
"lr": trial.suggest_float("lr", 1e-5, 1e-2, log=True),
"optimizer": trial.suggest_categorical("optimizer", ["Adam", "SGD", "RMSprop"]),
"batch_size": trial.suggest_categorical("batch_size", [16, 32, 64]),
"dropout_rate": trial.suggest_float("dropout_rate", 0.1, 0.5)
}
model = model_class(dropout_rate=config["dropout_rate"]).to(device)
return train_and_validate(config, trial, model, train_loader, val_loader, device)
# Running the study
# study = optuna.create_study(direction="minimize", pruner=optuna.pruners.MedianPruner())
# study.optimize(lambda t: objective(t, MyModel, train_loader, val_loader, device), n_trials=50)
探索空間の設計
スケールを反映した分布を使用します。学習率、重み減衰、正則化の強さ、木の min child weight には、通常、対数一様分布または対数グリッドを使う必要があります。深さ、層数、隠れ層のサイズ、バッチサイズ、推定器の数は離散値です。オプティマイザー、スケジューラー、データ拡張ポリシー、モデルファミリー、特徴量セットはカテゴリ値です。
無効な組み合わせは探索しないでください。条件付きの探索空間を設定します。たとえば、max_depth は木モデルでのみ、LoRA rank は PEFT でのみ、warmup ratio はスケジュールを使うオプティマイザーでのみ設定します。最初の探索は広く浅く行い、有望な領域の周辺に絞り込みます。
Weights & Biases(W&B)スイープ YAML のひな形(sweep.yaml)
W&B Sweeps は、複数の分散エージェントにわたってハイパーパラメータ探索を実行します。
program: train.py
method: bayes # Search algorithm: bayes, random, grid
metric:
name: val_loss
goal: minimize
parameters:
learning_rate:
distribution: log_uniform_values
min: 1e-5
max: 1e-2
batch_size:
values: [16, 32, 64]
epochs:
value: 20
dropout:
distribution: uniform
min: 0.1
max: 0.5
optimizer:
values: ["adam", "adamw", "sgd"]
early_terminate:
type: hyperband
min_iter: 3
eta: 2
ASHA スケジューラーを使った Ray Tune の分散スイープ
Ray Tune を使うと、クラスター全体にスイープを簡単に分散し、大規模なハイパーパラメータ調整を管理できます。
from ray import tune
from ray.tune.schedulers import ASHAScheduler
def train_fn(config):
# Training routine pulling from config e.g., config["lr"]
for epoch in range(100):
# ... training step ...
val_loss = run_validation()
# Report intermediate score back to Ray
tune.report(loss=val_loss, epoch=epoch)
# Define Async Successive Halving (ASHA) scheduler
asha_scheduler = ASHAScheduler(
time_attr="epoch",
metric="loss",
mode="min",
max_t=100,
grace_period=5,
reduction_factor=2
)
# Run distributed sweep
# analysis = tune.run(
# train_fn,
# resources_per_trial={"cpu": 2, "gpu": 0.5}, # Run two trials per GPU
# config={
# "lr": tune.loguniform(1e-5, 1e-2),
# "batch_size": tune.choice([16, 32, 64])
# },
# num_samples=30,
# scheduler=asha_scheduler
# )
調整する価値のあるパラメータ
深層学習:
- 学習率、ウォームアップ、スケジューラー、オプティマイザー、重み減衰。
- バッチサイズまたは実効バッチサイズ、勾配蓄積。
- ドロップアウト、ラベル平滑化、データ拡張の強さ。
- アーキテクチャの幅/深さ、シーケンス長、画像解像度。
- 損失関数のパラメータ、クラス重み、焦点損失のガンマ。
- ファインチューニング用の PEFT rank/alpha/dropout と対象モジュール。
木/表形式モデル:
- 学習率、推定器/反復回数、最大深さ/葉の数。
- サブサンプリング、列のサンプリング、最小子サンプル数/重み。
- L1/L2 正則化、最小分割ゲイン。
- サポートされている場合のカテゴリ変数の処理と単調制約。
RAG と埋め込みシステム:
- チャンクサイズ/オーバーラップ、埋め込みモデル、top-k、ハイブリッド重み、リランカー、プロンプトテンプレート、コンテキスト予算、スコアしきい値。
早期停止とプルーニング
早期停止は計算資源の無駄を防ぎますが、早く性能が上がる構成に偏る可能性があります。patience と最小リソースしきい値を設定してください。ASHA と Hyperband には、単調な意味を持つ指標と比較可能な学習曲線が必要です。指標にノイズがある場合は、平滑化するか、複数回の評価を求めます。最終選定の前に、有望な構成は必ず予算を最後まで使って実行してください。
学習率ファインダー
学習率範囲テストを実行すると、ニューラルネットワークに適した学習率の範囲をすばやく見つけられます。短時間の実行で学習率を上げながら損失をプロットし、発散する値より低く、かつ多くの場合は最も急激に減少する点よりも低い値を選びます。その後、適切な学習を改めて実行してください。学習率ファインダーの結果は目安であり、最終的な実験結果ではありません。
再現性
各試行のパラメーター、乱数シード、コードのバージョン、データのバージョン、ハードウェア、依存関係、メトリクス、成果物、失敗理由をすべて記録してください。一意の試行 ID を使用してください。最良の設定だけでなく、上位 k 件の設定を保存してください。分散スイープでは、失敗またはプリエンプトされた試行が正しく記録され、再開した試行で結果が重複しないようにしてください。
結果の分析
スイープの後、パラメーターの重要度、平行座標プロット、メトリクスの分布、学習曲線を確認してください。不安定な領域、検証データへの過学習、無効な試行、相互作用に注意してください。未使用のテストセットまたは複数の乱数シードで、最良の設定を確認してください。改善幅がノイズの範囲内であれば、より単純または低コストなモデルを優先してください。
よくあるチューニングの誤り
- テストセットまたは公開リーダーボードでチューニングする。
- 試行回数が少ないのに、多くのパラメーターを探索する。
- 対数スケールのパラメーターに線形サンプリングを使用する。
- 不安定な領域を示す失敗試行を無視する。
- 前処理を通じて、ターゲットから派生した特徴量が AutoML に漏れるのを放置する。
- 再学習やテストでの確認をせずに、検証スコアが最良の設定を選ぶ。
- 異なるデータスナップショットや前処理コードを使った試行を比較する。
ソース
- Optuna ドキュメント:https://optuna.readthedocs.io/
- Ray Tune ドキュメント:https://docs.ray.io/en/latest/tune/
- FLAML ドキュメント:https://microsoft.github.io/FLAML/
- AutoGluon ドキュメント:https://auto.gluon.ai/
- scikit-learn のハイパーパラメータチューニングに関するドキュメント:https://scikit-learn.org/stable/modules/grid_search.html
- W&B Sweeps ドキュメント:https://docs.wandb.ai/guides/sweeps/