pytorch / botorch

Bayesian optimization in PyTorch
https://botorch.org/
MIT License
3.08k stars 395 forks source link

Questions/Ideas to Chebyshev scalarization #1722

Closed jduerholt closed 1 year ago

jduerholt commented 1 year ago

Issue description

I have two questions/ideas regarding the Chebyshev scalarization:

Best,

Johannes

sdaulton commented 1 year ago

Hi Johannes,

Is this also necessary for the Chebyshev scalarization? Or does the scalarization internally transform it in a way that it is not necessary to pass feasible_cost?

Yes using an infeasability cost would still be necessary because the values are not necessarily strictly positive (in fact they will typically be negative for maximization in the current implementation). Note: you may want to pass only the feasible Y values values to get_chebyshev_scalarization because the normalization bounds in get_chebyshev_scalarization are defined to adequately cover the Pareto frontier and in the constrained case, we are generally only interested in the feasible Pareto frontier.

. A different example could be that one wants to minimize the quadratic/absolute distance to a specific point. ... To make get_chebyshev_scalarization more versatile, one would have to extend it in a way that it takes as input for every single objective a callable and then applies the scalarization to the output of the callable. What do you think about this?

If you want to minimize a quadratic/absolute distance to a specific point, why not just write a custom function to do this? Call this dist_transform this can be applied to some subset of the M measured outputs to obtain M' transformed outputs. If M'>1 and you still want to use a chebyshev objective, then you can create the chebyshev objective using transformed outputs and apply the entire objective in sequence to new predicted outputs Y as:

Y_tf = dist_transform(Y)
obj = chebyshev_obj(Y_tf)

This entire objective can be passed to an acquisition function simply by making it a GenericMCObjective. E.g. GenericMCObjective(lambda Y, X: chebyshev_obj(dist_transform(Y))).

I'm don't think we should overload the functionality of get_chebyshev_scalarization unless there are use cases that we can't currently support.

Returning to the first question. The another approach for constrained multi-objective BO would be to use feasibility weighted outputs. E.g. Apply feasiblity weighting (with an infeasible cost) to your objectives, call this feas_weight. Then create a chebyshev scalarization with only the feasible values. And then apply both in sequence to new outputs Y.

chebyshev_scalarization(feas_weight(Y)).

This is the technique used in https://proceedings.mlr.press/v162/daulton22a/daulton22a.pdf in Appendix F.3, in the context of robust optimization under input noise.