-
-
Notifications
You must be signed in to change notification settings - Fork 229
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
## Features * [BOinG](https://arxiv.org/abs/2111.05834): A two-stage Bayesian optimization approach to allow the optimizer to focus on the most promising regions. * [TurBO](https://arxiv.org/abs/1910.01739): Reimplementaion of TurBO-1 algorithm. * Updated pSMAC: Can pass arbitrary SMAC facades now. Added example and fixed tests. ## Improvements * Enabled caching for multi-objectives (#872). Costs are now normalized in `get_cost` or optionally in `average_cost`/`sum_cost`/`min_cost` to receive a single float value. Therefore, the cached cost values do not need to be updated everytime a new entry to the runhistory was added. ## Interface changes * We changed the location of Gaussian processes and random forests. They are in the folders `epm/gaussian_process` and `epm/random_forest` now. * Also, we restructured the optimizer folder and therefore the location of the acquisition functions and configuration chooser. * Multi-objective functions are located in the folder `multi_objective`. * pSMAC facade was moved to the facade directory. Co-authored-by: Difan Deng <[email protected]> Co-authored-by: Eddie Bergman <[email protected]> Co-authored-by: Carolin Benjamins <[email protected]> Co-authored-by: timruhkopf <[email protected]>
- Loading branch information
1 parent
99d1129
commit 83a9bbe
Showing
111 changed files
with
7,815 additions
and
894 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -137,3 +137,6 @@ dmypy.json | |
|
||
# macOS files | ||
.DS_Store | ||
|
||
# Remove docker files | ||
docker |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
""" | ||
Synthetic Function with BOinG as optimizer | ||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
An example of applying SMAC with BO inside Grove (BOinG) to optimize a | ||
synthetic function (2d rosenbrock function). | ||
BOinG optimizer requires a SMAC4BOING wrapper to optimize the target algorithm. It is a two stage BO algorithm. | ||
In the first stage, BOinG constructs an RF to capture the global loss landscape. Then in the second stage, it only | ||
optimizes inside a subregion near the candidate suggested by the RF model with a GP model to focus only on the most | ||
promising region. | ||
""" | ||
|
||
import logging | ||
|
||
import numpy as np | ||
from ConfigSpace import ConfigurationSpace | ||
from ConfigSpace.hyperparameters import UniformFloatHyperparameter | ||
|
||
from smac.facade.smac_boing_facade import SMAC4BOING | ||
|
||
# Import SMAC-utilities | ||
from smac.scenario.scenario import Scenario | ||
|
||
|
||
def rosenbrock_2d(x): | ||
"""The 2 dimensional Rosenbrock function as a toy model | ||
The Rosenbrock function is well know in the optimization community and | ||
often serves as a toy problem. It can be defined for arbitrary | ||
dimensions. The minimium is always at x_i = 1 with a function value of | ||
zero. All input parameters are continuous. The search domain for | ||
all x's is the interval [-5, 10]. | ||
""" | ||
x1 = x["x0"] | ||
x2 = x["x1"] | ||
|
||
val = 100.0 * (x2 - x1**2.0) ** 2.0 + (1 - x1) ** 2.0 | ||
return val | ||
|
||
|
||
if __name__ == "__main__": | ||
logging.basicConfig(level=logging.INFO) # logging.DEBUG for debug output | ||
|
||
# Build Configuration Space which defines all parameters and their ranges | ||
cs = ConfigurationSpace() | ||
x0 = UniformFloatHyperparameter("x0", -5, 10, default_value=-3) | ||
x1 = UniformFloatHyperparameter("x1", -5, 10, default_value=-4) | ||
cs.add_hyperparameters([x0, x1]) | ||
# Scenario object | ||
scenario = Scenario( | ||
{ | ||
"run_obj": "quality", # we optimize quality (alternatively runtime) | ||
"runcount-limit": 20, | ||
# max. number of function evaluations; for this example set to a low number | ||
"cs": cs, # configuration space | ||
"deterministic": "true", | ||
} | ||
) | ||
|
||
# Example call of the function | ||
# It returns: Status, Cost, Runtime, Additional Infos | ||
def_value = rosenbrock_2d(cs.get_default_configuration()) | ||
print("Default Value: %.2f" % def_value) | ||
|
||
# Optimize, using a SMAC-object | ||
print("Optimizing! Depending on your machine, this might take a few minutes.") | ||
|
||
smac = SMAC4BOING( | ||
scenario=scenario, | ||
rng=np.random.RandomState(42), | ||
tae_runner=rosenbrock_2d, | ||
) | ||
|
||
smac.optimize() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
""" | ||
Synthetic Function with few Hyperparameters | ||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
An example of applying SMAC to optimize a synthetic function (2d rosenbrock function). | ||
We use the pSMAC [1]_ facade to demonstrate the parallelization of SMAC. | ||
Other than that, we use a :term:`Gaussian Process<GP>` to optimize our black-box | ||
function. | ||
.. [1] Ramage, S. E. A. (2015). Advances in meta-algorithmic software libraries for | ||
distributed automated algorithm configuration (T). University of British | ||
Columbia. Retrieved from | ||
https://open.library.ubc.ca/collections/ubctheses/24/items/1.0167184. | ||
""" | ||
import importlib | ||
|
||
import logging | ||
|
||
logging.basicConfig(level=logging.INFO) | ||
|
||
import numpy as np | ||
from ConfigSpace.hyperparameters import UniformFloatHyperparameter | ||
|
||
# Import ConfigSpace and different types of parameters | ||
from smac.configspace import ConfigurationSpace | ||
from smac.facade.psmac_facade import PSMAC | ||
from smac.facade.smac_bb_facade import SMAC4BB | ||
import smac | ||
|
||
importlib.reload(smac.facade.psmac_facade) | ||
from smac.facade.psmac_facade import PSMAC | ||
|
||
from smac.optimizer.acquisition import EI | ||
|
||
# Import SMAC-utilities | ||
from smac.scenario.scenario import Scenario | ||
|
||
__copyright__ = "Copyright 2021, AutoML.org Freiburg-Hannover" | ||
__license__ = "3-clause BSD" | ||
|
||
|
||
def rosenbrock_2d(x): | ||
"""The 2 dimensional Rosenbrock function as a toy model | ||
The Rosenbrock function is well know in the optimization community and | ||
often serves as a toy problem. It can be defined for arbitrary | ||
dimensions. The minimium is always at x_i = 1 with a function value of | ||
zero. All input parameters are continuous. The search domain for | ||
all x's is the interval [-5, 10]. | ||
""" | ||
|
||
x1 = x["x0"] | ||
x2 = x["x1"] | ||
|
||
val = 100.0 * (x2 - x1**2.0) ** 2.0 + (1 - x1) ** 2.0 | ||
return val | ||
|
||
|
||
if __name__ == "__main__": | ||
# Build Configuration Space which defines all parameters and their ranges | ||
cs = ConfigurationSpace() | ||
x0 = UniformFloatHyperparameter("x0", -5, 10, default_value=-3) | ||
x1 = UniformFloatHyperparameter("x1", -5, 10, default_value=-4) | ||
cs.add_hyperparameters([x0, x1]) | ||
|
||
# Scenario object | ||
scenario = Scenario( | ||
{ | ||
"run_obj": "quality", # we optimize quality (alternatively runtime) | ||
"runcount-limit": 20, # max. number of function evaluations PER WORKER | ||
"cs": cs, # configuration space | ||
"deterministic": True, | ||
} | ||
) | ||
|
||
# Use 'gp' or 'gp_mcmc' here | ||
model_type = "gp" | ||
|
||
# Example call of the function | ||
# It returns: Status, Cost, Runtime, Additional Infos | ||
def_value = rosenbrock_2d(cs.get_default_configuration()) | ||
print("Default Value: %.2f" % def_value) | ||
|
||
# Optimize, using a SMAC-object | ||
print("Optimizing! Depending on your machine, this might take a few minutes.") | ||
smac = PSMAC( | ||
scenario=scenario, | ||
facade_class=SMAC4BB, | ||
model_type=model_type, | ||
rng=np.random.RandomState(42), | ||
acquisition_function=EI, # or others like PI, LCB as acquisition functions | ||
tae_runner=rosenbrock_2d, | ||
n_workers=2, # 2 parallel workers | ||
) | ||
|
||
incumbent = smac.optimize() | ||
# Get trajectory of optimization (incumbent over time) | ||
trajectory_json = smac.get_trajectory() # trajectory in json format | ||
|
||
# Plot trajectory: cost of incumbent against number of evaluations | ||
# import matplotlib.pyplot as plt | ||
# X = [t["evaluations"] for t in trajectory_json] | ||
# Y = [t["cost"] for t in trajectory_json] | ||
# plt.plot(X, Y) | ||
# plt.yscale("log") | ||
# plt.xlabel("Number of Evaluations") | ||
# plt.ylabel("Cost of Incumbent") | ||
# plt.show() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
""" | ||
Synthetic Function with TuRBO as optimizer | ||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
An example of applying SMAC with trust region BO (TuRBO) to optimize a | ||
synthetic function (2d rosenbrock function). | ||
Eriksson et al. Scalable Global Optimization via Local {Bayesian} Optimization, | ||
http://papers.nips.cc/paper/8788-scalable-global-optimization-via-local-bayesian-optimization.pdf | ||
TurBO gradually shrinks its search space to the vicinity of the optimum configuration that is ever optimized. | ||
TuRBO optimizer requires EPMChooserTurBO to suggest the next configuration. Currently, it only supports pure numerical | ||
hyperparameters. | ||
""" | ||
|
||
import logging | ||
|
||
import numpy as np | ||
from ConfigSpace.hyperparameters import UniformFloatHyperparameter | ||
|
||
# Import ConfigSpace and different types of parameters | ||
from smac.configspace import ConfigurationSpace | ||
from smac.facade.smac_bb_facade import SMAC4BB | ||
from smac.optimizer.configuration_chooser.turbo_chooser import TurBOChooser | ||
|
||
# Import SMAC-utilities | ||
from smac.scenario.scenario import Scenario | ||
|
||
|
||
def rosenbrock_2d(x): | ||
"""The 2 dimensional Rosenbrock function as a toy model | ||
The Rosenbrock function is well know in the optimization community and | ||
often serves as a toy problem. It can be defined for arbitrary | ||
dimensions. The minimium is always at x_i = 1 with a function value of | ||
zero. All input parameters are continuous. The search domain for | ||
all x's is the interval [-5, 10]. | ||
""" | ||
x1 = x["x0"] | ||
x2 = x["x1"] | ||
|
||
val = 100.0 * (x2 - x1**2.0) ** 2.0 + (1 - x1) ** 2.0 | ||
return val | ||
|
||
|
||
if __name__ == "__main__": | ||
logging.basicConfig(level=logging.INFO) # logging.DEBUG for debug output | ||
|
||
# Build Configuration Space which defines all parameters and their ranges | ||
cs = ConfigurationSpace() | ||
x0 = UniformFloatHyperparameter("x0", -5, 10, default_value=-3) | ||
x1 = UniformFloatHyperparameter("x1", -5, 10, default_value=-4) | ||
cs.add_hyperparameters([x0, x1]) | ||
|
||
# Scenario object | ||
scenario = Scenario( | ||
{ | ||
"run_obj": "quality", # we optimize quality (alternatively runtime) | ||
"runcount-limit": 100, | ||
"cs": cs, # configuration space | ||
"deterministic": "true", | ||
} | ||
) | ||
|
||
# Example call of the function | ||
# It returns: Status, Cost, Runtime, Additional Infos | ||
def_value = rosenbrock_2d(cs.get_default_configuration()) | ||
print("Default Value: %.2f" % def_value) | ||
|
||
# Optimize, using a SMAC-object | ||
print("Optimizing! Depending on your machine, this might take a few minutes.") | ||
smac = SMAC4BB( | ||
scenario=scenario, | ||
rng=np.random.RandomState(42), | ||
model_type="gp", | ||
smbo_kwargs={"epm_chooser": TurBOChooser}, | ||
initial_design_kwargs={"init_budget": 0}, | ||
tae_runner=rosenbrock_2d, | ||
) | ||
|
||
smac.optimize() |
Oops, something went wrong.