Optuna おぷちゅな
Optunaハイパーパラメータ最適化自動機械学習ベイズ最適化TPEPreferred Networks
Optunaについて教えて
Optunaとは
Optuna は、日本のAIスタートアップPreferred Networks(PFN) が2019年に公開したオープンソースのハイパーパラメータ自動最適化フレームワークです。現在はGitHubで10,000スター以上を獲得し、世界中の機械学習エンジニアに使用されています。
Optunaの最大の特徴は「Define-by-Run」スタイル(動的計算グラフと同様に探索空間を実行時に定義できる)で、条件分岐を含む複雑な探索空間でも自然なPythonコードで記述できます。
内部ではTPE(Tree-structured Parzen Estimator) というベイズ最適化の一種を使い、試行結果を活用して次に試す有望なパラメータを賢く選びます。試行ごとに有益な情報を蓄積し、回を重ねるほど効率的な探索ができるようになります。
Optunaの主要機能
| 機能 | 内容 |
|---|---|
| 多様なサンプラー | TPE・CMA-ES・ランダム・グリッドなど選択可能 |
| 早期終了(Pruning) | 見込みのない試行を途中で打ち切り効率化 |
| 分散最適化 | 複数マシンで並列試行 |
| 可視化 | 試行の重要度・最適化の推移をダッシュボードで確認 |
| 統合 | PyTorch・TensorFlow・scikit-learnなど多数のMLフレームワークに対応 |
import optuna
import torch
import torch.nn as nn
def objective(trial):
# ハイパーパラメータの探索空間を定義
lr = trial.suggest_float("lr", 1e-5, 1e-2, log=True)
n_layers = trial.suggest_int("n_layers", 1, 5)
dropout = trial.suggest_float("dropout", 0.1, 0.5)
optimizer_name = trial.suggest_categorical("optimizer", ["Adam", "SGD"])
# モデル構築・学習
model = build_model(n_layers, dropout)
optimizer = getattr(torch.optim, optimizer_name)(model.parameters(), lr=lr)
val_loss = train(model, optimizer)
return val_loss # 最小化する目標を返す
# 最適化実行
study = optuna.create_study(direction="minimize")
study.optimize(objective, n_trials=200, timeout=3600) # 200回 or 1時間
print(f"最良スコア: {study.best_value:.4f}")
print(f"最良パラメータ: {study.best_params}")
歴史と背景
- 2019年:Preferred Networks(PFN)がOptunaをOSSとして公開
- 2020年:論文「Optuna: A Next-generation Hyperparameter Optimization Framework」発表
- 2021年以降:Kaggleのコンペで多数使用。企業システムへの組み込みも増加
- 現在:PyTorch・scikit-learn・XGBoost・LightGBM・Transformersとの公式統合が揃い、デファクトスタンダード化
他のHPOツールとの比較
| ツール | 特徴 | 難易度 |
|---|---|---|
| Optuna | 使いやすい・高機能・日本語情報豊富 | 低 |
| Ray Tune | 分散・大規模に強い | 中 |
| Hyperopt | TPEの元祖。Optunaより古い | 中 |
| Ax / BoTorch | Meta製。複雑な探索空間に対応 | 高 |
| NNI(Microsoft) | Azure連携。GUI付き | 中 |
関連用語
- ハイパーパラメータチューニング — Optunaが自動化する作業
- ベイズ最適化 — OptunaのTPEが使う数学的基盤
- ハイパーパラメータ — Optunaで最適化する対象
- MLOps — Optunaを組み込んだ機械学習の運用プロセス