mcpField
M
ml-hyperparameter-tuning

ml-hyperparameter-tuning

github.com/josiahsiegelデータ・データベース5956 回インストール19 週間前に更新
リポジトリ

ml-hyperparameter-tuning について

機械学習のハイパーパラメーター探索を設計・実行するためのガイドです。ベースラインと固定した評価手順を整えたうえで、探索方法や結果の検証を扱います。

主な機能

  1. 01グリッド・ランダム・ベイズ探索の比較
  2. 02連続・離散・条件付き空間の設計
  3. 03プルーニングと早期停止の活用
  4. 04試行の記録と探索結果の分析

活用シーン

  1. 01モデルに合う探索方法の選択
  2. 02有望でない試行の計算量削減
  3. 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 に漏れるのを放置する。
  • 再学習やテストでの確認をせずに、検証スコアが最良の設定を選ぶ。
  • 異なるデータスナップショットや前処理コードを使った試行を比較する。

ソース

コメント