La optimización bayesiana es un método de optimización global basado en inferencia bayesiana y procesos gaussianos. Su objetivo es encontrar el máximo (o mínimo) de una función desconocida con la menor cantidad de evaluaciones posible. Es particularmente útil cuando la función objetivo es costosa de evaluar y se necesita un equilibrio entre exploración (probar regiones inciertas) y explotación (aprovechar áreas prometedoras).
Fundamentos de la optimización bayesiana
- Distribución posterior: Se construye un modelo probabilístico (típicamente un proceso gaussiano) que describe la creencia sobre la función objetivo. A medida que se recogen más observaciones, la distribución posterior se actualiza y el algoritmo aprende qué regiones del espacio de parámetros merecen más atención.
- Equilibrio exploración–explotación: En cada iteración, se ajusta un proceso gaussiano a los puntos ya evaluados. Luego, una función de adquisición (por ejemplo, límite superior de confianza (UCB) o mejora esperada (EI)) determina el siguiente punto a muestrear, combinando la incertidumbre del modelo con el rendimiento esperado.
Proceso de optimización
El procedimiento busca minimizar el número de evaluaciones necesarias para aproximarse a la combinación óptima de parámetros. Para ello, se resuelve un subproblema de optimización (maximizar la función de adquisición) que es computacionalmente barato aunque no trivial. Así, la optimización bayesiana es ideal cuando cada evaluación de la función objetivo es costosa, como en el ajuste de hiperparámetros de modelos de aprendizaje automático.
Conceptos clave
- Proceso gaussiano: Modelo bayesiano no paramétrico que proporciona una distribución sobre funciones. Se usa para inferir el comportamiento de la función objetivo a partir de muestras conocidas.
- Función de adquisición: Estrategia que indica dónde muestrear a continuación. Las más comunes son UCB (Upper Confidence Bound) y EI (Expected Improvement).
- Exploración vs. Explotación: La exploración prueba regiones con alta incertidumbre; la explotación se centra en zonas donde el modelo predice valores altos. La optimización bayesiana equilibra ambas para mejorar la eficiencia.
Aplicaciones típicas
- Optimización de hiperparámetros en machine learning (coste computacional elevado).
- Problemas donde se requiere un número reducido de evaluaciones para alcanzar un resultado casi óptimo.
- Escenarios donde se necesita un balance entre explorar nuevas regiones y explotar la información existente.
- Definir la función a optimizar
El paquete está diseñado para optimizar funciones. El primer paso es definir la función objetivo (caja negra). Aunque aquí conocemos su forma analítica, en un caso real solo se requiere que reciba parámetros y devuelva un valor real.
def funcion_objetivo(a, b):
"""Función de caja negra que queremos maximizar.
En la práctica no se conoce su implementación interna.
Solo se necesita que acepte parámetros y devuelva un número real.
"""
return -a ** 2 - (b - 2) ** 2 + 3
El objetivo es encontrar los valores de a y b que maximicen esta función.
- Iniciar la optimización bayesiana
Creamos una instancia de BayesianOptimization especificando la función y los límites de los parámetros (pbounds). La optimización bayesiana es un método con restriccionse; por tanto, es obligatorio definir los valores mínimo y máximo para cada parámetro.
from bayes_opt import BayesianOptimization
# Límites del espacio de parámetros
limites = {'a': (1, 5), 'b': (-4, 2)}
optimizador = BayesianOptimization(
f=funcion_objetivo,
pbounds=limites,
verbose=2, # 1 imprime solo cuando se encuentra un nuevo máximo; 0 silencio
random_state=42 # semilla para reproducibilidad
)
La instancia está lista para usarse. El método principal es maximize, que ejecuta el proceso de optimización.
optimizador.maximize(init_points=5, n_iter=15)
Los argumentos init_points y n_iter controlan cuántas evaluaciones iniciales aleatorias se realizan y cuántas iteraciones de optimización bayesiana se ejecutan después.