{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Multi-task Bayesian Optimization\n", "\n", "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.\n", "\n", "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.\n", "\n", "This tutorial produces the results of Online Appendix 2 from [that paper](https://arxiv.org/pdf/1904.01049.pdf).\n", "\n", "The synthetic problem used here is to maximize the Hartmann 6 function, a classic optimization test problem in 6 dimensions, subject to a constraint on the 2-norm of $x$. Both the objective and the constraint are treated as unknown and are modeled with separate GPs. Both objective and constraint are noisy.\n", "\n", "Throughout the optimization we can make nosiy observations directly of the objective and constraint (an online observation), and we can make noisy observations of a biased version of the objective and constraint (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." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "[INFO 04-24 11:03:26] ipy_plotting: Injecting Plotly library into cell. Do not overwrite or delete cell.\n" ] } ], "source": [ "from copy import deepcopy\n", "from matplotlib import pyplot as plt\n", "import numpy as np\n", "import pandas as pd\n", "from scipy.stats import norm\n", "import time\n", "\n", "from ax.core.data import Data\n", "from ax.core.observation import ObservationFeatures, observations_from_data\n", "from ax.core.optimization_config import OptimizationConfig\n", "from ax.core.search_space import SearchSpace\n", "from ax.core.objective import Objective\n", "from ax.runners.synthetic import SyntheticRunner\n", "from ax.modelbridge.random import RandomModelBridge\n", "from ax.core.outcome_constraint import OutcomeConstraint\n", "from ax.core.types import ComparisonOp\n", "from ax.core.parameter import RangeParameter, ParameterType\n", "from ax.core.multi_type_experiment import MultiTypeExperiment\n", "from ax.metrics.hartmann6 import Hartmann6Metric\n", "from ax.metrics.l2norm import L2NormMetric\n", "from ax.modelbridge.factory import get_sobol, get_GPEI, get_MTGP\n", "from ax.core.generator_run import GeneratorRun\n", "from ax.plot.diagnostic import interact_batch_comparison\n", "from ax.utils.notebook.plotting import init_notebook_plotting, render\n", "\n", "init_notebook_plotting()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Define Metric classes\n", "For this example, the online system is optimizing a Hartmann6 function subject to a 2-norm constraint. The Metric objects for these are directly imported above. We create analagous offline versions of these two metrics which are identical but have a transform applied (a piecewise linear function). We construct Metric objects for each of them." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Create metrics with artificial offline bias, for both objective and constraint\n", "# by passing the true values through a piecewise linear function.\n", "\n", "class OfflineHartmann6Metric(Hartmann6Metric):\n", " def f(self, x: np.ndarray) -> float:\n", " raw_res = super().f(x)\n", " m = -0.35\n", " if raw_res < m:\n", " return (1.5* (raw_res - m)) + m\n", " else:\n", " return (6.0 * (raw_res - m)) + m\n", "\n", "class OfflineL2NormMetric(L2NormMetric):\n", " def f(self, x: np.ndarray) -> float:\n", " raw_res = super().f(x)\n", " m = 1.25\n", " if raw_res < m:\n", " return (0.8 * (raw_res - m)) + m\n", " else:\n", " return (4 * (raw_res - m)) + m" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Create experiment\n", "\n", "A MultiTypeExperiment is used for managing online and offline trials together. It is constructed in several steps:\n", "\n", "1. Create the search space - This is done in the usual way.\n", "2. Specify optimization config - Also done in the usual way.\n", "3. Initialize Experiment - In addition to the search_space and optimization_config, specify that \"online\" is the default trial_type. This is the main trial type for which we're optimizing. Optimization metrics are defined to be for this type and new trials assume this trial type by default.\n", "4. Establish offline trial_type - Register the \"offline\" trial type and specify how to deploy trials of this type.\n", "5. Add offline metrics - Create the offline metrics and add them to the experiment. When adding the metrics, we need to specify the trial type (\"offline\") and online metric name it is associated with so the model can link them.\n", "\n", "Finally, because this is a synthetic benchmark problem where the true function values are known, we will also register metrics with the true (noiseless) function values for plotting below." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def get_experiment(include_true_metric=True):\n", " noise_sd = 0.1 # Observations will have this much Normal noise added to them\n", " \n", " # 1. Create simple search space for [0,1]^d, d=6\n", " param_names = [f\"x{i}\" for i in range(6)]\n", " parameters=[\n", " RangeParameter(\n", " name=param_names[i], parameter_type=ParameterType.FLOAT, lower=0.0, upper=1.0\n", " )\n", " for i in range(6)\n", " ]\n", " search_space=SearchSpace(parameters=parameters)\n", " \n", " # 2. Specify optimization config\n", " online_objective = Hartmann6Metric(\"objective\", param_names=param_names, noise_sd=noise_sd)\n", " online_constraint = L2NormMetric(\"constraint\", param_names=param_names, noise_sd=noise_sd)\n", " opt_config = OptimizationConfig(\n", " objective=Objective(online_objective, minimize=True),\n", " outcome_constraints=[OutcomeConstraint(online_constraint, op=ComparisonOp.LEQ, bound=1.25, relative=False)]\n", " )\n", " \n", " # 3. Init experiment\n", " exp = MultiTypeExperiment(\n", " name=\"mt_exp\",\n", " search_space=search_space,\n", " default_trial_type=\"online\",\n", " default_runner=SyntheticRunner(),\n", " optimization_config=opt_config,\n", " )\n", " \n", " # 4. Establish offline trial_type, and how those trials are deployed\n", " exp.add_trial_type(\"offline\", SyntheticRunner())\n", " \n", " # 5. Add offline metrics that provide biased estimates of the online metrics\n", " offline_objective = OfflineHartmann6Metric(\"offline_objective\", param_names=param_names, noise_sd=noise_sd)\n", " offline_constraint = OfflineL2NormMetric(\"offline_constraint\", param_names=param_names, noise_sd=noise_sd)\n", " # Associate each offline metric with corresponding online metric\n", " exp.add_tracking_metric(metric=offline_objective, trial_type=\"offline\", canonical_name=\"objective\")\n", " exp.add_tracking_metric(metric=offline_constraint, trial_type=\"offline\", canonical_name=\"constraint\")\n", " \n", " # Add a noiseless equivalent for each metric, for tracking the true value of each observation\n", " # for the purposes of benchmarking.\n", " if include_true_metric:\n", " exp.add_tracking_metric(Hartmann6Metric(\"objective_noiseless\", param_names=param_names, noise_sd=0.0), \"online\")\n", " exp.add_tracking_metric(L2NormMetric(\"constraint_noiseless\", param_names=param_names, noise_sd=0.0), \"online\")\n", " return exp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Vizualize the simulator bias\n", "\n", "These figures compare the online measurements to the offline measurements on a random set of points, for both the objective metric and the constraint metric. You can see the offline measurements are biased but highly correlated. This produces Fig. S3 from the paper." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Generate 50 points from a Sobol sequence\n", "exp = get_experiment(include_true_metric=False)\n", "s = get_sobol(exp.search_space, scramble=False)\n", "gr = s.gen(50)\n", "# Deploy them both online and offline\n", "exp.new_batch_trial(trial_type=\"online\", generator_run=gr).run()\n", "exp.new_batch_trial(trial_type=\"offline\", generator_run=gr).run()\n", "# Fetch data\n", "data = exp.fetch_data()\n", "observations = observations_from_data(exp, data)\n", "# Plot the arms in batch 0 (online) vs. batch 1 (offline)\n", "render(interact_batch_comparison(observations, exp, 1, 0))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. The Bayesian optimization loop\n", "\n", "Here we construct a Bayesian optimization loop that interleaves online and offline batches. The loop defined here is described in Algorithm 1 of the paper. We compare multi-task Bayesian optimization to regular Bayesian optimization using only online observations.\n", "\n", "Here we measure performance over 3 repetitions of the loop. Each one takes 1-2 hours so the whole benchmark run will take several hours to complete." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Settings for the optimization benchmark.\n", "\n", "# This should be changed to 50 to reproduce the results from the paper.\n", "n_reps = 3 # Number of repeated experiments, each with independent observation noise\n", "\n", "n_init_online = 5 # Size of the quasirandom initialization run online\n", "n_init_offline = 20 # Size of the quasirandom initialization run offline\n", "n_opt_online = 5 # Batch size for BO selected points to be run online\n", "n_opt_offline = 20 # Batch size for BO selected to be run offline\n", "n_batches = 3 # Number of optimized BO batches" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 4a. Optimization with online observations only\n", "For the online-only case, we run `n_init_online` sobol points followed by `n_batches` batches of `n_opt_online` points selected by the GP. This is a normal Bayesian optimization loop." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# This function runs a Bayesian optimization loop, making online observations only.\n", "def run_online_only_bo():\n", " t1 = time.time()\n", " ### Do BO with online only\n", " ## Quasi-random initialization\n", " exp_online = get_experiment()\n", " m = get_sobol(exp_online.search_space, scramble=False)\n", " gr = m.gen(n=n_init_online)\n", " exp_online.new_batch_trial(trial_type=\"online\", generator_run=gr).run()\n", " ## Do BO\n", " for b in range(n_batches):\n", " print('Online-only batch', b, time.time() - t1)\n", " # Fit the GP\n", " m = get_GPEI(\n", " experiment=exp_online,\n", " data=exp_online.fetch_data(),\n", " search_space=exp_online.search_space,\n", " )\n", " # Generate the new batch\n", " gr = m.gen(\n", " n=n_opt_online,\n", " search_space=exp_online.search_space,\n", " optimization_config=exp_online.optimization_config,\n", " )\n", " exp_online.new_batch_trial(trial_type=\"online\", generator_run=gr).run()\n", " ## Extract true objective and constraint at each iteration\n", " df = exp_online.fetch_data().df\n", " obj = df[df['metric_name'] == 'objective_noiseless']['mean'].values\n", " con = df[df['metric_name'] == 'constraint_noiseless']['mean'].values\n", " return obj, con" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 4b. Multi-task Bayesian optimization\n", "Here we incorporate offline observations to accelerate the optimization, while using the same total number of online observations as in the loop above. The strategy here is that outlined in Algorithm 1 of the paper.\n", "\n", "1. Initialization - Run `n_init_online` Sobol points online, and `n_init_offline` Sobol points offline.\n", "2. Fit model - Fit an MTGP to both online and offline observations.\n", "3. Generate candidates - Generate `n_opt_offline` candidates using NEI.\n", "4. Launch offline batch - Run the `n_opt_offline` candidates offline and observe their offline metrics.\n", "5. Update model - Update the MTGP with the new offline observations.\n", "6. Select points for online batch - Select the best (maximum utility) `n_opt_online` of the NEI candidates, after incorporating their offline observations, and run them online.\n", "7. Update model and repeat - Update the model with the online observations, and repeat from step 3 for the next batch." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Online batches are constructed by selecting the maximum utility points from the offline\n", "# batch, after updating the model with the offline results. This function selects the max utility points according\n", "# to the MTGP predictions.\n", "def max_utility_from_GP(n, m, experiment, search_space, gr):\n", " obsf = []\n", " for arm in gr.arms:\n", " params = deepcopy(arm.parameters)\n", " params['trial_type'] = 'online'\n", " obsf.append(ObservationFeatures(parameters=params))\n", " # Make predictions\n", " f, cov = m.predict(obsf)\n", " # Compute expected utility\n", " mu_c = np.array(f['constraint'])\n", " sigma_c = np.sqrt(cov['constraint']['constraint'])\n", " pfeas = norm.cdf((1.25 - mu_c) / sigma_c)\n", " u = -np.array(f['objective']) * pfeas\n", " best_arm_indx = np.flip(np.argsort(u))[:n]\n", " gr_new = GeneratorRun(\n", " arms = [\n", " gr.arms[i] for i in best_arm_indx\n", " ],\n", " weights = [1.] * n,\n", " )\n", " return gr_new\n", "\n", "# This function runs a multi-task Bayesian optimization loop, as outlined in Algorithm 1 and above.\n", "def run_mtbo():\n", " t1 = time.time()\n", " online_trials = []\n", " ## 1. Quasi-random initialization, online and offline\n", " exp_multitask = get_experiment()\n", " # Online points\n", " m = get_sobol(exp_multitask.search_space, scramble=False)\n", " gr = m.gen(\n", " n=n_init_online,\n", " )\n", " tr = exp_multitask.new_batch_trial(trial_type=\"online\", generator_run=gr)\n", " tr.run()\n", " online_trials.append(tr.index)\n", " # Offline points\n", " m = get_sobol(exp_multitask.search_space, scramble=False)\n", " gr = m.gen(\n", " n=n_init_offline,\n", " )\n", " exp_multitask.new_batch_trial(trial_type=\"offline\", generator_run=gr).run()\n", " ## Do BO\n", " for b in range(n_batches):\n", " print('Multi-task batch', b, time.time() - t1)\n", " # (2 / 7). Fit the MTGP\n", " m = get_MTGP(\n", " experiment=exp_multitask,\n", " data=exp_multitask.fetch_data(),\n", " search_space=exp_multitask.search_space,\n", " )\n", "\n", " # 3. Finding the best points for the online task\n", " gr = m.gen(\n", " n=n_opt_offline,\n", " optimization_config=exp_multitask.optimization_config,\n", " fixed_features=ObservationFeatures(parameters={'trial_type': 'online'}),\n", " )\n", "\n", " # 4. But launch them offline\n", " exp_multitask.new_batch_trial(trial_type=\"offline\", generator_run=gr).run()\n", " \n", " # 5. Update the model\n", " m = get_MTGP(\n", " experiment=exp_multitask,\n", " data=exp_multitask.fetch_data(),\n", " search_space=exp_multitask.search_space,\n", " )\n", " \n", " # 6. Select max-utility points from the offline batch to generate an online batch\n", " gr = max_utility_from_GP(\n", " n=n_opt_online,\n", " m=m,\n", " experiment=exp_multitask,\n", " search_space=exp_multitask.search_space,\n", " gr=gr,\n", " )\n", " tr = exp_multitask.new_batch_trial(trial_type=\"online\", generator_run=gr)\n", " tr.run()\n", " online_trials.append(tr.index)\n", " # Extract true objective at each online iteration for creating benchmark plot\n", " obj = np.array([])\n", " con = np.array([])\n", " for tr in online_trials:\n", " df_t = exp_multitask.trials[tr].fetch_data().df\n", " df_tobj = df_t[df_t['metric_name'] == 'objective_noiseless']\n", " obj = np.hstack((obj, df_tobj['mean'].values))\n", " df_tcon = df_t[df_t['metric_name'] == 'constraint_noiseless']\n", " con = np.hstack((con, df_tcon['mean'].values))\n", " return obj, con" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 4c. Run both loops\n", "Run both Bayesian optimization loops and aggregate results." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "runners = {\n", " 'GP, online only': run_online_only_bo,\n", " 'MTGP, Algorithm 1': run_mtbo,\n", "}\n", "iteration_objectives = {k: [] for k in runners}\n", "iteration_constraints = {k: [] for k in runners}\n", "for rep in range(n_reps):\n", " print('Running rep', rep)\n", " for k, r in runners.items():\n", " obj, con = r()\n", " iteration_objectives[k].append(obj)\n", " iteration_constraints[k].append(con)\n", "\n", "for k, v in iteration_objectives.items():\n", " iteration_objectives[k] = np.array(v)\n", " iteration_constraints[k] = np.array(iteration_constraints[k])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5. Plot results\n", "\n", "We plot the cumulative best point found by each online iteration of the optimization for each of the methods. We see that despite the bias in the offline observations, incorporating them into the optimziation with the multi-task model allows the optimization to converge to the optimal point much faster. With n_reps=50, this generates Fig. S4 of the paper." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "bento_obj_id": "140622871869424" }, "output_type": "display_data" } ], "source": [ "means = {}\n", "sems = {}\n", "for m, obj in iteration_objectives.items():\n", " x = obj.copy()\n", " z = iteration_constraints[m].copy()\n", " x[z > 1.25] = np.Inf # The value of infeasible points\n", " best_obj = np.array([np.minimum.accumulate(obj_i) for obj_i in x])\n", " means[m] = best_obj.mean(axis=0)\n", " sems[m] = best_obj.std(axis=0) / np.sqrt(best_obj.shape[0])\n", "\n", "fig = plt.figure(figsize=(12, 6))\n", "ax = fig.add_subplot(111)\n", "x = np.arange(1, len(means['GP, online only']) + 1)\n", "colors = ['firebrick', 'steelblue']\n", "methods = ['GP, online only', 'MTGP, Algorithm 1']\n", "for i, m in enumerate(methods):\n", " ax.plot(x, means[m], ls='-', c=colors[i])\n", " ax.fill_between(x, means[m] - 2 * sems[m], means[m] + 2 * sems[m], color=colors[i], alpha=0.3)\n", "ax.legend(methods)\n", "ax.axhline(y=-3.32237, c='k', ls='--') # Actual optimum for this problem\n", "ax.set_xlabel('Online iteration')\n", "ax.set_ylabel('Best-feasible objective value')\n", "ax.set_title('Bayesian optimization performance');" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "#### References\n", "Benjamin Letham and Eytan Bakshy. Bayesian optimization for policy search via online-offline experimentation. _arXiv preprint arXiv:1603.09326_, 2019.\n", "\n", "Kevin Swersky, Jasper Snoek, and Ryan P Adams. Multi-task Bayesian optimization. In _Advances in Neural Information Processing Systems_ 26, NIPS, pages 2004–2012, 2013." ] } ], "metadata": { "kernelspec": { "display_name": "python3", "language": "python", "name": "python3" } }, "nbformat": 4, "nbformat_minor": 2 }