베이지안 최적화에서 TPE와 SMBO로 하이퍼파라미터 탐색하기

베이지안 최적화의 대리모형과 취득함수, TPE·GP·RF 기반 SMBO의 선택 기준과 하이퍼파라미터 탐색 운영 방법을 정리한다.

2026-08-14 · 최초 발행 2024-04-29

평가 비용이 큰 탐색에서 다음 후보를 고르는 법

학습이나 시뮬레이션 한 번의 비용이 크고 목적함수가 미분 불가능하거나 노이즈를 가진다면, 모든 조합을 평가하는 방식은 빠르게 한계에 닿는다. 베이지안 최적화(Bayesian Optimization)는 목적함수 f(x)를 직접 반복 호출하는 대신, 지금까지의 관측으로 대리모형(surrogate model)을 만들고 다음 평가 지점을 순차적으로 결정한다.

Sequential Model-Based Optimization(SMBO)은 이 과정을 포괄하는 알고리즘 계열이다. 관측 데이터를 이용해 대리모형을 갱신하고, 취득함수(acquisition function)가 가장 유망하다고 보는 후보를 다음 실행 대상으로 선택한다. Gaussian Process(GP), Random Forest(RF), TPE(Tree-structured Parzen Estimators)가 대표적인 대리모형이다.

TPE는 p(y|x)가 아니라 p(x|y)를 추정한다. 성능 임계값 γ를 기준으로 상위 성능 집합 l(x)=p(x|y<y*)와 하위 성능 집합 g(x)=p(x|y≥y*)을 구성하고, l(x)/g(x) 비율이 큰 x를 선택한다. 트리 구조를 가진 조건부 하이퍼파라미터 공간, 이산 변수, 고차원 공간에서 특히 유용하다.

대리모형과 취득함수가 나누는 역할

대리모형은 목적함수의 전역 구조를 확률적으로 근사한다. GP는 연속적이고 저차원인 공간에 강점이 있으며, TPE는 조건부·이산·고차원 탐색공간에 적합하다. TPE는 커널 밀도 추정(KDE)으로 p(x|y)를 다루고, GP는 커널과 하이퍼파라미터 최적화가 필요하다.

이 모형 위에서 취득함수는 탐색과 활용의 균형을 정한다. Expected Improvement(EI), Probability of Improvement(PI), Upper Confidence Bound(UCB)가 주로 사용된다. TPE에서는 l(x)/g(x)의 최대화를 EI 근사로 사용하며, GP 기반 SMBO는 연속 공간에서 EI나 UCB를 더 정교하게 최적화한다.

탐색공간 설계도 수렴 결과를 바꾼다. 연속·이산·카테고리·조건부 변수를 구분하고, 로그 또는 선형 스케일과 사전분포를 맞춰야 한다. 제약조건이나 불가능한 영역은 페널티, 필터, feasibility 모델로 반영할 수 있다.

예산과 실패를 포함한 탐색 루프

초기 설계 n_init와 전체 예산(Budget)은 별도로 배분한다. 초기 후보에는 랜덤 샘플링이나 라틴하이퍼큐브를 사용해 다양성을 확보할 수 있다. 병렬 실행은 동기 방식과 비동기(A-BO) 방식 중에서 고른다. 비동기는 리소스 활용률을 높이고, 동기는 동시 실행에서 발생할 수 있는 정보 왜곡을 줄인다.

실패와 타임아웃도 관측값의 일부로 다뤄야 한다. 재시도, 페널티, 결측 처리 정책을 마련하고 캐시와 체크포인트로 중단 복구를 지원한다. 랜덤성을 통제하기 위해 seed를 고정하고, 관측 노이즈가 있으면 재평가나 부트스트랩 전략을 병행한다.

비동기동기아니오아니오입력: 탐색공간 정의, 예산,초기 시드초기 평가: n_init 샘플 실행대리모형 적합: TPE(KDE) /GP / RF취득함수 최적화: EI/PI/UCB또는 l(x)/g(x)병렬 실행 여부평가 실행: 일부 러닝 완료즉시 업데이트배치 평가: 모든 러닝 완료업데이트관측 y 수집 로그/캐시에러/타임아웃 발생?재시도/대체 파라미터/페널티점수데이터 누적대리모형 업데이트중단 조건? (예산, 수렴, 개선없음)출력: 최적 x*, 성능 추정,불확실성 리포트

모델 학습부터 운영 구성까지의 적용 범위

대규모 모델(XGBoost, SVM, RandomForest, 딥러닝)의 하이퍼파라미터를 조정할 때 TPE·GP 기반 SMBO는 30~70% 적은 시도로 유사하거나 더 나은 성능을 달성할 수 있다. 모델 선택 뒤에 모델별 하위 파라미터가 이어지는 AutoML 파이프라인처럼 조건부 탐색공간에도 적용할 수 있다.

CFD, FEA, ABM처럼 한 번의 평가에 수분~수시간이 걸리는 시뮬레이션·엔지니어링 환경에서는 샘플 효율이 핵심이다. 제약조건과 불능 영역을 함께 처리하면 현실적인 탐색 범위를 유지할 수 있다.

데이터베이스나 스트리밍 시스템의 메모리, 스레드, 배치 크기도 자동 튜닝 대상이다. 이 경우 안전한 상한·하한과 SLA 페널티를 목적함수 설계에 포함한다. 제한된 트래픽과 시간 안에서 구성값을 시험해야 한다면 오프라인 SMBO로 후보를 줄인 뒤 온라인 검증을 결합할 수 있다.

탐색기를 고르는 기준

항목 TPE GP 기반 SMBO RF 기반 SMBO
성능(고차원/이산/조건부) 강점, 스케일 양호 저차원 연속에 강함 범용, 불연속/잡음 견고
확장성(병렬/대규모) 높음, 튜닝 적음 중간, 커널/하이퍼 튜닝 부담 높음, 학습 빠름
일관성(수렴 안정성) γ, KDE 설정 영향 커널/노이즈 모델 설정 민감 비교적 안정
안정성(노이즈/비정상) 재시도/KDE 로버스트 노이즈 커널 필요 노이즈에 견고
운영 편의 구현 용이, Optuna/Hyperopt 기본 구현 복잡, 최적화기 필요 구현 용이

조건부 변수와 고차원 공간, 운영 편의가 우선이면 TPE가 적합하다. 저차원 연속 공간에서 불확실성을 정밀하게 모델링해야 한다면 GP를 고려한다. RF 기반 SMBO는 불연속성과 노이즈에 견고한 범용 선택지다.

Python으로 실행해 보기

전제조건: Python 3.10+, scikit-learn≥1.2, optuna≥3.5, scikit-optimize≥0.9
데이터: scikit-learn breast_cancer, 목적: 검증 정확도 최대화(여기서는 1−정확도 최소화)

Optuna TPE sampler

# pip install optuna scikit-learn
import optuna
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import cross_val_score, StratifiedKFold
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
import numpy as np

RANDOM_STATE = 42
X, y = load_breast_cancer(return_X_y=True)

def objective(trial):
    C = trial.suggest_loguniform("C", 1e-3, 1e3)
    gamma = trial.suggest_loguniform("gamma", 1e-4, 1e0)
    kernel = trial.suggest_categorical("kernel", ["rbf", "poly"])
    degree = trial.suggest_int("degree", 2, 5) if kernel == "poly" else 3

    clf = Pipeline([
        ("scaler", StandardScaler()),
        ("svc", SVC(C=C, gamma=gamma, kernel=kernel, degree=degree, random_state=RANDOM_STATE))
    ])

    cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=RANDOM_STATE)
    scores = cross_val_score(clf, X, y, cv=cv, scoring="accuracy", n_jobs=-1)
    return 1.0 - np.mean(scores)  # minimize
# TPE sampler is default in Optuna
study = optuna.create_study(direction="minimize", sampler=optuna.samplers.TPESampler(seed=RANDOM_STATE))
study.optimize(objective, n_trials=50, timeout=300)
print("Best value:", study.best_value)
print("Best params:", study.best_params)

scikit-optimize의 GP 기반 SMBO

# pip install scikit-optimize scikit-learn
from skopt import gp_minimize
from skopt.space import Real, Integer, Categorical
from skopt.utils import use_named_args
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import cross_val_score, StratifiedKFold
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
import numpy as np

RANDOM_STATE = 42
X, y = load_breast_cancer(return_X_y=True)
space = [
    Real(1e-3, 1e3, prior="log-uniform", name="C"),
    Real(1e-4, 1e0, prior="log-uniform", name="gamma"),
    Categorical(["rbf", "poly"], name="kernel"),
    Integer(2, 5, name="degree")
]

@use_named_args(space)
def objective(C, gamma, kernel, degree):
    if kernel != "poly":
        degree = 3  # conditional handling
    model = Pipeline([
        ("scaler", StandardScaler()),
        ("svc", SVC(C=C, gamma=gamma, kernel=kernel, degree=degree, random_state=RANDOM_STATE))
    ])
    cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=RANDOM_STATE)
    score = cross_val_score(model, X, y, cv=cv, scoring="accuracy", n_jobs=-1).mean()
    return 1.0 - score

res = gp_minimize(
    func=objective,
    dimensions=space,
    n_calls=40,
    n_initial_points=10,
    acq_func="EI",        # EI/PI/LCB
    random_state=RANDOM_STATE
)
print("Best value:", res.fun)
print("Best params:", res.x)

초깃값과 탐색 범위에는 로그 스케일과 의미 있는 경계를 사용한다. 범위를 지나치게 넓히면 수렴이 늦어진다. 비동기 실행과 조기중단(pruner)을 결합하면 벽시계 시간을 줄일 수 있고, 동기 방식은 배치 다양성 확보에 유리하다.

타임아웃이나 메모리 오류에는 무한대 또는 최악 점수처럼 페널티를 반환하고 로그를 남긴다. 동일 파라미터의 재시도는 1회로 제한한다. seed와 라이브러리 버전을 고정하고 캐시를 활성화하며, 비결정적 연산은 평균화 평가 또는 반복 측정을 사용한다. 과거 실험 로그는 초기 샘플과 사전분포를 구성하는 워밍스타트에 활용할 수 있다.

제한된 평가 예산에서 얻는 변화

그리드나 랜덤 탐색과 비교해 평가 횟수를 3070% 줄이고, 같은 예산에서 성능을 +13pp 높일 수 있다. 비동기 병렬 실행과 조기중단을 결합하면 벽시계 시간은 40~60% 단축될 수 있다.

실패와 타임아웃에 대한 내성이 높아지고 자동 로깅과 재현성 체계를 갖출 수 있다. 조건부·이산 변수가 많은 실제 파이프라인에서도 안정적인 수렴을 기대할 수 있다.

베이지안 최적화하이퍼파라미터TPESMBOMLOps