はじめに
機械学習モデルを作るにあたって、ハイパーパラメーター最適化(HPO)は初心者泣かせだとずっと思っていました。
- 「どういった探索手法を選べばいいの?」
- 「LightGBMの
num_leavesの探索範囲って 50〜200 でいいんだっけ?」 - 「そもそもどのパラメータをいじればええんや?」
こういった判断にはノウハウが必要で、自分には全然わかりません。
どうにかならんかなーと思っていたところ、HPOの自動化をモチベーションとしたLLM活用系論文をいくつか見たので自分も作ってみました。
数年前から流行ってるみたいですね…
結論
利用できるツールを増やしたり、プロンプトを工夫することで誰でも簡単にHPOができるようになりそうです。
一方でLLMの応答が安定しないため、探索の再現性が確保できないといった課題があります。
ソースコードはこちらに入れてあります。
記事投稿から変えるかもなので、リリースタグ(v1.0.0)のURLを貼っています。
同じようなものが他にあればコメントなどで教えてもらえると助かります!
作成したエージェント
今回は、LLM が監督エージェントとして振る舞い、以下の探索ツールを組み合わせながらハイパーパラメーターの最適化を進める Python ライブラリを作成しました。
| ツール | 概要 |
|---|---|
SobolSearchTool |
準ランダム探索(探索序盤で空間を均一にカバー) |
BayesianOptimizationTool |
Optuna TPE によるベイズ最適化(試行実績を活かして効率的に探索) |
ExpertAgentTool |
専門家 AI エージェントによる直接提案(試行履歴を分析して有望なパラメーターを提案) |
ChangeSearchSpaceTool |
探索空間の動的変更(有望な範囲に絞り込んだり、広げたりする) |
ユーザーが「どのツールを使うか」を指定する必要はありません。監督エージェントが試行ごとの結果を見ながら、最適なツールと試行回数を自律的に選択します。
最適化フロー
langgraph と langchain をベースにエージェント・ツール機構を実装しており、LLMにはGemini、GPT、Claudeを使用できます。
使用プロンプト
主に利用しているプロンプトは、ソースコード内のprompts.pyに記述されています。
そのほか細かなプロンプトはありますが、この辺がプロンプトエンジニアリングの対象かと思います。
使い方
LLM の設定
.env ファイルに API キーを設定するだけです。
LLM_API_KEY=AIza...
LLM_MODEL_NAME=gemini-1.5-pro
LLM_PROVIDER=google
LightGBM の例
たった数行で始められます。
import lightgbm as lgb
from sklearn.datasets import load_breast_cancer
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from hpo_agent import HPOAgent
# 1. データを用意
X, y = load_breast_cancer(return_X_y=True, as_frame=True)
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)
# 2. 評価関数を定義(大きいほど良いスコアを返す)
def eval_fn(params: dict) -> float:
model = lgb.LGBMClassifier(verbosity=-1, **params)
model.fit(X_train, y_train)
return float(accuracy_score(y_val, model.predict(X_val)))
# 3. HPOAgent を実行
agent = HPOAgent(eval_fn=eval_fn, n_trials=50)
result = agent.run()
# 4. 結果を確認
print(result.best_params) # 最良パラメーター
print(result.best_score) # 最良スコア
ポイント: eval_fn は params: dict を受け取り、スコアを返すだけの関数です。データのロードやモデルの訓練はすべてこの関数内に書きます。
PyTorch の場合も同じ形式
from hpo_agent import HPOAgent
def eval_fn(params: dict) -> float:
model = nn.Sequential(
nn.Linear(10, int(params["hidden_size"])),
nn.ReLU(),
nn.Linear(int(params["hidden_size"]), 1),
)
# ... 学習・評価ロジック ...
return -val_loss # 損失は符号反転してスコアに変換
# param_space を省略すると LLM が eval_fn のコードを読んで自動設計!
agent = HPOAgent(eval_fn=eval_fn, n_trials=20)
result = agent.run()
特徴的な機能
1. 探索空間の自動設計
param_space を省略すると、LLM が eval_fn のソースコードを読んで適切な探索空間を自動生成します。
# param_space 省略 → LLM が自動設計
agent = HPOAgent(eval_fn=eval_fn, n_trials=50)
もちろん手動指定も可能です。上限・下限を片方だけ指定して、もう一方を LLM に任せる部分指定もできます。
from hpo_agent import HPOAgent, ParamSpec, ParamSpace
custom_space = ParamSpace(specs=(
ParamSpec(name="num_leaves", type="int", low=50, high=200),
ParamSpec(name="learning_rate", type="float", low=1e-3, high=0.1, log=True),
ParamSpec(name="n_estimators", type="int", high=500), # 最小値は LLM が決定
))
agent = HPOAgent(eval_fn=eval_fn, n_trials=50, param_space=custom_space)
2. ドメイン知識をプロンプトで渡せる
prompts 引数でスーパーバイザー LLM に追加情報を渡せます。タスクの特性を伝えることで、より的確な探索戦略を引き出せます。
agent = HPOAgent(
eval_fn=eval_fn,
n_trials=50,
prompts={
"supervisor": (
"モデル: LGBMClassifier\n"
"タスク: 二値分類(Titanic 生存予測)\n"
"特徴量: 7 列(数値・カテゴリカル混在)\n"
"過学習が起きやすいため、正則化パラメーターを重視してください。"
),
}
)
3. 出力情報
agent.run() が返す HPOResult オブジェクトには以下が含まれています。
| フィールド | 内容 |
|---|---|
best_params |
最良パラメーターの辞書 |
best_score |
最良スコア |
trials_df |
全試行の履歴(pandas DataFrame) |
report |
Markdown 形式のレポート(AI 考察・ツール使用内訳・探索空間変更履歴など) |
trials_df の項目は以下のようになっています。
| 列 | 内容 |
|---|---|
| trial_id | 試行番号 |
| params | 提案パラメータのそれぞれの値 |
| score | スコア |
| tool_used | 使用したツール |
| timestamp | 試行日時 |
| eval_duration | モデル評価時間(秒) |
| algo_duration | アルゴリズム計算時間(秒) |
| reasoning | LLMによる提案理由 |
使用技術
| カテゴリ | 技術 |
|---|---|
| エージェント実装 |
langchain / langgraph
|
| ベイズ最適化 |
optuna(TPE サンプラー) |
| LLM | Gemini / GPT / Claude |
| スキーマ定義 | pydantic |
| 試行履歴管理 | pandas |
実際にやってみた
設定
例として、PINNs(Physics-Informed Neural Networks)によるBurgers方程式のサロゲートモデルのハイパーパラメーター最適化をやってみました。
PINNsやBurgers方程式の説明は割愛します…
学習のためパラメータを設定します。
探索パラメータや範囲については、監督エージェントに作らせても良いのですが、エポック数やネットワークを大きくしがちで時間がかかるので一部自分で決めています。
n_hidden_layersとlrは範囲を指定せず、n_neuronsは上限のみ、epochs_adamは範囲を指定しました。
eval_fnは学習と評価が入った関数です。
全部で30回の思考を行うように設定します。
promptsでPINNsのタスクであることを伝えています。
seedは各ツールで共有されるもので、LLMとは無関係です。
param_space = ParamSpace(specs=(
ParamSpec(name="n_hidden_layers", type="int"),
ParamSpec(name="n_neurons", type="int", high=40.0),
ParamSpec(name="lr", type="float"),
ParamSpec(name="epochs_adam", type="int", low=500, high=3_000),
))
agent = HPOAgent(
eval_fn=eval_fn,
n_trials=30,
param_space=param_space,
seed=42,
prompts={
"supervisor": (
"This is a Physics-Informed Neural Network (PINN) for solving "
"the 1D Burgers equation. The score is -rel_l2_error "
"(higher score = lower relative L2 error = better accuracy). "
"Prioritize moderate learning rates and sufficient epochs for "
"stable convergence."
),
},
)
result = agent.run()
結果
学習は以下のように進みました。
監督エージェントは、最初の10回はSobolによる準ランダム探索を使い、その後の10回でベイズ最適化で探索を進めています。
21~25回までは専門家エージェントによる直接提案で、改善が行われています。
最後に5回のベイズ最適化を行い、30回目でベストスコアを更新しています。
ベストスコアを記録したときのパラメータは以下になります。
{
'epochs_adam': 2789,
'n_hidden_layers': 7,
'n_neurons': 17,
'lr': 0.0031316343995253524
}
このときのBurgers方程式の解は以下になります。
右が予測結果、真ん中が正解、左が誤差のヒートマップです。
うまく予測できていそうです。
ターミナル出力と最終レポート
学習中のターミナル出力(一部削除/改変)と最終レポートは以下のようになります。
長いのでトグルにしています。
監督エージェントがツールを選んだ理由や、専門家エージェントが提案したパラメータの理由がわかります。
ターミナル出力
=== HPO-Agent: PINN Hyperparameter Optimization ===
nu = 0.003183 (0.01 / pi)
Loading reference data ...
x: (256, 1), t: (100, 1), usol: (256, 100)
Starting HPO-Agent optimization (n_trials=25) ...
Env vars required: LLM_API_KEY, LLM_MODEL_NAME, LLM_PROVIDER
Supervisor agent completes partial search space.
[HPOAgent] Completed partial param space by LLM (model=function, n_trials=30):
- epochs_adam: int, [500, 3000], linear
- n_hidden_layers: int, [2.0, 8.0], linear
- n_neurons: int, [10.0, 40.0], linear
- lr: float, [0.0001, 0.01], log
Supervisor selecting next tool...
Supervisor's Rationale for Tool Selection
Supervisor selected tool 'sobol_search' with 10 planned trial(s).
Executing tool 'sobol_search': 10 trial(s) (requested: 10, remaining: 30).
初期フェーズとして、探索空間全体を均一にカバーし、後のベイズ最適化のための基礎データを収集するために sobol_search を10回実行します。PINNは初期値や学習率に敏感であるため、まずは広範囲の傾向を把握することが重要です。
[sobol_search] trial=0 | score=-0.527937 | best=-0.527937 | eval=30.76s | params={'epochs_adam': 1578, 'n_hidden_layers': 7, 'n_neurons': 34, 'lr': 0.0001279126125143666}
[sobol_search] trial=1 | score=-0.574802 | best=-0.527937 | eval=8.70s | params={'epochs_adam': 1903, 'n_hidden_layers': 3, 'n_neurons': 15, 'lr': 0.0010480399125544814}
[sobol_search] trial=2 | score=-0.450782 | best=-0.450782 | eval=33.13s | params={'epochs_adam': 2581, 'n_hidden_layers': 6, 'n_neurons': 29, 'lr': 0.00036229070897707624}
[sobol_search] trial=3 | score=-0.413532 | best=-0.413532 | eval=7.05s | params={'epochs_adam': 1017, 'n_hidden_layers': 4, 'n_neurons': 18, 'lr': 0.0037002425994033597}
[sobol_search] trial=4 | score=-0.512968 | best=-0.413532 | eval=4.71s | params={'epochs_adam': 547, 'n_hidden_layers': 6, 'n_neurons': 11, 'lr': 0.006486687035055587}
[sobol_search] trial=5 | score=-0.558908 | best=-0.413532 | eval=30.74s | params={'epochs_adam': 2738, 'n_hidden_layers': 4, 'n_neurons': 37, 'lr': 0.0006584201727413727}
[sobol_search] trial=6 | score=-0.251368 | best=-0.251368 | eval=36.10s | params={'epochs_adam': 2370, 'n_hidden_layers': 8, 'n_neurons': 23, 'lr': 0.002279895314238949}
[sobol_search] trial=7 | score=-0.675513 | best=-0.251368 | eval=5.80s | params={'epochs_adam': 1422, 'n_hidden_layers': 2, 'n_neurons': 26, 'lr': 0.0001873300003611736}
[sobol_search] trial=8 | score=-0.502684 | best=-0.251368 | eval=13.16s | params={'epochs_adam': 1141, 'n_hidden_layers': 6, 'n_neurons': 24, 'lr': 0.0009812635985267794}
[sobol_search] trial=9 | score=-0.509717 | best=-0.251368 | eval=17.18s | params={'epochs_adam': 2066, 'n_hidden_layers': 4, 'n_neurons': 27, 'lr': 0.007742165314722264}
Tool 'sobol_search' completed (10 trials). Best score: -0.251368
Supervisor selecting next tool...
Supervisor's Rationale for Tool Selection
Supervisor selected tool 'bayesian_optimization' with 10 planned trial(s).
Executing tool 'bayesian_optimization': 10 trial(s) (requested: 10, remaining: 20).
10件の試行データが集まり、学習率 0.002 付近で比較的良好なスコアが得られる傾向が見えてきました。
次は bayesian_optimization を10回実行し、これまでの結果を活用して有望なパラメータ領域を重点的に探索します。
ベイズ最適化により、現在の最良値周辺の微調整と、まだ探索されていない有望な組み合わせの発見を両立させます。
[bayesian_optimization] trial=0 | score=-0.107951 | best=-0.107951 | eval=32.64s | params={'epochs_adam': 2320, 'n_hidden_layers': 8, 'n_neurons': 20, 'lr': 0.002282509429219964}
[bayesian_optimization] trial=1 | score=-0.180424 | best=-0.107951 | eval=32.95s | params={'epochs_adam': 2350, 'n_hidden_layers': 8, 'n_neurons': 19, 'lr': 0.002233057090202625}
[bayesian_optimization] trial=2 | score=-0.064436 | best=-0.064436 | eval=40.27s | params={'epochs_adam': 2890, 'n_hidden_layers': 8, 'n_neurons': 19, 'lr': 0.0022716662922529834}
[bayesian_optimization] trial=3 | score=-0.069988 | best=-0.064436 | eval=31.61s | params={'epochs_adam': 2929, 'n_hidden_layers': 8, 'n_neurons': 11, 'lr': 0.0021579404819597617}
[bayesian_optimization] trial=4 | score=-0.239141 | best=-0.064436 | eval=26.63s | params={'epochs_adam': 2987, 'n_hidden_layers': 7, 'n_neurons': 10, 'lr': 0.0037203386701747114}
[bayesian_optimization] trial=5 | score=-0.300300 | best=-0.064436 | eval=29.09s | params={'epochs_adam': 2926, 'n_hidden_layers': 7, 'n_neurons': 14, 'lr': 0.0009943924651889227}
[bayesian_optimization] trial=6 | score=-0.220195 | best=-0.064436 | eval=19.66s | params={'epochs_adam': 2662, 'n_hidden_layers': 5, 'n_neurons': 15, 'lr': 0.004196830037451299}
[bayesian_optimization] trial=7 | score=-0.237322 | best=-0.064436 | eval=24.49s | params={'epochs_adam': 2123, 'n_hidden_layers': 8, 'n_neurons': 13, 'lr': 0.0018317502974918606}
[bayesian_optimization] trial=8 | score=-0.272981 | best=-0.064436 | eval=43.35s | params={'epochs_adam': 2712, 'n_hidden_layers': 7, 'n_neurons': 31, 'lr': 0.0004780174832019945}
[bayesian_optimization] trial=9 | score=-0.365176 | best=-0.064436 | eval=28.51s | params={'epochs_adam': 2966, 'n_hidden_layers': 5, 'n_neurons': 21, 'lr': 0.0014196910879218244}
Tool 'bayesian_optimization' completed (10 trials). Best score: -0.064436
Supervisor selecting next tool...
Supervisor's Rationale for Tool Selection
Supervisor selected tool 'expert_agent' with 5 planned trial(s).
Executing tool 'expert_agent': 5 trial(s) (requested: 5, remaining: 10).
AFC is enabled with max remote calls: 10.
[expert_agent] Trial 20: スコア上位の試行(Trial 12, 13)はいずれも n_hidden_layers が最大値の 8 であり、epochs_adam も 2900 前後の高い値に集中している。学習率は 0.0022 付近で安定した成果を出しているため、層数を 8 に固定しつつ、ニューロン数を 16 前後に調整してさらなる精度向上を狙う。
result: trial=0 | score=-0.048018 | best=-0.048018 | eval=33.14s | params={'epochs_adam': 2980, 'n_hidden_layers': 8, 'n_neurons': 16, 'lr': 0.00235}
[expert_agent] Trial 21: スコア上位の試行は一貫して n_hidden_layers が 8 であり、epochs_adam も上限に近い。lr は 0.0023 前後で最も良い結果が出ているため、この周辺を維持しつつ、n_neurons を 18 に設定して Trial 0 (16) と Trial 12 (19) の間を探索する。
result: trial=1 | score=-0.270404 | best=-0.048018 | eval=40.38s | params={'epochs_adam': 2995, 'n_hidden_layers': 8, 'n_neurons': 18, 'lr': 0.0024}
[expert_agent] Trial 22: スコア上位の試行は一貫して n_hidden_layers=8 かつ epochs_adam が上限付近、lr が 0.0022 前後に集中している。Trial 0 (n_neurons=16) と Trial 13 (n_neurons=11) が共に良好な結果を示しているため、その中間である 14 を選択し、epochs_adam を上限の 3000 に設定して精度向上を図る。
result: trial=2 | score=-0.069290 | best=-0.048018 | eval=34.79s | params={'epochs_adam': 3000, 'n_hidden_layers': 8, 'n_neurons': 14, 'lr': 0.0023}
[expert_agent] Trial 23: スコア上位の試行は一貫して n_hidden_layers=8、epochs_adam が上限付近、lr が 0.0023 前後に集中している。最良の Trial 0 (n_neurons=16) と良好な Trial 2 (n_neurons=14) の間である 15 を選択し、学習率をその中間に設定することで、さらなる精度の向上を狙う。
result: trial=3 | score=-0.066869 | best=-0.048018 | eval=36.01s | params={'epochs_adam': 2990, 'n_hidden_layers': 8, 'n_neurons': 15, 'lr': 0.00232}
[expert_agent] Trial 24: スコア上位の試行は一貫して n_hidden_layers=8、epochs_adam が上限付近、lr が 0.0023 前後に集中している。最良の Trial 0 (n_neurons=16) と良好な Trial 12 (n_neurons=19) の間に位置し、かつ Trial 1 (n_neurons=18) でスコアが低下した境界を特定するため、未探索の n_neurons=17 を検証する。
result: trial=4 | score=-0.086841 | best=-0.048018 | eval=40.77s | params={'epochs_adam': 2995, 'n_hidden_layers': 8, 'n_neurons': 17, 'lr': 0.00233}
Tool 'expert_agent' completed (5 trials). Best score: -0.048018
Supervisor selecting next tool...
Supervisor's Rationale for Tool Selection
Supervisor selected tool 'bayesian_optimization' with 5 planned trial(s).
Executing tool 'bayesian_optimization': 5 trial(s) (requested: 5, remaining: 5).
[bayesian_optimization] trial=0 | score=-0.097002 | best=-0.048018 | eval=33.84s | params={'epochs_adam': 2524, 'n_hidden_layers': 7, 'n_neurons': 22, 'lr': 0.0055453373420050545}
[bayesian_optimization] trial=1 | score=-0.370480 | best=-0.048018 | eval=23.59s | params={'epochs_adam': 2767, 'n_hidden_layers': 6, 'n_neurons': 16, 'lr': 0.001305438404228691}
[bayesian_optimization] trial=2 | score=-0.190091 | best=-0.048018 | eval=32.45s | params={'epochs_adam': 2492, 'n_hidden_layers': 7, 'n_neurons': 21, 'lr': 0.004190827295644475}
[bayesian_optimization] trial=3 | score=-0.300654 | best=-0.048018 | eval=20.18s | params={'epochs_adam': 2136, 'n_hidden_layers': 7, 'n_neurons': 12, 'lr': 0.0007373590150643253}
[bayesian_optimization] trial=4 | score=-0.032326 | best=-0.032326 | eval=32.77s | params={'epochs_adam': 2789, 'n_hidden_layers': 7, 'n_neurons': 17, 'lr': 0.0031316343995253524}
Tool 'bayesian_optimization' completed (5 trials). Best score: -0.032326
AFC is enabled with max remote calls: 10.
Best params: {'epochs_adam': 2789, 'n_hidden_layers': 7, 'n_neurons': 17, 'lr': 0.0031316343995253524}
Best score: -3.2326e-02 (= -rel_l2_error)
Best rel L2: 3.2326e-02
Report saved: path/to/example/hpo_agent_output/hpo_agent_report.md
Trials CSV: path/to/example/hpo_agent_output/hpo_agent_trials.csv
Generating plots ...
Saved: path/to/example/hpo_agent_output/hpo_agent_convergence.png
Saved: path/to/example/hpo_agent_output/hpo_agent_objective_scatter.png
Saved: path/to/example/hpo_agent_output/hpo_agent_parallel_coords.png
Re-training with best params: n_hidden_layers=7, n_neurons=17, lr=3.13e-03, epochs_adam=2789
Saved: path/to/example/hpo_agent_output/hpo_agent_best_solution_heatmap.png
Done. Outputs saved to path/to/example/hpo_agent_output/
最終レポート
HPO 最終レポート
メタ情報
- 実行日時: 2026-03-31 20:37:08
- シード: 42
- 現時点の試行回数: 30
現時点の最良結果
- スコア: -0.032326
- パラメータ: {'epochs_adam': 2789, 'n_hidden_layers': 7, 'n_neurons': 17, 'lr': 0.0031316343995253524}
スコア推移(直近10件)
| trial_id | score | tool_used |
|---|---|---|
| 20 | -0.048018 | expert_agent |
| 21 | -0.270404 | expert_agent |
| 22 | -0.069290 | expert_agent |
| 23 | -0.066869 | expert_agent |
| 24 | -0.086841 | expert_agent |
| 25 | -0.097002 | bayesian_optimization |
| 26 | -0.370480 | bayesian_optimization |
| 27 | -0.190091 | bayesian_optimization |
| 28 | -0.300654 | bayesian_optimization |
| 29 | -0.032326 | bayesian_optimization |
ツール使用内訳
| ツール名 | 使用回数 |
|---|---|
| sobol_search | 10 |
| bayesian_optimization | 15 |
| expert_agent | 5 |
LLM が自動生成したパラメータ空間
param_space が未指定のため、LLM がモデル情報をもとに以下の探索空間を設計しました。
- epochs_adam: int, [500, 3000], linear スケール
- n_hidden_layers: int, [2.0, 8.0], linear スケール
- n_neurons: int, [10.0, 40.0], linear スケール
- lr: float, [0.0001, 0.01], log スケール
AI 判断理由の記録
-
Trial 0 (sobol_search): 初期フェーズとして、探索空間全体を均一にカバーし、後のベイズ最適化のための基礎データを収集するために
sobol_searchを10回実行します。PINNは初期値や学習率に敏感であるため、まずは広範囲の傾向を把握することが重要です。 -
Trial 1 (sobol_search): 初期フェーズとして、探索空間全体を均一にカバーし、後のベイズ最適化のための基礎データを収集するために
sobol_searchを10回実行します。PINNは初期値や学習率に敏感であるため、まずは広範囲の傾向を把握することが重要です。 -
Trial 2 (sobol_search): 初期フェーズとして、探索空間全体を均一にカバーし、後のベイズ最適化のための基礎データを収集するために
sobol_searchを10回実行します。PINNは初期値や学習率に敏感であるため、まずは広範囲の傾向を把握することが重要です。 -
Trial 3 (sobol_search): 初期フェーズとして、探索空間全体を均一にカバーし、後のベイズ最適化のための基礎データを収集するために
sobol_searchを10回実行します。PINNは初期値や学習率に敏感であるため、まずは広範囲の傾向を把握することが重要です。 -
Trial 4 (sobol_search): 初期フェーズとして、探索空間全体を均一にカバーし、後のベイズ最適化のための基礎データを収集するために
sobol_searchを10回実行します。PINNは初期値や学習率に敏感であるため、まずは広範囲の傾向を把握することが重要です。 -
Trial 5 (sobol_search): 初期フェーズとして、探索空間全体を均一にカバーし、後のベイズ最適化のための基礎データを収集するために
sobol_searchを10回実行します。PINNは初期値や学習率に敏感であるため、まずは広範囲の傾向を把握することが重要です。 -
Trial 6 (sobol_search): 初期フェーズとして、探索空間全体を均一にカバーし、後のベイズ最適化のための基礎データを収集するために
sobol_searchを10回実行します。PINNは初期値や学習率に敏感であるため、まずは広範囲の傾向を把握することが重要です。 -
Trial 7 (sobol_search): 初期フェーズとして、探索空間全体を均一にカバーし、後のベイズ最適化のための基礎データを収集するために
sobol_searchを10回実行します。PINNは初期値や学習率に敏感であるため、まずは広範囲の傾向を把握することが重要です。 -
Trial 8 (sobol_search): 初期フェーズとして、探索空間全体を均一にカバーし、後のベイズ最適化のための基礎データを収集するために
sobol_searchを10回実行します。PINNは初期値や学習率に敏感であるため、まずは広範囲の傾向を把握することが重要です。 -
Trial 9 (sobol_search): 初期フェーズとして、探索空間全体を均一にカバーし、後のベイズ最適化のための基礎データを収集するために
sobol_searchを10回実行します。PINNは初期値や学習率に敏感であるため、まずは広範囲の傾向を把握することが重要です。 -
Trial 10 (bayesian_optimization): 10件の試行データが集まり、学習率 0.002 付近で比較的良好なスコアが得られる傾向が見えてきました。
次は bayesian_optimization を10回実行し、これまでの結果を活用して有望なパラメータ領域を重点的に探索します。
ベイズ最適化により、現在の最良値周辺の微調整と、まだ探索されていない有望な組み合わせの発見を両立させます。 -
Trial 11 (bayesian_optimization): 10件の試行データが集まり、学習率 0.002 付近で比較的良好なスコアが得られる傾向が見えてきました。
次は bayesian_optimization を10回実行し、これまでの結果を活用して有望なパラメータ領域を重点的に探索します。
ベイズ最適化により、現在の最良値周辺の微調整と、まだ探索されていない有望な組み合わせの発見を両立させます。 -
Trial 12 (bayesian_optimization): 10件の試行データが集まり、学習率 0.002 付近で比較的良好なスコアが得られる傾向が見えてきました。
次は bayesian_optimization を10回実行し、これまでの結果を活用して有望なパラメータ領域を重点的に探索します。
ベイズ最適化により、現在の最良値周辺の微調整と、まだ探索されていない有望な組み合わせの発見を両立させます。 -
Trial 13 (bayesian_optimization): 10件の試行データが集まり、学習率 0.002 付近で比較的良好なスコアが得られる傾向が見えてきました。
次は bayesian_optimization を10回実行し、これまでの結果を活用して有望なパラメータ領域を重点的に探索します。
ベイズ最適化により、現在の最良値周辺の微調整と、まだ探索されていない有望な組み合わせの発見を両立させます。 -
Trial 14 (bayesian_optimization): 10件の試行データが集まり、学習率 0.002 付近で比較的良好なスコアが得られる傾向が見えてきました。
次は bayesian_optimization を10回実行し、これまでの結果を活用して有望なパラメータ領域を重点的に探索します。
ベイズ最適化により、現在の最良値周辺の微調整と、まだ探索されていない有望な組み合わせの発見を両立させます。 -
Trial 15 (bayesian_optimization): 10件の試行データが集まり、学習率 0.002 付近で比較的良好なスコアが得られる傾向が見えてきました。
次は bayesian_optimization を10回実行し、これまでの結果を活用して有望なパラメータ領域を重点的に探索します。
ベイズ最適化により、現在の最良値周辺の微調整と、まだ探索されていない有望な組み合わせの発見を両立させます。 -
Trial 16 (bayesian_optimization): 10件の試行データが集まり、学習率 0.002 付近で比較的良好なスコアが得られる傾向が見えてきました。
次は bayesian_optimization を10回実行し、これまでの結果を活用して有望なパラメータ領域を重点的に探索します。
ベイズ最適化により、現在の最良値周辺の微調整と、まだ探索されていない有望な組み合わせの発見を両立させます。 -
Trial 17 (bayesian_optimization): 10件の試行データが集まり、学習率 0.002 付近で比較的良好なスコアが得られる傾向が見えてきました。
次は bayesian_optimization を10回実行し、これまでの結果を活用して有望なパラメータ領域を重点的に探索します。
ベイズ最適化により、現在の最良値周辺の微調整と、まだ探索されていない有望な組み合わせの発見を両立させます。 -
Trial 18 (bayesian_optimization): 10件の試行データが集まり、学習率 0.002 付近で比較的良好なスコアが得られる傾向が見えてきました。
次は bayesian_optimization を10回実行し、これまでの結果を活用して有望なパラメータ領域を重点的に探索します。
ベイズ最適化により、現在の最良値周辺の微調整と、まだ探索されていない有望な組み合わせの発見を両立させます。 -
Trial 19 (bayesian_optimization): 10件の試行データが集まり、学習率 0.002 付近で比較的良好なスコアが得られる傾向が見えてきました。
次は bayesian_optimization を10回実行し、これまでの結果を活用して有望なパラメータ領域を重点的に探索します。
ベイズ最適化により、現在の最良値周辺の微調整と、まだ探索されていない有望な組み合わせの発見を両立させます。 - Trial 20 (expert_agent): スコア上位の試行(Trial 12, 13)はいずれも n_hidden_layers が最大値の 8 であり、epochs_adam も 2900 前後の高い値に集中している。学習率は 0.0022 付近で安定した成果を出しているため、層数を 8 に固定しつつ、ニューロン数を 16 前後に調整してさらなる精度向上を狙う。
- Trial 21 (expert_agent): スコア上位の試行は一貫して n_hidden_layers が 8 であり、epochs_adam も上限に近い。lr は 0.0023 前後で最も良い結果が出ているため、この周辺を維持しつつ、n_neurons を 18 に設定して Trial 0 (16) と Trial 12 (19) の間を探索する。
- Trial 22 (expert_agent): スコア上位の試行は一貫して n_hidden_layers=8 かつ epochs_adam が上限付近、lr が 0.0022 前後に集中している。Trial 0 (n_neurons=16) と Trial 13 (n_neurons=11) が共に良好な結果を示しているため、その中間である 14 を選択し、epochs_adam を上限の 3000 に設定して精度向上を図る。
- Trial 23 (expert_agent): スコア上位の試行は一貫して n_hidden_layers=8、epochs_adam が上限付近、lr が 0.0023 前後に集中している。最良の Trial 0 (n_neurons=16) と良好な Trial 2 (n_neurons=14) の間である 15 を選択し、学習率をその中間に設定することで、さらなる精度の向上を狙う。
- Trial 24 (expert_agent): スコア上位の試行は一貫して n_hidden_layers=8、epochs_adam が上限付近、lr が 0.0023 前後に集中している。最良の Trial 0 (n_neurons=16) と良好な Trial 12 (n_neurons=19) の間に位置し、かつ Trial 1 (n_neurons=18) でスコアが低下した境界を特定するため、未探索の n_neurons=17 を検証する。
全試行の時間サマリー
- 総最適化時間: 1154.7379 秒
ツール別平均
| ツール名 | 平均モデル評価時間(秒) | 平均アルゴリズム計算時間(秒) |
|---|---|---|
| bayesian_optimization | 30.1351 | 0.0025 |
| expert_agent | 37.0179 | 66.0277 |
| sobol_search | 18.7333 | 0.0112 |
AI考察
機械学習の専門家として、今回のハイパーパラメータ最適化(HPO)の結果を分析し、今後のモデル改善に向けた考察を述べます。
1. 最適化の全体傾向
今回の30回の試行を通じて、スコアは最終盤の Trial 29 で大幅な改善(-0.032326)を見せました。探索のプロセスを振り返ると、以下の3つのフェーズが機能していたことがわかります。
-
広域探索期 (Trial 0-9):
sobol_searchにより、学習率 $10^{-3}$ 前後が有望であるという基礎データを収集。 -
構造の絞り込み期 (Trial 20-24):
expert_agentが「層数は多いほうが良い(8層)」という仮説を立て、ニューロン数を14〜18の範囲で微調整。これにより、モデルの複雑さと精度の相関を特定。 -
最終調整期 (Trial 25-29):
bayesian_optimizationが、Expert Agentが得た知見(深い層と少なめのニューロン数)をさらに洗練させ、Trial 29 で最良値を更新。
2. 結果の解釈とパラメータの感度
最良パラメータ(epochs_adam: 2789, n_hidden_layers: 7, n_neurons: 17, lr: 0.00313)から、本タスクにおけるモデルの特性が以下のように推察されます。
-
ネットワークの深さと幅:
n_hidden_layersが 7、n_neuronsが 17 という結果は、**「横に広いネットワークよりも、縦に深いネットワーク」**が PINN(物理情報ニューラルネットワーク)としての表現力を高めるのに有効であることを示唆しています。ニューロン数が比較的少ないのは、過学習を抑制しつつ物理法則の制約を効率よく学習できているためと考えられます。 - 学習率 (lr): 当初有望視されていた 0.002 付近から、最終的には 0.0031 まで引き上げられました。これは、深いネットワークにおいて勾配消失を避けつつ、収束速度を確保するためのバランス点であると解釈できます。
- 学習回数 (epochs_adam): 設定範囲の上限(3000)に近い 2789 で最良値が出ています。これは、現在の学習設定ではまだ収束しきっていない可能性を示しています。
3. 改善提案
さらなる精度向上に向け、以下のステップを推奨します。
-
探索空間の上方修正:
-
epochs_adamが上限付近に集中しているため、範囲を[3000, 10000]程度まで拡張し、十分な収束時間を確保すべきです。 -
n_hidden_layersについても、8層付近でスコアが安定しているため、[6, 12]程度まで広げ、より深い構造の可能性を探る価値があります。
-
-
学習率スケジューラの導入:
- 現在は固定の学習率で探索していますが、Adamによる学習の後半で学習率を減衰させる(Learning Rate Decay)手法を導入することで、最終的な解の安定性を高められる可能性があります。
-
ニューロン数の再定義:
-
n_neuronsが 17 前後で良好な結果が出ているため、この付近をより細かく探索するか、あるいは層ごとにニューロン数を変える(ボトルネック構造など)の検討も有効です。
-
-
計算リソースの最適化:
-
expert_agentのアルゴリズム計算時間が平均 66秒と、他の手法に比べて非常に長くなっています。試行回数を増やす場合は、ベイズ最適化をメインに据え、Expert Agent は要所での「方針転換」に限定して使用するのが効率的です。
-
まとめ
hpo-agent を使うと、
- 探索戦略の選択(準ランダム→ベイズ最適化→専門家 AI の組み合わせ)を LLM が自動で判断
- 探索空間の設計を LLM に任せることも、自分で手動指定することも可能
- 探索空間を動的に絞り込むことで、より効率的な探索が可能
というメリットを得ながら、ユーザーは eval_fn を書くだけで HPO が完結します。
もっと工夫すれば現場で使えるものになるかも…


