We-Co

[We-Co] Hyperparameter Tuning - Bayesian Oprimization 본문

Spark

[We-Co] Hyperparameter Tuning - Bayesian Oprimization

위기의코딩맨 2022. 3. 18. 15:27
반응형

안녕하세요. 위기의 코딩맨입니다.

오늘은 하이퍼 파라미터를 설정하는 방법들을 알아보도록 하게습니다.

[ Grid Search ]

모델의 가장 적합한 하이퍼 파라미터를 찾기 위해서 모든 값들의 조합을 이용하여

가장 높은 성능의 하이퍼 파라미터를 찾는 탐색 방법입니다.

maxD = [ 1, 3 ,5 ,7, 9 ]

colS = [ 0.5, 0.7, 0.9 ]

 

1 = [ 0,5 ] , 1 = [ 0. 7 ] 1 = [ 0. 9 ] .... 9 = [ 0.7 ] 9 = [ 0.9 ]

 

총 5 * 3, 즉 15개의 조합을 이용하여 최적의 성능을 찾는 방법입니다.

 

해당 방법은 모든 조합을 탐색하지만

Random Search 방법을 사용하면 설정한 조합만큼 꺼낼 수 있습니다.

 

예를들면, Random Search의 값을 4로 설정하면

15개의 조합에서 랜덤으로 4개의 조합을 꺼내와 최적의 성능을 찾는 방법입니다.

 

해당 방법은 성능이 좋아지는 것을 확인할 수 있지만,

범위가 넓으면 그 사이의 값을 알 수 있는 방법이 없습니다. 

또한, 튜닝하기 위한 하이퍼 파라미터 개수가 무수히 많아지면 굉장한 시간 비용이 필요하게 됩니다.

이러한 문제를 해결하기 위해

Bayesian Optimization을 사용하시면 됩니다.

 

[ Bayesian Oprimization ]

간단하게 설명하면 미지의 함수가 반환하는 값 X의 최대, 최소값을

짧은 반복을 통해서 최적의 값을 찾는 목적을 갖는 방식입니다.

 

Bayesian optimization은 2가지 요소가 존재합니다.

 

1. Surrogate Model 

        지금까지 조사된 입력값-함수의 결과 값 (x1, f(x1)),...,(xt, f(xt)) 의 바탕으로 미지의 목적 함수의 형태를

        확률적인 추정을 수행하는 모델을 의미합니다.

 

2. Acquisition Function

        목적 함수에 대한 현재까지의 추정 결과를 바탕으로 가장 최적한 입력값을 찾기 위해 사용할 만한 다음 입력값을          추천하는 함수를 의미합니다. 초록색 부분이 Acquistion Function이며, Dectision을 담당하는 부분입니다.

[출처 : https://mambo-coding-note.tistory.com/284 ]

하이퍼 파라미터, 탐색 대상 함수를 쌍으로 만든 후, 이를 대상으로 Surrogate Model을 만들어 평가를 통해 순차적으로 값에 적용해가며 최적의 하이퍼 파라미터의 조합을 탐색하게 됩니다.

 

수행과정을 나타낸 이미지입니다.

수행과정

* 파란선 - 찾고자하는 목적함수 f(x)

* 검정색 점선 - 현재까지 관측된 데이터를 바탕으로 예측한 Estimated Function

* 파란색 영역 - 목적함수 f(x)가 존재할만한 Confidenc Bound

 

DI(x) - Acquistion Function을 의미하며 다음 입력값 후보를 추천할 때 사용합니다.

 

Bayesian Optimization 단계

1. 입력값, 목적함수 등 설정값을 정의합니다.

    * 입력값 x : 학습률

    * 목적함수f(x) : 학습률을 적용하여 학습한 모델의 검증 데이터에 대한 성능 결과수치

    * 입력값 x의 탐색 대상 구간 : (a, b)

    * 처음 조사할 입력값- 함수값 점들의 객수 : n

    * 마지막 차례까지 조사할 입력값-함수값 점들의 최대 갯수 : N

 

2. 탐색 대상 구간(a,b)안에서 처음 n개의 입력값들을 랜덤하게 샘플링하고 선택합니다.

3. 선택한 n개의 입력 값 x1,~xn를 각각의 학습률 값으로 설정하고, 모델을 학습한 뒤에 검증 데이터 셋을 사용하여

   학습이 완료된 모델의 성능 결과 수치를 계산합니다.

    * 각각 함수 값 f(1)..f(xn)으로 간주

4. 입력값과 함수값 점들을 (x1,f(x1))...(xn,f(xn))에 대하여 Surrogate Model로 확률적 추정을 수행

5. 입력값, 함수값 점들이 총 n개 까지 도달할 때 까지, 해당 과정을 반복 수행

    * 기존 입력값, 함수값의 모음에 대해서 Surrogate Model을 확률적 추정 결과를 바탕으로 입력 값 구간 (a,b)내에서

      El의 값을 계산하고, 그 값이 가장 큰 점을 다음 입력값 후보 x1로 설정합니다.

    * x1를 하이퍼파라미터로 설정하고 모델을 학습을 진행, 학습이 완료되면 성능 결과 수치를 계산하고 f(x1)으로 간주

    * 새로운 입력 값과 함수값을 모음에 추가하고, 갱신된 점들의 모음에 대해서

       Surrogate Model로 확률적 추정을 다시 수행

6. 총 N개의 입력값과 함수값 결과의 점들에 대해서 확률적으로 추정된 목적 함수 결과를 바탕으로

   평균 함수 μ(x) 을 최대로 만드는 최적해를 최종 선택합니다. 추후 해당값을 하이퍼파라미터로 사용하여

   모델을 학습하면, 일반화 성능이 극대화된 모델을 얻을 수 있습니다.

 

 

[ 예제 ]

HyperOpt를 사용하여 예제를 풀어보도록 하겠습니다.

일단 HyperOpt는 Bayesian Optimization에 최적화된 접근 방식을 취합니다.

먼저, HyperOpt의 예제를 살펴보겠습니다. 해당 예제는 최소의 값의 확률을 찾는 문제입니다.

x의 제곱 값을 -5~5 범위에서 가장 작은 값은 무엇일까 하는 문제입니다.

from hyperopt import fmin, tpe, hp, STATUS_OK

def objective(x):
    print('x:', x)
    return {'loss': x ** 2, 'status': STATUS_OK }

Best_Num = fmin(objective,
    space=hp.uniform('x', -5, 5),
    algo=tpe.suggest,
    max_evals=100)

print('best:', Best_Num)

 

사용하기 위한 함수를 import를 진행해주도록 합니다.

objective()함수를 설정하고 x의 값을 인자로 받도록 합니다.

hp.uniform은 해당 사이의 값을 소수점을 포함한 값을 지정할 때 사용합니다.

hp.quniform()을 사용하여 간격을 주어 정수형 값만 받도록 할 수 도 있습니다.

fmin을 사용하여 지정해주는 알고리즘과 최대 반복 횟수등을 변경해 보면서 성능을 도와주는 함수입니다.

tpe.suggest의 알고리즘을 사용하고 100번을 돌아서 최적의 값을 찾도록 하는 것입니다.

결과

결과는 당연히 0에 가까운 값이 나오는 것을 확인할 수 있습니다.

 

from hyperopt import fmin, tpe, hp, STATUS_OK, Trials

def HyperOPT(search_dict):
    x = search_dict['max_depth']
    y = search_dict['learning_rate']
    return {'loss': x ** 2 + y*20, 'status': STATUS_OK, 'x':x, 'y':y }

S_space = {'max_depth': hp.quniform('max_depth', 5, 15, 1), 
                'learning_rate': hp.uniform('learning_rate', 0.01, 0.1)} 
trials = Trials()

best = fmin(fn=HyperOPT, space=S_space, algo=tpe.suggest, max_evals=5, trials=trials)
print('best:', best)

하이퍼파라미터의 대표적인 max_Depth과 Learning_Rate를 구하는 코드입니다.

해당 loss의 최적의 Learning_Rate, max_depth의 반환값을 확인할 수 있습니다.

 

오늘은 Bayesian Oprimization를 간단하게 알아보았으며 HyperOpt를 활용한 예제도 간단하게 풀어보았습니다.

반응형