fix(ml): improve TPE exploitation with Scott bandwidth, best-trial injection

- Replace Silverman's bandwidth (h = 1.06σn^(-1/5)) with Scott's rule
  (h = 0.7σn^(-1/(d+4))) for tighter kernels in high-D parameter spaces
- Add best-trial injection: always evaluate EI at best known point plus
  5 small perturbations (±5%), preventing optimizer from forgetting peaks
- Scale n_candidates dynamically: max(256, 8*n_dims) instead of fixed 100
- Reduce gamma from 0.25 to 0.15 when trials < 50 for tighter exploitation
- Wire model_name through PSO/TPE paths for per-trial Prometheus metrics

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
jgrusewski
2026-03-05 23:54:30 +01:00
parent 08a927639e
commit f2938b19e8
4 changed files with 130 additions and 18 deletions

View File

@@ -136,6 +136,7 @@ fn run_tft_hyperopt(args: &Args) -> Result<Value> {
.max_trials(args.trials)
.n_initial(args.n_initial)
.seed(args.seed)
.model_name("tft")
.build();
training_metrics::set_hyperopt_trial("tft", 0.0, args.trials as f64);
@@ -195,6 +196,7 @@ fn run_mamba2_hyperopt(args: &Args) -> Result<Value> {
.max_trials(args.trials)
.n_initial(args.n_initial)
.seed(args.seed)
.model_name("mamba2")
.build();
training_metrics::set_hyperopt_trial("mamba2", 0.0, args.trials as f64);
@@ -255,6 +257,7 @@ fn run_liquid_hyperopt(args: &Args) -> Result<Value> {
.max_trials(args.trials)
.n_initial(args.n_initial)
.seed(args.seed)
.model_name("liquid")
.build();
training_metrics::set_hyperopt_trial("liquid", 0.0, args.trials as f64);
@@ -315,6 +318,7 @@ fn run_tggn_hyperopt(args: &Args) -> Result<Value> {
.max_trials(args.trials)
.n_initial(args.n_initial)
.seed(args.seed)
.model_name("tggn")
.build();
training_metrics::set_hyperopt_trial("tggn", 0.0, args.trials as f64);
@@ -375,6 +379,7 @@ fn run_tlob_hyperopt(args: &Args) -> Result<Value> {
.max_trials(args.trials)
.n_initial(args.n_initial)
.seed(args.seed)
.model_name("tlob")
.build();
training_metrics::set_hyperopt_trial("tlob", 0.0, args.trials as f64);
@@ -435,6 +440,7 @@ fn run_kan_hyperopt(args: &Args) -> Result<Value> {
.max_trials(args.trials)
.n_initial(args.n_initial)
.seed(args.seed)
.model_name("kan")
.build();
training_metrics::set_hyperopt_trial("kan", 0.0, args.trials as f64);
@@ -495,6 +501,7 @@ fn run_xlstm_hyperopt(args: &Args) -> Result<Value> {
.max_trials(args.trials)
.n_initial(args.n_initial)
.seed(args.seed)
.model_name("xlstm")
.build();
training_metrics::set_hyperopt_trial("xlstm", 0.0, args.trials as f64);
@@ -555,6 +562,7 @@ fn run_diffusion_hyperopt(args: &Args) -> Result<Value> {
.max_trials(args.trials)
.n_initial(args.n_initial)
.seed(args.seed)
.model_name("diffusion")
.build();
training_metrics::set_hyperopt_trial("diffusion", 0.0, args.trials as f64);