[AutoML] Searching algorithm for HPO: Bayesian Optimization

2021. 8. 2. 19:00스터디/AutoML

본 글은 다음의 글을 참조하여 작성되었습니다.

1. [2019] 하이퍼파라미터 튜닝으로 모델 성능 개선하기

2. 베이즈 확률론

 

이번 글은 Bayesian Optimization에 대하여 간략히 소개하며, 이를 실행할 수 있는 Python 코드 예시를 공유하고자 한다.

 

하이퍼 파라미터 최적화(HPO, Hyper-Parameter Optimization)를 수행하기 위해 사용되는 Searching algorithm은 대표적으로 다음 3가지가 일반적으로 소개 된다.

 

- Grid Search

- Random Search

- Bayesian Optimization

 

그 중 Grid Search와 Random Search는 다음 글에 소개하였다.

 

Blackbox HPO(1): Grid search와 Random search

이 글은 * Automated Machine Learning(2019; Hutter F., Kotthoff L., Vanschoren J., Springer) * 을 참조하여 작성되었습니다. 또한, 그림은 제가 직접 작성하였음을 알려드립니다. 안녕하세요 :) 이번 글에서..

optilog.tistory.com

 

 

이번 글에서 소개할 Bayesian Optimization(BO)는 Bayesian Probability를 토대로 만들어진 최적 하이퍼파라미터 탐색 방법론이다.

 

Bayesian Probability

H는 가설, D는 데이터이다.

이 때, 우리가 알고자 하는 것은 데이터가 있을 때 가설이 옳을 확률 P(H|D)이다.

P(H|D)는 사후확률(Posterior Probability)라고 정의된다.

Bayes Rule에 의해 위의 수식이 얻어지며, 각각의 요소를 산출하여 최종적으로 P(H|D)를 얻을 수 있다.

 

각 요소는 다음과 같다.

P(H)는 사전확률(Prior Probability)로 D를 고려하지 않은 H의 확률이다.

P(D)는 경계확률이라 표현하며, D의 분포로부터 얻어진 확률이다.

P(D|H)는 가능도(Likelihood)로 H가 참(True)일 때 D가 발생할 확률이다.

 

 


 

알고리즘이 어떻게 실행되는지 살펴보기 이전에 BO에서 사용되는 Acquisition function를 이해해야 한다.

 

Acquisition function

Acquisition function은 다음에 탐색할 하이퍼 파라미터를 결정할 때 활용되는 함수이다.

일반적으로 이 함수에서 얻어진 값 중 최대값을 갖는 하이퍼 파라미터 셋을 선택하여 탐색을 수행한다.

대표적인 Acqusition function으로는 Expected Improvement와 Probability of Improvement가 있다.

 

* 추후 별도 정리 예정 *

 

Progress

1. 목적함수의 사전분포를 구한다.

2. 목적함수에서 최적값을 갖는 하이퍼 파라미터 셋을 도출한다.

3. 현재의 목적함수에서 Acquisition function을 계산하고 탐색할 하이퍼 파라미터 셋을 결정한다.

4. 결정된 하이퍼 파라미터 셋의 목적함수 값을 얻는다.

5. 목적함수의 분포 모델을 업데이트 한다.

 

Python Example

다음 코드는 X의 범위가 -2~10일 때, X * sin(X)를 최대화하는 X 값을 찾는 문제이다.

from scipy.stats import norm
import numpy as np
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF


# 1. Acquisition function
def expected_improvement(mean, std, max):
	z = (mean - max ) / std
	return (mean-max) * norm.cdf(z) + std * norm.pdf(z)

# 2. Objective function
def f(x):
	return x * np.sin(x)

# 3. Hyper-parameter space
min_x, max_x = -2, 10

# 4. Observation Data
X = np.random.uniform(min_x, max_x, 3).reshape(-1,1)
y = f(X).ravel()

# 5. Instantiate Gaussian Process model
model = GaussianProcessRegressor(kernel=RBF(1.0))

for i in np.arange(10):
	# 6. Fit to data
    model.fit(X, y)
    
    # 7. Acquisition Function
    xs = np.random.uniform(min_x, max_x, 10000)
    mean, std = model.predict(xs.reshape(-1,1), return_std=True)
    acq = expected_improvement(mean, std, y.max())
    
    # 8. Query Objective Function
    x_new = xs[acq.argmax()]
    y_new = f(x_new)
    
    # 9. Augment Data
    X = np.append(X, np.array([x_new])).reshape(-1,1)
    y = np.append(y, np.array([y_new]))


# 9. Get optimal result
print("Optimal")
print("X: ",X[y.argmax()][0])
print("y: ",y.max())

해당 코드는 Acquisition Function을 EI(Expected Improvement)로 설정하여 수행된 최적화이다.

최적 결과는 다음과 같이 출력되었다.

이 때 수행된 최적화는 연속값에 대해 수행되다보니, X값은 7~8사이의 값이 관찰되었다.

 

'스터디 > AutoML' 카테고리의 다른 글

[AutoML] Multivariate Bayesian Optimization  (0) 2021.08.04
Blackbox HPO(1): Grid search와 Random search  (0) 2020.04.18