Bayesian optimization by 바죠

Bayesian optimization
https://en.wikipedia.org/wiki/Bayesian_optimization
https://machinelearningmastery.com/what-is-bayesian-optimization/
https://scikit-optimize.github.io/stable/auto_examples/hyperparameter-optimization.html#sphx-glr-auto-examples-hyperparameter-optimization-py
베이즈 확률론(Bayesian probability)은 확률을 '지식 또는 믿음의 정도를 나타내는 양'으로 해석하는 확률론이다.
확률을 발생 빈도(frequency)나 어떤 시스템의 물리적 속성으로 여기는 것과는 다른 해석이다. 
18세기 통계학자 토머스 베이즈의 이름을 따서 명명되었다.
어떤 가설의 확률을 평가하기 위해서 사전 확률을 먼저 밝히고 새로운 관련 데이터에 의한 새로운 확률값을 변경한다.
베이즈 통계학 (Bayesian statistics)은 하나의 사건에서의 믿음의 정도 (degree of belief)를 확률로 나타내는 베이즈 확률론에 기반한 통계학 이론이다. 
믿음의 정도는 이전 실험에 대한 결과, 또는 그 사건에 대한 개인적 믿음 등, 그 사건에 대한 사전 지식에 기반할 수 있다. 
이것은 확률을 많은 시도 후의 사건의 상대적 빈도의 극한으로 보는 빈도주의자 (frequentist) 등 많은 다른 확률에 대한 해석과는 차이가 있다. 어떠한 경우는 동일한 해석을 주기도 한다.

확보된 데이터와 평가지표의 숨겨진 관계를 모델링하는 Surrogate model
Surrogate model을 활용해 다음 탐색할 지점을 결정하는 Acquisition function
여러가지 hyperparameter tuning을 진행할 때 기존의 grid search, random search를 대체하는데 사용 가능하다.

기계학습에서 나오는 데이터들에 대한 피팅과정은 데이터의 연속성을 보장할리 없다. 예를 들어, cross validation하는 과정인데, 목적함수 loss 함수가 연속일 거라고 생각하기 쉽지 않다. 더욱기 유한한 데이터를 활용하고 있다.
BO는 기계학습을 이용하여 최적화를 하는 방법이다. 
최적의 해가 있을 법한 곳을 기계학습으로 예측하는 것이 핵심이다.
많은 경우에 BO를 사용한다. 하지만, BO가 잘 적용되는 분야를 파악해 두어야 한다.
BO 가 적용되는 조건은 아래와 같다.
* serial algorithm [sequential model-based optimization]
* gradient free
* relatively low dimensional systems
* very expensive objective function, even noisy
* surrogate model
너무 많은 objective function 실행을 피할 경우에만 유용한 알고리듬이다.
측정한 data 가 너무 많은 것을 가정하지 않는다.
즉, objective function 실행이 너무 비싼 비용이 드는 경우에 해당한다.
surrogate model를 만들 때 부담이 될 수 있다.
차원이 그렇게 높은 경우에는 사용되는 것이 아니다.
gradient를 활용한 local minimization을 활용하는 방법이 아니다.
병렬 계산이 될 수 있게 함. 덩어리 형태로 계산하고, 덩어리 형태로 Gaussian process로 훈련하면 됨.
즉, 구조 하나를 찾아내고, 예측하는 방식을 취하지 말고, 덩어리 형식으로 일을 진행할 수 있음.
surrogate model, 즉, 기계학습으로 새로운 위치를 제안할 수 있다는 것이 핵심이다.


https://journals.aps.org/prmaterials/pdf/10.1103/PhysRevMaterials.2.013803
https://github.com/Tomoki-YAMASHITA/CrySPY/tree/master/CrySPY/BO
http://krasserm.github.io/2018/03/21/bayesian-optimization/
https://arxiv.org/pdf/1807.02811.pdf
https://en.wikipedia.org/wiki/Thompson_sampling

Bayesian optimization is an approach to optimizing objective functions that take a long time (minutes or hours) to evaluate.
It is best-suited for optimization over continuous domains of less than 20 dimensions, and tolerates stochastic noise in function evaluations.
It builds a surrogate for the objective and quantifies the uncertainty in that surrogate using a Bayesian machine learning technique,
Gaussian process regression, and then uses an acquisition function defined from this surrogate to decide where to sample.
In this tutorial, we describe how Bayesian optimization works,
including Gaussian process regression and three common acquisition functions:
expected improvement, entropy search, and knowledge gradient.
We then discuss more advanced techniques, including running multiple function evaluations in parallel,
multi-fidelity and multi-information source optimization, expensive-to-evaluate constraints, random environmental conditions,
multi-task Bayesian optimization, and the inclusion of derivative information.
We conclude with a discussion of Bayesian optimization software and future research directions in the field.
Within our tutorial material we provide a generalization of expected improvement to noisy evaluations, beyond the noise-free setting where it is more commonly applied.
This generalization is justified by a formal decision-theoretic argument, standing in contrast to previous ad hoc modifications.
Surrogate model
---------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------

#!/usr/bin/env python
# coding: utf-8

get_ipython().run_line_magic('matplotlib', 'inline')


# # Tuning a scikit-learn estimator with `skopt`
# Gilles Louppe, July 2016
# Katie Malone, August 2016
# Reformatted by Holger Nahrstaedt 2020
# .. currentmodule:: skopt
# If you are looking for a :obj:`sklearn.model_selection.GridSearchCV` replacement checkout
# `sphx_glr_auto_examples_sklearn-gridsearchcv-replacement.py` instead.
# ## Problem statement
# Tuning the hyper-parameters of a machine learning model is often carried out
# using an exhaustive exploration of (a subset of) the space all hyper-parameter
# configurations (e.g., using :obj:`sklearn.model_selection.GridSearchCV`), which
# often results in a very time consuming operation.
# In this notebook, we illustrate how to couple :class:`gp_minimize` with sklearn's
# estimators to tune hyper-parameters using sequential model-based optimisation,
# hopefully resulting in equivalent or better solutions, but within less
# evaluations.
# Note: scikit-optimize provides a dedicated interface for estimator tuning via
# :class:`BayesSearchCV` class which has a similar interface to those of
# :obj:`sklearn.model_selection.GridSearchCV`. This class uses functions of skopt to perform hyperparameter
# search efficiently. For example usage of this class, see
# `sphx_glr_auto_examples_sklearn-gridsearchcv-replacement.py`
# example notebook.

print(__doc__)
import numpy as np


# ## Objective
# To tune the hyper-parameters of our model we need to define a model,
# decide which parameters to optimize, and define the objective function
# we want to minimize.

from sklearn.datasets import load_boston
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import cross_val_score

boston = load_boston()
X, y = boston.data, boston.target
n_features = X.shape[1]

# gradient boosted trees tend to do well on problems like this
reg = GradientBoostingRegressor(n_estimators=50, random_state=0)


# Next, we need to define the bounds of the dimensions of the search space
# we want to explore and pick the objective. In this case the cross-validation
# mean absolute error of a gradient boosting regressor over the Boston
# dataset, as a function of its hyper-parameters.


from skopt.space import Real, Integer
from skopt.utils import use_named_args


# The list of hyper-parameters we want to optimize. For each one we define the
# bounds, the corresponding scikit-learn parameter name, as well as how to
# sample values from that dimension (`'log-uniform'` for the learning rate)
space  = [Integer(1, 5, name='max_depth'),
          Real(10**-5, 10**0, "log-uniform", name='learning_rate'),
          Integer(1, n_features, name='max_features'),
          Integer(2, 100, name='min_samples_split'),
          Integer(1, 100, name='min_samples_leaf')]

# this decorator allows your objective function to receive a the parameters as
# keyword arguments. This is particularly convenient when you want to set
# scikit-learn estimator parameters
@use_named_args(space)
def objective(**params):
    reg.set_params(**params)

    return -np.mean(cross_val_score(reg, X, y, cv=5, n_jobs=-1,
                                    scoring="neg_mean_absolute_error"))


# ## Optimize all the things!
# With these two pieces, we are now ready for sequential model-based
# optimisation. Here we use gaussian process-based optimisation.

from skopt import gp_minimize
res_gp = gp_minimize(objective, space, n_calls=50, random_state=0)

"Best score=%.4f" % res_gp.fun

# In[11]:

print("""Best parameters:
- max_depth=%d
- learning_rate=%.6f
- max_features=%d
- min_samples_split=%d
- min_samples_leaf=%d""" % (res_gp.x[0], res_gp.x[1],
                            res_gp.x[2], res_gp.x[3],
                            res_gp.x[4]))


# ## Convergence plot

from skopt.plots import plot_convergence
plot_convergence(res_gp)

-------------------------------------------------------------------------------------------------------------------

Best parameters:
- max_depth=5
- learning_rate=0.123703
- max_features=13
- min_samples_split=100
- min_samples_leaf=1

---------------------------------------------------------------------------------------------------------------------


확보된 데이터와 평가지표의 숨겨진 관계를 모델링하는 Surrogate model
Surrogate model을 활용해 다음 탐색할 지점을 결정하는 Acquisition function
여러가지 hyperparameter tuning을 진행할 때 기존의 grid search, random search를 대체하는데 사용 가능하다.



핑백

덧글

  • 2021/01/27 20:56 # 답글 비공개

    비공개 덧글입니다.
댓글 입력 영역

최근 포토로그



MathJax