ML Lab Note · 적응형 실험 시리즈

Meta의 Ax로 시작하는 적응형 실험: 하이퍼파라미터 튜닝 실전 코딩 가이드

베이지안 최적화·다목적 최적화·제약 조건까지 한 번에 정리한 초보자용 워크플로우. RandomForest 예제로 쉽게 따라 합니다.

📅 2026.08.06 ⏱️ 약 12분 🏷️ Meta Ax · 베이지안 최적화 · 하이퍼파라미터 튜닝
노트북 화면에서 파이썬 코드와 베이지안 최적화 그래프를 살펴보는 모습
실험 결과에 따라 다음 시도 매개변수를 자동으로 조정하는 적응형 실험의 아이디어

1. 적응형 실험이란 무엇인가요?

보통 머신러닝 모델을 튜닝할 때는 하이퍼파라미터(학습률, 트리 개수 등)를 하나씩 바꿔가며 점수를 비교합니다. 이 방식은 사람이 직접 "다음에 뭘 해볼까?"를 정해야 해서 시간이 오래 걸리죠.

적응형 실험(Adaptive Experimentation)은 이 과정을 자동화한 것입니다. 진행 중인 실험 결과를 옵티마이저(optimizer)에게 알려주면, 옵티마이저가 "이 매개변수 조합이 잘 먹히네, 그럼 이 방향을 좀 더 탐색해보자"라고 다음 시도할 매개변수를 똑똑하게 제안합니다. 즉, 고정된 계획이 아니라 데이터 피드백을 받아 진화적으로 탐색하는 실험 방식입니다.

핵심 개념

적응형 실험은 "①다음 시도 요청(Ask) → ②실험 수행 → ③결과 보고(Tell)"를 반복합니다. 이 패턴을 Ask-Tell 최적화라고 부릅니다.

2. 왜 Meta의 Ax일까요?

적응형 실험을 도와주는 도구는 여러 가지가 있지만, Meta(구 페이스북)에서 만든 Ax는 실무용으로 가장 성숙한 오픈소스 라이브러리입니다. 핵심 장점을 정리하면:

  • 베이지안 최적화를 자동으로 수행 — 적은 시도로 좋은 매개변수 조합을 찾습니다.
  • 정수·실수·로그 스케일·범주형 매개변수를 한꺼번에 섞어 정의 가능 (혼합 검색 공간).
  • 제약 최적화: "모델 크기는 50MB 이하" 같은 조건을 함께 줄 수 있습니다.
  • 다목적 최적화: 정확도와 속도처럼 상충되는 목표를 동시에 다룹니다.
  • 민감도 분석·교차 검증 같은 진단 카드와 실험 저장/재현 기능을 기본 제공합니다.
정리하면, Ax는 "최적화 + 분석 + 재현성"이 한 묶음으로 제공되는 도구입니다.

3. 환경 준비하기 (Colab)

가장 빠르게 시작하는 방법은 Google Colab입니다. 아래 명령어만 실행하면 끝입니다.

!pip install ax-platform scikit-learn matplotlib numpy
import warnings, logging
warnings.filterwarnings("ignore")
logging.getLogger("ax").setLevel(logging.ERROR)

이 짧은 블록이 하는 일은 ①필수 패키지 설치 → ②과도한 경고 숨김 → ③Ax 내부 로그 정리입니다. 노트북 출력이 깔끔해져서 실험 결과에만 집중할 수 있어요.

4. 데이터셋과 평가 함수 만들기

튜토리얼에서는 실제 데이터 대신 합성 다중 클래스 분류 데이터셋을 사용합니다. 데이터가 준비되어 있다는 가정하에, 우리는 "주어진 매개변수로 모델을 학습시켰을 때 정확도와 모델 크기는 얼마인가?"를 반환하는 평가 함수만 만들면 됩니다.

Cross-validation · 교차 검증왜 단일 train/test가 아니라 교차 검증을 쓸까요?

데이터를 한 번만 나누면 운에 따라 점수가 들쭉날쭉합니다. K-fold 교차 검증은 데이터를 K조각으로 나눠 K번 반복 평가하므로 결과의 분산이 작아지고 일반화 성능을 더 정확히 추정할 수 있습니다.

평가 함수는 다음과 같은 형태입니다.

def evaluate(params):
    model = RandomForestClassifier(
        n_estimators=params["n_estimators"],
        max_depth=params["max_depth"],
        min_samples_split=params["min_samples_split"],
        criterion=params["criterion"],
    )
    # K-fold 교차 검증
    acc = cross_val_score(model, X, y, cv=5).mean()
    size_mb = get_model_size_mb(model)
    return {"accuracy": acc, "model_size": size_mb}

여기서 핵심은 정확도와 모델 크기를 함께 반환한다는 점입니다. 옵티마이저가 두 값을 동시에 보고 "더 좋은 절충안"을 찾을 수 있게 됩니다.

Hyperparameter Optimization · 하이퍼파라미터 최적화하이퍼파라미터란 무엇인가요?

모델이 학습 과정에서 자동으로 찾지 못하고 사람이 직접 지정해야 하는 변수입니다. 예: 학습률, 트리 개수, 최대 깊이, 최소 분할 샘플 수 등. 이 값들의 최적 조합을 자동으로 찾는 과정이 하이퍼파라미터 최적화입니다.

5. 단일 목적 베이지안 최적화

가장 단순한 케이스부터 시작합니다. "정확도만 최대화하자. 단, 모델 크기는 30MB 이하여야 한다."

Ax에서는 이걸 두 가지 방식으로 표현합니다.

  • outcome constraint(결과 제약): 정확도·모델 크기 같은 평가 결과에 대한 조건.
  • parameter constraint(매개변수 제약): 매개변수 자체에 대한 조건(예: 두 값의 합이 5 이하).

실험 흐름은 이렇게 단순합니다.

  1. 옵티마이저에게 다음에 시도할 매개변수 조합을 요청(Ask)
  2. 위에서 만든 evaluate()로 평가
  3. 결과를 옵티마이저에 다시 보고(Tell)
  4. ①~③을 N회 반복
Bayesian Optimization · 베이지안 최적화왜 '베이지안'이라고 부를까요?

아직 다 평가하지 않은 매개변수 조합이 어떤 점수를 가질지 확률적인 예측 모델(surrogate model)로 추정하기 때문입니다. 그리고 "어디를 더 탐색할지·현재 최선 근처를 더 깊이 파볼지"를 획득 함수(acquisition function)가 결정합니다. 이 베이즈 추정 기반의 탐색이 베이지안 최적화입니다.

이렇게 얻은 최상의可行한(feasible) 구성과 수렴 곡선을 시각화하면, 옵티마이저가 초반 무작위 탐색 후 빠르게 좋은 영역에 수렴하는 모습을 확인할 수 있습니다.

6. 다목적 최적화와 파레토 프론티어

현실에서는 "정확도 ↑, 모델 크기 ↓"처럼 목표가 여러 개이고 서로 상충(trade-off)됩니다. 이런 경우 단일 정답은 존재하지 않습니다. 대신 "어느 한쪽을 더 좋게 하려면 다른 쪽을 양보해야 하는" 해들의 집합이 정답입니다.

Multi-objective Optimization · 다목적 최적화다목적 최적화란?

두 개 이상의 상충되는 목적함수를 동시에 최적화하는 기법입니다. 단일 최적이 존재하지 않으며, 파레토 프론티어(Pareto Frontier)라고 불리는 절충안들의 집합을 찾는 것이 목표입니다.

Pareto Frontier · 파레토 프론티어파레토 프론티어란?

다목적 최적화에서, 어떤 목적을 개선하려면 다른 목적을 반드시 양보해야 하는(non-dominated) 해들의 집합입니다. 이 위에 있는 점들은 "더 이상 한쪽을 개선할 수 없는" 합리적 절충안들로 구성됩니다. 비즈니스 상황(예: "50MB 이하에서 최고 정확도")에 맞는 점을 직접 골라 채택할 수 있습니다.

Ax는 경험적 파레토 프론티어(empirical Pareto frontier)를 자동으로 계산·시각화해주므로, "모델 크기를 어디까지 허용할 수 있느냐"에 따라 어떤 구성을 선택할지 데이터 기반으로 결정할 수 있습니다.

7. 매개변수 제약 조건 다루기

결과에 대한 제약뿐 아니라 입력 매개변수 자체에도 제약을 줄 수 있습니다. 튜토리얼에서는 2차원 합성 문제로 시연합니다.

  • 목표: (x, y) = (3, 4)까지의 거리 최소화
  • 제약: x + y ≤ 5 (두 변수의 합이 5를 넘지 않아야 함)

옵티마이저는 제약 영역 안에서만 탐색하므로 "제약된 최적값 근처의 최선 지점"을 자연스럽게 찾아줍니다. 실전에서는 "서로 동시에 0이 될 수 없는 매개변수", "특정 구간 밖이면 무의미한 값" 같은 도메인 지식을 코드로 표현하는 데 유용합니다.

Constrained Optimization · 제약 최적화제약 최적화 정리

특정 제약 조건(예: 모델 크기 ≤ 임계값, 매개변수 합 ≤ 경계)을 만족하는 범위 내에서 목적함수를 최적화하는 문제입니다. Ax는 결과 제약과 매개변수 제약을 모두 지원합니다.

8. 분석 카드로 인사이트 얻기

최적화가 끝난 뒤에도 Ax는 분석 도구를 제공합니다. 환경이 Plotly 같은 시각화 라이브러리를 지원하면 다음 카드가 자동 생성됩니다.

  • 민감도 분석(Sensitivity Analysis): 어떤 매개변수가 결과에 큰 영향을 주는지 시각화.
  • 교차 검증 카드: 동일한 구성의 변동성을 확인.
  • 수렴 곡선: 시도 횟수에 따라 최선 점수가 어떻게 개선되었는지.
  • 파레토 시각화: 다목적 실험의 절충안 분포.
Sensitivity Analysis · 민감도 분석왜 민감도 분석이 필요할까요?

"어떤 매개변수를 더 정밀하게 튜닝해야 하고, 어떤 매개변수는 크게 신경 안 써도 되는가?"를 알려줍니다. 모델 해석과 의사결정에 직접 활용되는 분석입니다. Ax에서는 매개변수별 영향도를 진단 카드로 시각화해줍니다.

9. 실험 저장과 재현

마지막 단계는 완료된 실험을 JSON 파일로 저장하는 것입니다. 나중에 다시 로드하면 최적화 상태가 그대로 복원되므로, 노트북을 닫았다가 며칠 뒤에 이어서 분석하거나, 동료에게 결과를 그대로 넘기는 일이 쉬워집니다.

study.save_json("ax_experiment.json")
study = Study.load_json("ax_experiment.json")  # 동일 상태 복원

재현성(reproducibility)은 MLOps의 핵심입니다. Ax의 이 기능은 작은 디테일이지만 실무에서 큰 차이를 만듭니다.

10. 마무리 · 핵심 정리

이 튜토리얼을 따라 하면 다음 4가지를 한 번에 체득할 수 있습니다.

  1. 혼합 타입(정수·실수·로그·범주형)의 검색 공간을 정의하고,
  2. 베이지안 최적화로 결과 제약(모델 크기 ≤ 임계값)을 지키며 정확도를 최대화하고,
  3. 다목적 최적화로 정확도 vs. 모델 크기 절충안을 비교하고, 파레토 프론티어를 그려보고,
  4. 매개변수 제약·민감도 분석·실험 저장을 활용해 해석 가능하고 재현 가능한 워크플로우를 만든다.

Ax는 "최적화 + 분석 + 재현성"이 한 묶음이라, 연구자와 엔지니어 모두에게 실질적인 도움이 되는 도구입니다. 다음 글에서는 실전 데이터셋(이미지 분류 등)에 Ax를 적용한 사례와, Optuna와의 비교를 다뤄보겠습니다.

용어 한눈에 보기 (보너스)

  • 적응형 실험: 결과 피드백으로 다음 시도를 자동 조정하는 실험 방식
  • 베이지안 최적화: 확률 모델로 미평가 지점의 점수를 추정하며 효율적으로 최적점을 찾는 기법
  • 다목적 최적화: 상충되는 여러 목표를 동시에 다루는 최적화
  • 파레토 프론티어: 다목적 최적에서 "더 이상 개선 불가"인 절충안 집합
  • 하이퍼파라미터 최적화: 사람이 지정하는 변수의 최적 조합을 찾는 과정
  • 교차 검증: 데이터를 여러 번 나눠 평균 내어 안정적 성능을 추정하는 기법
  • 민감도 분석: 입력 변화에 출력이 얼마나 민감한지 분석하는 기법
  • Ask-Tell 최적화: "다음 시도 요청 → 평가 → 결과 보고"의 반복 패턴
  • 랜덤 포레스트: 다수 결정 트리의 예측을 평균/투표하는 앙상블 모델
  • 제약 최적화: 제약을 만족하는 범위에서 목적함수를 최적화하는 문제