Hyperparameteroptimering med Optuna

Djup förstärkningsinlärning i Python

Timothée Carayol

Principal Machine Learning Engineer, Komment

Vad är hyperparametrar

 

 

  • Stort antal hyperparametrar i DRL-algoritmer
  • Kan ha stor inverkan på prestanda
  • Sökomplexiteten ökar med antalet hyperparametrar

 

Exempel
Diskonteringsrate
PPO: klippnings-epsilon, entropibonus
Experience replay: buffertstorlek, batchstorlek
Avtagande epsilon-girighetsschema
Fasta Q-mål: $\tau$
Inlärningshastighet
Antal lager, noder per lager...
Djup förstärkningsinlärning i Python

Hur man väljer hyperparametervärden

 

Mål: genomsnittlig kumulativ belöning

Tekniker för hyperparametersökning:

  • Trial and error för hand
  • Rutnätssökning
  • Slumpmässig sökning
  • Dedikerade algoritmer

En stor mekanisk maskin med dussintals rattar och mätare

Djup förstärkningsinlärning i Python

Optunas logotyp

 

Optunas arbetsflöde:

  • Definiera en målfunktion
  • Skapa en Optuna study
  • Låt Optuna iterera över körningar

 

 

import optuna

def objective(trial): ...
study = optuna.create_study()
study.optimize(objective, n_trials=100)
study.best_params
{'learning_rate': 0.001292481, 'batch_size': 8}
Djup förstärkningsinlärning i Python

Specificera målfunktionen

 

I målfunktionen:

  • Definiera de hyperparametrar du vill optimera
  • Definiera det/de mätvärden som ska optimeras

Full flexibilitet vid hyperparameterspecifikation:

  • float
  • integer
  • kategorisk

 

def objective(trial: optuna.trial.Trial):

# Hyperparameters x and y between -10 and 10
x = trial.suggest_float('x', -10, 10) y = trial.suggest_float('y', -10, 10)
# Return the metric to minimize return (x - 2) ** 2 + 1.2 * (y + 3) ** 2
Djup förstärkningsinlärning i Python

Optuna-studien

 

  • Använd sqlite för att spara studien
  • Sampla n_trials med standardsamplaren (TPE)
    • Väljer hyperparametrar slumpmässigt till en början
    • Fokuserar sedan mer på lovande områden
  • Om n_trials utelämnas: kör körningar tills de avbryts
  • Studien kan läsas in från databasen senare

 

import sqlite
study = optuna.create_study(
                 storage="sqlite:///DRL.db",
                 study_name="my_study")

study.optimize(objective, n_trials=100)
loaded_study = optuna.load_study(
                        study_name="my_study", 
                        storage="sqlite:///DRL.db")
Djup förstärkningsinlärning i Python

Utforska studieresultaten

optuna.visualization.plot_param_importances(study)

Ett stapeldiagram som visar hyperparameterviktighet för x och y; y är 0,71 och x är 0,29.

optuna.visualization.plot_contour(study)

En konturplot med en punkt per körning. Punkterna är koncentrerade kring x = 2, y = -3.

Djup förstärkningsinlärning i Python

Nu kör vi en övning!

Djup förstärkningsinlärning i Python

Preparing Video For Download...