Otimização de hiperparâmetros com Optuna

Aprendizado por reforço profundo em Python

Timothée Carayol

Principal Machine Learning Engineer, Komment

O que são hiperparâmetros

 

 

  • Muitos hiperparâmetros em algoritmos de DRL
  • Podem impactar bastante o desempenho
  • A complexidade da busca cresce com a quantidade de hiperparâmetros

 

Exemplos
Taxa de desconto
PPO: clipping epsilon, bônus de entropia
Experience replay: tamanho do buffer, tamanho do lote
Agenda de ganância epsilon decrescente
Fixed Q-targets: $\tau$
Taxa de aprendizado
Número de camadas, nós por camada...
Aprendizado por reforço profundo em Python

Como escolher valores de hiperparâmetros

 

Objetivo: recompensas cumulativas médias

Técnicas de busca de hiperparâmetros:

  • Tentativa e erro manual
  • Grid search
  • Random search
  • Algoritmos dedicados

Uma grande máquina mecânica com dezenas de botões e mostradores

Aprendizado por reforço profundo em Python

O logo do Optuna

 

Fluxo de trabalho do Optuna:

  • Definir uma função objetivo
  • Instanciar um study do Optuna
  • Deixar o Optuna iterar sobre os trials

 

 

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}
Aprendizado por reforço profundo em Python

Especificando a função objetivo

 

Na função objetivo:

  • Definir os hiperparâmetros de interesse
  • Definir a(s) métrica(s) a otimizar

Oferece flexibilidade total na especificação:

  • float
  • integer
  • categorical

 

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

# Hiperparâmetros x e y entre -10 e 10
x = trial.suggest_float('x', -10, 10) y = trial.suggest_float('y', -10, 10)
# Retorna a métrica a minimizar return (x - 2) ** 2 + 1.2 * (y + 3) ** 2
Aprendizado por reforço profundo em Python

O estudo do Optuna

 

  • Use sqlite para salvar o estudo
  • Amostre n_trials com o sampler padrão (TPE)
    • Escolhe hiperparâmetros aleatórios no início
    • Depois foca mais em regiões promissoras
  • Se n_trials for omitido: executa até ser interrompido
  • Você pode carregar o estudo do banco depois

 

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")
Aprendizado por reforço profundo em Python

Explorando os resultados do estudo

optuna.visualization.plot_param_importances(study)

Um gráfico de barras mostrando a importância dos hiperparâmetros para x e y; y está em 0,71 e x em 0,29.

optuna.visualization.plot_contour(study)

Um gráfico de contorno mostrando um ponto por trial. Pontos concentrados em x = 2, y = -3.

Aprendizado por reforço profundo em Python

Vamos praticar!

Aprendizado por reforço profundo em Python

Preparing Video For Download...