Otimização Bayesiana

A otimização bayesiana (Bayesian optimization, BO) é um método eficiente em amostras (sample-efficient) para otimizar uma função objetivo desconhecida e cara de avaliar (“caixa-preta (black-box)”). Ela é amplamente usada para Ajuste de Hiperparâmetros (Hyperparameter Tuning), em que cada avaliação da função pode significar treinar e validar um modelo de aprendizado de máquina (machine learning) — minutos a horas de computação.

A ideia central da BO é substituir o objetivo caro por um modelo substituto probabilístico (probabilistic surrogate model) mais barato, que estima simultaneamente:

  • Qual desempenho esperar em uma configuração candidata (média), e
  • Quão incerta é essa estimativa (variância/incerteza)

Uma função de aquisição (acquisition function) então usa esse substituto ciente da incerteza para decidir qual configuração avaliar em seguida, equilibrando exploração (exploration) (aprender sobre regiões incertas) e aproveitamento (exploitation) (focar em regiões promissoras).

Configuração do problema: otimização cara de caixa-preta

Queremos resolver:

[ x^* = \arg\min_{x \in \mathcal{X}} f(x) ]

onde:

  • (x) é um vetor de variáveis de decisão (por exemplo, hiperparâmetros),
  • (\mathcal{X}) é o espaço de busca (contínuo, discreto, categórico, condicional etc.),
  • (f(x)) é caro de avaliar e pode ser ruidoso (por exemplo, devido a treinamento estocástico).

Na prática, frequentemente observamos:

[ y = f(x) + \epsilon ]

onde (\epsilon) é o ruído de observação (erro de medição, aleatoriedade no treinamento, amostragem de dados etc.).

A BO costuma ser a ferramenta certa quando:

  • Cada avaliação de (f(x)) é custosa
  • Você só pode pagar dezenas a centenas de avaliações
  • A dimensão é modesta (geralmente < 20–30 variáveis contínuas para BO clássica baseada em GP)
  • Você quer um otimizador padrão forte com tratamento de incerteza de forma principiada

Componentes centrais

A otimização bayesiana consiste em duas partes fortemente acopladas:

  1. Modelo substituto: um modelo probabilístico de (f) dado os dados observados (\mathcal{D} = {(x_i, y_i)}_{i=1}^n)
  2. Função de aquisição (a(x)): uma função barata de avaliar, derivada do substituto, que pontua o quão útil seria avaliar (f(x)) a seguir

Então, a BO repete um ciclo: ajustar substituto → maximizar aquisição → avaliar objetivo → atualizar dados.

O loop de otimização bayesiana (visão geral)

  1. Inicialize com um pequeno conjunto de avaliações (frequentemente aleatórias ou de preenchimento de espaço).
  2. Ajuste o substituto aos dados.
  3. Selecione o próximo ponto otimizando a função de aquisição: [ x_{n+1} = \arg\max_{x \in \mathcal{X}} a(x \mid \mathcal{D}) ]
  4. Avalie a função cara (y_{n+1} = f(x_{n+1}) + \epsilon).
  5. Aumente os dados (\mathcal{D} \leftarrow \mathcal{D} \cup {(x_{n+1}, y_{n+1})}).
  6. Repita até o orçamento (budget) (tempo, avaliações, dinheiro) se esgotar.

Pseudocode

Input: objective f(x), search space X, evaluation budget N
Initialize data D with n0 points (e.g., random / Latin hypercube)

for t = n0+1 to N:
    Fit probabilistic surrogate p(f | D)
    Define acquisition a(x | D) from surrogate
    x_t = argmax_{x in X} a(x | D)          # cheap but nontrivial optimization
    y_t = f(x_t) + noise
    D = D ∪ {(x_t, y_t)}

Return best observed x (or best posterior estimate)

Modelos substitutos (com ênfase em processos gaussianos)

A configuração “clássica” de otimização bayesiana usa regressão por processo gaussiano (Gaussian process, GP) como substituto. Um GP é uma distribuição sobre funções; após observar dados, você obtém uma distribuição a posteriori (posterior) sobre funções plausíveis consistentes com os dados. Veja Processos Gaussianos (Gaussian Processes) para uma introdução mais aprofundada.

Substituto via processo gaussiano: intuição

Um GP é definido por:

  • Função média (m(x)) (frequentemente definida como 0 após normalização)
  • Função de covariância/núcleo (k(x, x')) (núcleo (kernel)), que codifica suposições como suavidade

Colocamos uma distribuição a priori:

[ f \sim \mathcal{GP}(m(x), k(x, x')) ]

Dadas as observações ({(x_i, y_i)}), o GP fornece uma distribuição preditiva a posteriori (posterior predictive distribution) em um novo ponto (x):

  • Média preditiva: (\mu(x))
  • Variância preditiva: (\sigma^2(x))

A média diz o que você espera; a variância diz quão inseguro você está. A função de aquisição explora ambas.

Núcleos comuns e o que eles implicam

A escolha do núcleo codifica suposições sobre o objetivo:

  • RBF (radial basis function) / exponencial ao quadrado (squared exponential): funções muito suaves
  • Matérn (por exemplo, 5/2): menos suave; frequentemente um padrão forte na prática para BO
  • Núcleos periódicos (periodic kernels): estrutura repetitiva
  • Determinação automática de relevância (automatic relevance determination, ARD): escalas de comprimento separadas por dimensão para aprender quais hiperparâmetros mais importam

O desempenho da BO pode depender fortemente de as suposições do núcleo corresponderem aproximadamente ao comportamento do objetivo.

Tratamento de ruído

Com observações ruidosas (y = f(x) + \epsilon), a regressão por GP tipicamente usa uma verossimilhança (likelihood) Gaussiana com variância de ruído (\sigma_\epsilon^2). Implicações práticas:

  • Se as avaliações são estocásticas (comum em treinamento de modelos), modele o ruído em vez de forçar o substituto a interpolar todos os pontos.
  • Você também pode querer réplicas (replicates) (avaliar o mesmo (x) várias vezes) quando o ruído é alto.

Alternativas a substitutos via GP

GPs nem sempre são ideais, especialmente com muitas dimensões, variáveis categóricas ou conjuntos de dados muito grandes. Alternativas comuns incluem:

  • Estimador de Parzen com estrutura de árvore (tree-structured Parzen estimator, TPE) (popularizado por Hyperopt/Optuna): bom para espaços com muitas variáveis condicionais/categóricas
  • Substitutos de floresta aleatória (random forest) (por exemplo, SMAC): robustos em espaços mistos discretos/contínuos
  • Redes neurais bayesianas (Bayesian neural networks) / ensembles profundos (deep ensembles): usados em domínios de maior dimensionalidade ou estruturados, mas exigem mais cuidado
  • Modelos lineares / splines (splines): às vezes suficientes para objetivos de baixa complexidade

Em ajuste de hiperparâmetros, TPE e métodos no estilo SMAC frequentemente são mais robustos do que BO puramente baseada em GP quando o espaço de busca tem muitas escolhas categóricas/condicionais.

Funções de aquisição: EI, PI e UCB

A função de aquisição (a(x)) decide onde amostrar a seguir. Ela é projetada para ser:

  • barata de computar (comparada a (f)),
  • alta onde a melhoria é provável e/ou a incerteza é alta,
  • ajustável para controlar o balanço exploração–aproveitamento.

A seguir, assuma que estamos minimizando (f) e temos o melhor valor observado atual (f_{\min}). Para um substituto por GP, a distribuição preditiva em (x) frequentemente é modelada como:

[ f(x) \sim \mathcal{N}(\mu(x), \sigma^2(x)) ]

Probabilidade de Melhoria (Probability of Improvement, PI)

A PI escolhe pontos com alta probabilidade de superar o melhor atual:

[ \mathrm{PI}(x) = \Pr(f(x) \le f_{\min} - \xi) ]

  • (\xi \ge 0) é uma margem que incentiva exploração (maior (\xi) → mais exploração).
  • A PI pode ser excessivamente focada em aproveitamento: pode concentrar-se em regiões com pequena melhoria predita, porém alta certeza.

Melhoria Esperada (Expected Improvement, EI)

A EI mede a quantidade esperada de melhoria:

[ \mathrm{EI}(x) = \mathbb{E}[\max(0, f_{\min} - f(x) - \xi)] ]

A EI é um padrão comum porque equilibra naturalmente:

  • Média predita baixa (aproveitamento)
  • Alta incerteza (exploração), pois a incerteza aumenta a chance de grande melhoria

A EI tipicamente funciona bem em muitos problemas de ajuste de hiperparâmetros quando as avaliações são caras.

Limite Superior de Confiança (Upper Confidence Bound, UCB) / Limite Inferior de Confiança (Lower Confidence Bound, LCB)

Aquisições no estilo UCB selecionam pontos por um limite otimista. Para minimização, você frequentemente usa uma LCB:

[ \mathrm{LCB}(x) = \mu(x) - \kappa \sigma(x) ]

Então, escolha (x) que minimize a LCB (equivalentemente, maximize (-\mathrm{LCB})). Aqui:

  • (\kappa) controla exploração (maior (\kappa) → explorar mais áreas incertas).

UCB/LCB é popular porque é simples e frequentemente possui limites teóricos de arrependimento (regret bounds) em cenários de bandit (bandit), relacionados a Bandits de Múltiplos Braços (Multi-Armed Bandits).

Como escolher entre EI/UCB/PI (orientação prática)

  • EI: forte padrão geral; compromisso robusto.
  • UCB/LCB: boa quando você quer um controle explícito de exploração; comum em trabalhos teóricos.
  • PI: às vezes útil no final da otimização ou quando você quer aproveitamento agressivo, mas pode travar.

Um exemplo prático de ajuste de hiperparâmetros

Suponha que você queira ajustar uma SVM (máquina de vetores de suporte, support vector machine, SVM) (ou qualquer modelo) e que cada avaliação envolva validação cruzada (cross-validation) (veja Validação Cruzada (Cross-Validation)), tornando (f(x)) cara.

  • Variáveis de decisão:

    • (C) (escala logarítmica, contínua)
    • (\gamma) (escala logarítmica, contínua)
  • Objetivo:

    • perda de validação, média sobre os folds

Um fluxo de trabalho de BO simplificado:

  1. Comece com ~10 configurações aleatórias em ((\log C, \log \gamma)).
  2. Ajuste um GP para mapear configuração → perda de validação.
  3. Use EI para propor a próxima configuração.
  4. Avalie-a (treinar/validar).
  5. Itere por talvez 50 avaliações.

Python mínimo ilustrativo (conceitual)

Este trecho usa uma interface de otimizador baseada em GP (a biblioteca exata pode variar):

import numpy as np

def objective(params):
    logC, logG = params
    C = 10 ** logC
    gamma = 10 ** logG
    # Train model, run CV, return validation loss (expensive!)
    loss = train_and_cross_validate_svm(C=C, gamma=gamma)
    return loss

space = [(-3, 3), (-6, 1)]  # bounds for log10(C), log10(gamma)

result = bayes_optimize(
    objective,
    space=space,
    surrogate="gp",
    acquisition="ei",
    n_initial=10,
    n_calls=50,
    random_seed=0,
)

best_params, best_loss = result.x, result.fun
print("Best:", best_params, best_loss)

Notas práticas:

  • Otimize no espaço logarítmico para parâmetros de escala (taxas de aprendizado, forças de regularização).
  • Normalize entradas e saídas para um ajuste estável do substituto.
  • Se o treinamento for estocástico, registre sementes aleatórias ou trate os resultados como ruidosos.

Restrições práticas e variações do mundo real

1) Orçamentos limitados e parada antecipada

A BO é mais valiosa quando os orçamentos de avaliação são pequenos, mas muitos pipelines de treinamento em ML permitem avaliações parciais (treinar por algumas épocas, usar um subconjunto de dados). Isso leva à BO de multifidelidade (multi-fidelity):

  • Avalie aproximações baratas no início e, então, aloque mais computação para configurações promissoras.
  • Abordagens comuns combinam ideias de BO com alocação de recursos no estilo bandit (por exemplo, agendamento no estilo Hyperband (Hyperband-like scheduling)). Veja Hyperband e Otimização de Multifidelidade (Multi-Fidelity Optimization).

Isso costuma ser crucial em aprendizado profundo, onde execuções de treinamento completas são extremamente caras.

2) Objetivos ruidosos

O ajuste de hiperparâmetros é frequentemente ruidoso devido a:

  • inicialização aleatória,
  • amostragem de minibatches,
  • kernels de GPU não determinísticos,
  • aumento de dados.

Técnicas práticas:

  • Use um substituto ciente de ruído (por exemplo, GP com ruído de observação).
  • Considere avaliações replicadas para os melhores candidatos, para reduzir variância.
  • Prefira aquisições projetadas para cenários ruidosos (existem variantes de EI, e amostragem de Thompson (Thompson sampling) é frequentemente usada em cenários de lote).

3) Avaliação paralela e assíncrona (BO em lote)

Muitas equipes executam múltiplas tentativas em paralelo. A BO clássica é sequencial, mas há extensões:

  • Aquisição em lote (q) (batch (q) acquisition): propõe um conjunto de pontos de uma vez (por exemplo, qEI).
  • BO assíncrona (asynchronous BO): assim que um worker termina, propõe o próximo ponto usando os dados atuais.

Duas estratégias comuns:

  • “Fantasy” ou modelagem de pontos pendentes (pending-point modeling): modelar temporariamente resultados de avaliações em andamento.
  • Amostragem de Thompson: amostrar uma função do posterior e otimizá-la para escolher pontos; repetir para obter um lote.

4) Espaços de busca mistos, categóricos e condicionais

Espaços reais de hiperparâmetros frequentemente incluem:

  • escolhas categóricas (tipo de otimizador: Adam vs SGD),
  • parâmetros condicionais (momentum só importa se optimizer=SGD),
  • parâmetros inteiros (número de camadas, tamanho de batch).

GPs têm dificuldade com categóricos de alta cardinalidade e estruturas condicionais complexas. Nesses casos:

  • TPE (estimação de densidade) ou substitutos de floresta aleatória no estilo SMAC podem ser mais robustos.
  • Codificar categóricos (one-hot (one-hot), embeddings (embeddings)) pode ajudar, mas o viés indutivo (inductive bias) do substituto importa.

5) Restrições e viabilidade

Às vezes você precisa satisfazer restrições:

  • limites de memória (o modelo precisa caber na GPU),
  • restrições de latência (a inferência precisa ser < 10 ms),
  • restrições de justiça ou segurança.

Isso leva à BO com restrições (constrained BO), em que você modela a viabilidade separadamente e otimiza uma aquisição que respeita restrições (por exemplo, melhoria esperada sujeita à probabilidade de viabilidade).

6) A otimização da aquisição é, ela mesma, um problema de otimização

Mesmo que (a(x)) seja barata, ela pode ser:

  • não convexa (non-convex),
  • multimodal (multi-modal),
  • definida sobre espaços mistos.

Táticas comuns:

  • otimização baseada em gradiente com múltiplos inícios (quando diferenciável),
  • busca aleatória sobre a aquisição (surpreendentemente efetiva em dimensão moderada),
  • estratégias evolutivas sobre a aquisição para espaços complexos

Quando a otimização bayesiana funciona bem (e quando não funciona)

Funciona bem quando

  • As avaliações são caras (minutos a horas)
  • A dimensão do espaço de busca é modesta
  • O objetivo é razoavelmente suave com alguma estrutura explorável
  • Você precisa de bom desempenho com poucas tentativas
  • Você pode reutilizar informação entre tentativas (o aprendizado do substituto é significativo)

Sucessos típicos:

  • Ajuste de modelos clássicos de ML (SVMs, gradient boosting)
  • Ajuste de hiperparâmetros de treinamento de aprendizado profundo quando combinado com métodos de multifidelidade
  • Otimização de parâmetros de simulação caros (robótica, projeto de engenharia)

Modos comuns de falha

  1. Alta dimensionalidade (maldição da dimensionalidade)

    • A BO padrão baseada em GP frequentemente degrada após ~20–30 dimensões contínuas efetivas.
    • Mitigações incluem redução de dimensionalidade, modelos aditivos, BO de região de confiança (trust-region BO) ou troca de método.
  2. Objetivos muito ruidosos

    • Se o ruído domina o sinal, a incerteza do substituto não guiará a amostragem de forma significativa.
    • Mitigações: replicar execuções, aumentar o orçamento, usar aquisições robustas/cientes de ruído.
  3. Objetivos baratos

  4. Objetivos altamente não estacionários ou descontínuos

    • Muitos núcleos assumem suavidade; descontinuidades fortes ou transições de fase podem enganar o substituto.
    • Substitutos baseados em árvores podem ser mais robustos.
  5. Grandes espaços categóricos/condicionais

    • Substitutos via GP podem ter dificuldade, a menos que sejam cuidadosamente projetados.
    • Métodos no estilo TPE/SMAC frequentemente funcionam melhor.
  6. Forte multimodalidade com bacias enganosas

    • A BO pode superexplorar cedo; uma inicialização ruim pode fazer o modelo ficar confiante na região errada.
    • Mitigação: melhores desenhos iniciais, configurações de exploração mais fortes ou reinícios.

Otimização bayesiana no kit de ferramentas de ajuste de hiperparâmetros

Dentro de Ajuste de Hiperparâmetros, a BO geralmente é comparada a:

Uma regra prática:

  • Comece com busca aleatória como baseline.
  • Use otimização bayesiana quando as tentativas forem caras e você esperar estrutura.
  • Para aprendizado profundo em escala, considere BO mais agendamento de multifidelidade (por exemplo, parada antecipada/alocação de recursos).

Dicas de implementação e boas práticas

  • Transforme parâmetros sensíveis (escala logarítmica para taxas de aprendizado/regularização).
  • Normalize entradas e valores do objetivo antes do ajuste do GP.
  • Use uma inicialização de preenchimento de espaço (space-filling) (aleatória ou hipercubo latino (Latin hypercube)) em vez de BO puramente gulosa desde o início.
  • Acompanhe o melhor valor observado e também a incerteza de validação (evite sobreajuste a um conjunto de validação ruidoso).
  • Prefira pipelines de avaliação reprodutíveis (partições fixas, aleatoriedade controlada) quando possível.
  • Trate BO como parte de um fluxo de trabalho maior de seleção de modelos; mantenha uma separação limpa entre ajuste e teste final (veja Seleção de Modelos (Model Selection)).

Resumo

A otimização bayesiana é uma estratégia principiada para otimizar funções de caixa-preta caras ao:

  • aprender um substituto probabilístico do objetivo (frequentemente um processo gaussiano),
  • selecionar avaliações via uma função de aquisição (EI/UCB/PI) que equilibra exploração e aproveitamento,
  • melhorar iterativamente o desempenho com muito menos avaliações do que buscas ingênuas.

Ela se destaca em cenários com poucas amostras, como ajuste de hiperparâmetros, mas pode ter dificuldades com alta dimensionalidade, ruído intenso e espaços categóricos/condicionais complexos. Na prática, sua efetividade frequentemente depende tanto de detalhes de engenharia — transformações de parâmetros, tratamento de ruído, paralelismo e orçamentação — quanto da escolha entre EI e UCB.

Se você quiser, posso adicionar uma seção curta comparando bibliotecas populares de BO e suas escolhas padrão de substituto/aquisição (por exemplo, GP vs TPE, suporte a lotes, espaços condicionais), mantendo a discussão neutra em relação a fornecedores.