This tutorial uses synthetic functions to illustrate Bayesian optimization using a multi-task Gaussian Process in Ax. A typical use case is optimizing an expensive-to-evaluate (online) system with supporting (offline) simulations of that system.
Bayesian optimization with a multi-task kernel (Multi-task Bayesian optimization) is described by Swersky et al. (2013). Letham and Bakshy (2019) describe using multi-task Bayesian optimization to tune a ranking system with a mix of online and offline (simulator) experiments.
This tutorial produces the results of Online Appendix 2 from that paper.
The synthetic problem used here is to maximize the Hartmann 6 function, a classic optimization test problem in 6 dimensions. The objective is treated as unknown and are modeled with separate GPs. The objective is noisy.
Throughout the optimization we can make nosiy observations directly of the objective (an online observation), and we can make noisy observations of a biased version of the objective (offline observations). Bias is simulated by passing the function values through a piecewise linear function. Offline observations are much less time-consuming than online observations, so we wish to use them to improve our ability to optimize the online objective.
from copy import deepcopy import numpy as np import pandas as pd from scipy.stats import norm import time from ax.core.data import Data from ax.core.observation import ObservationFeatures, observations_from_data from ax.core.optimization_config import OptimizationConfig from ax.core.search_space import SearchSpace from ax.core.objective import Objective from ax.runners.synthetic import SyntheticRunner from ax.modelbridge.random import RandomModelBridge from ax.core.types import ComparisonOp from ax.core.parameter import RangeParameter, ParameterType from ax.core.multi_type_experiment import MultiTypeExperiment from ax.metrics.hartmann6 import Hartmann6Metric from ax.metrics.l2norm import L2NormMetric from ax.modelbridge.factory import get_sobol, get_GPEI, get_MTGP from ax.core.generator_run import GeneratorRun from ax.plot.diagnostic import interact_batch_comparison from ax.plot.trace import optimization_trace_all_methods from ax.utils.notebook.plotting import init_notebook_plotting, render init_notebook_plotting()
[INFO 04-26 20:27:46] ax.utils.notebook.plotting: Injecting Plotly library into cell. Do not overwrite or delete cell.