본문 바로가기

Data Science/Machine Learning

베이지안 최적화(Bayesian Optimization)

이번 포스팅은 하이퍼파라미터 튜닝 방법으로 많이 사용되는 "베이지안 최적화(Bayesian Optimization)" 기법에 대해 설명해보도록 하겠다.

 

단, Bayesian Optimization 기법의 이론적인 내용을 깊게 들어가면 너무 어렵기 때문에, 큰 틀에서의 개념 정도만 이해하는 것을 이번 포스팅의 목표로 삼겠다. (솔직히 필자도 아직 이론적으로는 완벽하게 이해하지 못했다..)

 

물론 대표적인 하이퍼파라미터 튜닝 기법인 "그리드 서치(GridSearch)""랜덤 서치(RandomSearch)"를 사용해서 튜닝을 진행해 볼 수도 있다.

 

그러나 위 두 가지 방법은 아래와 같은 단점이 존재한다.

 

  • GridSearch의 단점
    • 모든 하이퍼파라미터 후보들에 대한 일반화 성능을 확인하기 때문에 시간이 너무 오래 걸림
  • RandomSearch의 단점
    • GridSearch에 비해 시간은 적게 걸리지만, 말 그대로 "랜덤"하게 몇 개만 뽑아서 확인해보는 식이라 정확도가 다소 떨어질 수 있음

반면, Bayesian Optimization은 그리드 서치와 랜덤 서치에 비해 효율적으로 최적값을 찾아낸다는 장점이 있다.

(그렇다고 해서 베이지안 최적화 기법이 Best라고 말할 수는 없다)

 

 

"Bayesian Optimization의 핵심은 사전 정보를 최적값 탐색에 반영하는 것이다!"

 

 

Bayesian Optimization에서 사전 정보를 바탕으로 탐색하기 위해선 다음과 같은 정보가 필요하다.

 

  1. 어떻게 모델 내에서 사전 정보를 학습하고 자동적으로 업데이트할까?
    • 정답: Surrogate Model
    • 기존 입력값(x1, f(x1)), (x2, f(x2)), ... , (xt, f(xt))들을 바탕으로, 미지의 목적 함수 f의 형태에 대한 확률적인 추정을 하는 모델
  2. 수집한 사전 정보를 바탕으로 어떤 기준으로 다음 탐색값을 찾을까?
    • 정답: Acquisition Function
    • Surrogate Model이 목적 함수에 대해 확률적으로 추정한 결과를 바탕으로, 바로 음 번에 탐색할 입력값 후보를 추천해 주는 함수
      • 최적값일 가능성이 높은 값 = Surrogate Model에서 함수값이 큰 값
      • 아직 Surrogate Model에서의 추정이 불확실한 값 = Surrogate Model에서 표준편차가 큰 값

솔직히 글로만 읽어서는 이해가 잘 안 될거라고 생각한다. (물론 내용이 어려워서 필자도 이해를 완벽하게 하기 힘들었음)

 

때문에 이해하기 쉽도록 그림을 통해 추가 설명을 해보도록 하겠다.

 

먼저 Surrogate Model은 쉽게 말해서, 아래와 같이 "하이퍼파라미터 집합""일반화 성능"의 관계를 모델링한 모델이라고 생각하면 된다.

 

Surrogate Model

 

또한 이 과정에서 다음 후보로 제일 유용한 하이퍼파라미터 집합을 구해야하는데, 이 때 사용되는 것이 바로 Acquisition Function이다.

 

Acquisition Function

 

Acquisition Function을 통해 제일 유용하다고 판단된 하이퍼파라미터 집합을 아래와 같이 추가해주고, 실제 일반화 성능도 확보하는 작업을 수행한다.

 

 

그 다음, "새롭게 추가된 하이퍼파라미터 집합을 포함한 하이퍼파라미터 집합""일반화 성능"의 관계를 Surrogate Model을 통해 다시 모델링하는 작업을 거친다.

 

 

여기까지 해서 Bayesian Optimization 기법의 작동 원리에 대해 핵심적인 내용들 위주로 간략하게 설명해보았다.

 

원활한 이해를 위해 지금까지 설명한 내용들을 하나의 그림으로 나타내보았다.

 

검은 점선은 실제 목적 함수, 검은 실선은 우리가 추정한 목적함수(Surrogate Model)를 의미한다. 또한, 파란 영역은 추정된 σ(x), 하단 녹색 실선은 Acquisition Function을 의미한다.

 

위 그림을 보면 Bayesian Optimization의 작동 원리를 보다 명확하게 이해할 수 있을 것이다.

 

  • t = 2일 때의 Acquisition Function이 최대화 되는 값은 t = 3 시점에서 새로 관찰할 점으로 들어가게 된다.
  • 이에 따라, t = 3에서 새로 관찰한 함수값 주변의 파란 영역이 크게 줄어들며, 동시에 Acquisition Function 또한 업데이트 된다.
  • 마찬가지로 t = 3의 Acquisition Function이 최대가 된 지점에서 t = 4의 새로운 관찰값이 생성되고, 그 주변의 파란 영역이 줄어들며 Acquisition Function이 다시 업데이트된다.
  • 이러한 과정이 계속 반복되면서 추정값이 실제 목적 함수에 근사하게 되고, 근사한 함수에서 최종 최적값을 찾을 수 있다.

 

마지막으로 베이지안 최적화(Bayesian Optimization) 기법에 대한 예시 코드를 첨부하였다.

(코드에 달린 주석들을 주의해서 살펴볼 것!!)

 

1. 목적 함수 생성

 

# 목적 함수 생성
def xgb_eval(learning_rate, max_depth, output = 'score'):
    params = {
        # n_estimators 값은 100으로 고정
        'n_estimators': 100,
        # 호출 시, 실수형 값들이 들어오므로 정수형 하이퍼 파라미터는 정수형으로 변경해줘야 함
        'learning_rate': learning_rate,
        'max_depth': int(round(max_depth))
    }
    
    xgb = XGBRegressor(**params, random_state = 1021)
    
    # Cross Validation
    neg_mse_scores = cross_val_score(xgb, X_features, y_target,
                                     scoring = 'neg_mean_squared_error',
                                     cv = 3)
    rmse_scores = np.sqrt(-1 * neg_mse_scores)
    mean_rmse = np.mean(rmse_scores)
    
    return -mean_rmse # BayesianOptimization의 maximize()를 사용하기 위해, RMSE 값을 음수로 반환

 

2. 하이퍼파라미터 입력 범위 설정

 

# 하이퍼 파라미터 입력 범위 설정
xgb_bayes_params = {
    'learning_rate': (0.01, 0.2),
    'max_depth': (6, 12)
}

 

3. 베이지안 최적화 수행

 

# 베이지안 최적화
model_bayes = BayesianOptimization(f = xgb_eval, pbounds = xgb_bayes_params, random_state = 1021)
# 목적 함수가 최대가 되는 최적해를 찾기
model_bayes.maximize(init_points = 5, n_iter = 25)
# 최종 도출된 최적해 확인
model_bayes.max

 

모델은 최적해를 위과 같은 방식으로 찾게 되는데, 여기서 "init_points"처음 탐색 횟수를 의미하며 "pbound"에서 설정한 구간 내에서 init_points 만큼 입력값을 샘플링하여 계산이 진행된다. 또한 "n_iter"연산 횟수를 의미한다.

 

위 예시에서는 처음 탐색 횟수를 5회로 설정했고, 25회(n_iter) 추가 반복하여 최적해를 찾는 것이다.

 

만약 데이터가 작고 모델이 가볍다면, init_points와 n_iter를 크게 설정하여 성능이 더 좋은 파라미터를 찾는 것이 좋다.

 

이상으로 "베이지안 최적화" 기법에 대한 포스팅을 마치도록 하겠다.

 

 

 

이 글을 작성하면서 정말 많은 분들의 블로그와 발표 자료를 참고하였는데, 자료들의 출처는 아래에 기재하도록 하겠다.

 

★ 참고 자료

1. shinminyong.tistory.com/37

 

하이퍼 파라미터 Bayesian Optimize

1. 들어가며 베이지안 최적화(Bayesian Optimize)를 통한 하이퍼 파라미터 최적화 방법을 소개해드리겠습니다. 요즘 대회들을 많이 참가하면서 모델 선택 및 Feature engineering이 어느정도 마무리 된 후

shinminyong.tistory.com

2. daheekwon.github.io/bayes_opt/

 

Bayesian Optimization

Data Science through Statistics

daheekwon.github.io

3. 고려대학교 DMQA 연구실 세미나 - 이민정님의 발표 자료