하이퍼파라미터 최적화 (Hyperparameter Optimization)¶
난이도: 중급
선수 지식: 교차 검증, 기본 ML 모델 하이퍼파라미터
관련 문서: 학습률 | 경사 하강법 | 과적합과 과소적합 | No Free Lunch
개요¶
하이퍼파라미터 최적화(Hyperparameter Optimization, HPO)는 모델의 학습 과정을 제어하는 설정값(하이퍼파라미터)의 최적 조합을 찾는 과정이다. 파라미터가 데이터에서 학습되는 것과 달리, 하이퍼파라미터는 사전에 설정해야 한다.
예시: - 학습률, 배치 크기, 에폭 수 - 정규화 강도 (\(\lambda\), 드롭아웃 비율) - 모델 구조 (레이어 수, 유닛 수, 트리 깊이) - 옵티마이저 선택 및 설정
핵심 개념¶
1. 그리드 탐색 (Grid Search)¶
미리 정의한 파라미터 격자의 모든 조합을 탐색한다.
예시¶
| 장점 | 단점 |
|---|---|
| 단순, 재현 가능 | 기하급수적 비용: \(O(n^k)\) |
| 격자 내 최적 보장 | 중요하지 않은 파라미터에도 동일 자원 |
| 병렬화 용이 | 해상도가 고정 |
- 복잡도: \(O(n^k)\) (\(k\): 파라미터 수, \(n\): 각 파라미터의 값 수)
2. 무작위 탐색 (Random Search)¶
파라미터 분포에서 무작위로 샘플링한다.
왜 그리드보다 나은가? (Bergstra & Bengio, 2012)¶
핵심 통찰: 중요한 하이퍼파라미터는 일부에 불과하다.
- 그리드 탐색: 중요하지 않은 차원에도 균등하게 배분 --> 중요한 차원의 커버리지 부족
- 무작위 탐색: 각 차원을 독립적으로 더 다양하게 탐색
그리드 탐색 (4×4) 무작위 탐색 (16회)
│ × × × × │ × ×
│ × × × × │ × ×
│ × × × × │ × ×
│ × × × × │ × × ×
└───────── │ × × ×
중요 파라미터의 │ × × ×
고유값: 4개 └──────────
중요 파라미터의
고유값: ~16개
| 장점 | 단점 |
|---|---|
| 같은 예산으로 더 나은 커버리지 | 과거 결과를 활용하지 않음 |
| 병렬화 용이 | 최적 영역을 놓칠 수 있음 |
| 사전 지식 불필요 |
3. 베이지안 최적화 (Bayesian Optimization)¶
핵심 아이디어¶
\(f(\text{하이퍼파라미터}) \to \text{성능}\)을 모델링하는 대리 모델(surrogate model)을 구축하고, 이를 기반으로 다음 탐색 지점을 지능적으로 선택한다.
알고리즘¶
- 초기 랜덤 포인트들로 대리 모델 학습
- 획득 함수(acquisition function)로 다음 포인트 선택
- 해당 포인트에서 모델을 실제 평가
- 대리 모델 업데이트
- 반복
대리 모델¶
| 모델 | 설명 | 도구 |
|---|---|---|
| 가우시안 프로세스 (GP) | 불확실성 추정 제공, \(O(n^3)\) | scikit-optimize |
| TPE (Tree-structured Parzen Estimator) | \(P(\text{params}\|\text{score})\) 모델링 | Hyperopt, Optuna |
| 랜덤 포레스트 | 범주형 처리 용이 | SMAC |
획득 함수: 탐험 vs 활용¶
| 함수 | 수식 | 특성 |
|---|---|---|
| Expected Improvement (EI) | \(E[\max(0, f(x) - f_{\text{best}})]\) | 가장 일반적 |
| Upper Confidence Bound (UCB) | \(\mu(x) + \kappa\sigma(x)\) | \(\kappa\)로 탐험/활용 조절 |
| Probability of Improvement (PI) | \(P(f(x) > f_{\text{best}})\) | 보수적 |
graph TD
A[초기 랜덤 평가] --> B[대리 모델 학습]
B --> C[획득 함수로 다음 포인트 선택]
C --> D[실제 모델 평가]
D --> E{예산 소진?}
E -->|아니오| B
E -->|예| F[최적 하이퍼파라미터 반환] | 장점 | 단점 |
|---|---|
| 샘플 효율적 | 순차적 (병렬화 어려움) |
| 과거 결과를 활용 | 대리 모델 학습 오버헤드 |
| 노이즈가 있는 평가 처리 | 구현 복잡 |
4. Hyperband & ASHA¶
Hyperband (Li et al., 2018)¶
Successive Halving 기반: 많은 설정을 적은 자원으로 시작하고, 상위만 남겨 자원을 늘린다.
| 라운드 | 설정 수 | 자원 (에폭) |
|---|---|---|
| 1 | 81 | 1 |
| 2 | 27 | 3 |
| 3 | 9 | 9 |
| 4 | 3 | 27 |
| 5 | 1 | 81 |
- \(n\) vs \(B/n\) 트레이드오프 (많은 설정 vs 깊은 평가) 해결
- 여러 bracket으로 다양한 조기 종료 공격성
ASHA (Asynchronous SHA)¶
- Successive Halving의 비동기 병렬 버전
- 분산 환경에서 자원 활용 극대화
BOHB¶
베이지안 최적화 + Hyperband: 샘플링에는 BO를 사용하고, 조기 종료에는 Hyperband를 사용. 두 장점 결합.
5. 인구 기반 학습 (Population-Based Training, PBT)¶
알고리즘 (DeepMind, 2017)¶
- 여러 모델을 다른 하이퍼파라미터로 동시 학습
- 주기적으로:
- 활용(exploit): 성능이 나쁜 모델을 좋은 모델의 가중치로 교체
- 탐험(explore): 하이퍼파라미터를 무작위로 변동
핵심 장점¶
- 학습 중에 하이퍼파라미터를 적응 --> 고정값이 아닌 스케줄 발견
- 학습률 스케줄, 정규화 강도 스케줄 등을 자동 탐색
6. 기타 방법¶
| 방법 | 설명 |
|---|---|
| 진화/유전 알고리즘 | 설정의 인구를 진화시킴 |
| 다중 충실도 (Multi-fidelity) | 저비용 근사(데이터 부분집합, 적은 에폭)로 필터링 |
| 전이 학습 for HPO | 유사 태스크의 결과로 워밍 스타트 |
| NAS (Neural Architecture Search) | 아키텍처 자동 설계 (DARTS, ENAS) |
상세 비교표¶
| 방법 | 평가 횟수 | 순차적? | 과거 활용? | 조기 종료? |
|---|---|---|---|---|
| 그리드 탐색 | 기하급수 | 아니오 | 아니오 | 아니오 |
| 무작위 탐색 | 고정 예산 | 아니오 | 아니오 | 아니오 |
| 베이지안 최적화 | 소수 | 대체로 예 | 예 | 기본 아님 |
| Hyperband | 많은 저비용 | 부분적 | 아니오 | 예 |
| BOHB | 적응적 | 부분적 | 예 | 예 |
| PBT | 연속적 | 아니오 | 예 (인구) | 내재적 |
flowchart TD
A[HPO 방법 선택] --> B{평가 비용?}
B -->|비쌈 <100회| C[베이지안 최적화]
B -->|저렴 + 딥러닝| D[Hyperband / ASHA]
B -->|불확실| E{파라미터 수?}
E -->|적음 ≤3| F[그리드 탐색]
E -->|많음| G[무작위 탐색으로 시작]
A --> H{학습 중 적응 필요?}
H -->|예| I[PBT]
A --> J{최상의 효율?}
J -->|예| K[BOHB] 실무 지침¶
탐색 분포 설정¶
| 하이퍼파라미터 | 추천 분포 | 이유 |
|---|---|---|
| 학습률 | 로그 균일 (log-uniform) | 규모가 중요 (0.001 vs 0.01) |
| 정규화 강도 | 로그 균일 | 규모가 중요 |
| 드롭아웃 비율 | 균일 (0.0~0.5) | 범위가 제한적 |
| 배치 크기 | {32, 64, 128, 256} | 이산적 |
| 레이어/유닛 수 | 균일 정수 또는 로그 균일 | 문제 의존 |
일반적 워크플로¶
- 무작위 탐색으로 영역 파악 (~20-50회)
- 유망한 영역에서 베이지안 최적화로 정밀 탐색
- 또는 딥러닝이면 Hyperband/ASHA로 효율적 탐색
- 최종 모델은 교차 검증으로 확인
언제 사용하는가¶
| 상황 | 추천 방법 |
|---|---|
| 빠른 프로토타이핑 | 무작위 탐색 |
| 고비용 평가 (< 100회) | 베이지안 최적화 |
| 딥러닝 + 조기 종료 | Hyperband / ASHA |
| 최상의 효율 | BOHB |
| 파라미터 스케줄 탐색 | PBT |
| 파라미터 ≤ 3개 | 그리드 탐색도 가능 |
흔한 오해와 함정¶
1. "그리드 탐색이 가장 신뢰할 수 있다"¶
- 차원이 많으면 비효율적이고, 무작위 탐색이 같은 예산으로 더 나은 결과를 주는 경우가 많다.
2. "베이지안 최적화가 항상 최선이다"¶
- 평가가 저렴하고 조기 종료가 가능하면 Hyperband가 더 효율적. BO는 비용이 높은 평가에 적합.
3. "HPO는 모델 학습 후에만 한다"¶
- PBT처럼 학습 중에 하이퍼파라미터를 조정하는 방법도 있으며, 이것이 더 효과적일 수 있다.
4. "더 많은 하이퍼파라미터를 탐색할수록 좋다"¶
- 탐색 공간이 커지면 필요한 예산이 기하급수적으로 증가한다. 중요한 파라미터에 집중해야 한다.
5. "학습률은 로그 스케일로 탐색해야 한다"¶
- 맞는 말이다. 하지만 같은 원리로 정규화 강도도 로그 스케일이어야 하며, 이를 간과하는 경우가 많다.
다른 주제와의 연결¶
- 학습률: 가장 중요한 하이퍼파라미터
- 경사 하강법: 옵티마이저 선택도 HPO의 일부
- 과적합과 과소적합: 정규화 강도의 최적화
- 정규화 이론: 정규화 하이퍼파라미터 튜닝
- No Free Lunch: 모든 문제에 최적인 하이퍼파라미터는 없음
자주 묻는 면접 질문¶
- 무작위 탐색이 그리드 탐색보다 좋은 이유는?
-
중요한 하이퍼파라미터가 일부에 불과할 때, 무작위 탐색이 각 차원을 더 다양하게 탐색. 같은 예산으로 중요 파라미터의 더 많은 값을 시도.
-
베이지안 최적화의 탐험-활용 트레이드오프를 설명하시오
-
탐험: 불확실한 영역 탐색 (정보 수집). 활용: 현재 최선 근처 탐색 (성능 개선). 획득 함수가 이 균형을 조절.
-
Hyperband를 베이지안 최적화보다 선호하는 경우는?
-
평가가 저렴하고 조기 종료가 가능할 때 (딥러닝). 많은 설정을 빠르게 시도하고 부적합한 것을 일찍 제거.
-
하이퍼파라미터 수가 탐색 전략에 미치는 영향은?
- 파라미터 수 증가 --> 탐색 공간 기하급수적 증가. 적은 파라미터: 그리드 가능, 많은 파라미터: 무작위/BO/Hyperband 필수.
코드 예시¶
# === scikit-learn: 그리드 & 무작위 탐색 ===
from sklearn.model_selection import GridSearchCV, RandomizedSearchCV
from scipy.stats import loguniform, uniform
# 그리드 탐색
grid_search = GridSearchCV(
estimator=model,
param_grid={'C': [0.1, 1, 10], 'gamma': [0.01, 0.1, 1]},
cv=5, scoring='accuracy', n_jobs=-1
)
grid_search.fit(X_train, y_train)
# 무작위 탐색 (로그 균일 분포)
random_search = RandomizedSearchCV(
estimator=model,
param_distributions={
'C': loguniform(1e-3, 1e3),
'gamma': loguniform(1e-4, 1e1)
},
n_iter=100, cv=5, scoring='accuracy', n_jobs=-1
)
random_search.fit(X_train, y_train)
# === Optuna: 베이지안 최적화 (TPE) ===
import optuna
def objective(trial):
lr = trial.suggest_float('lr', 1e-5, 1e-1, log=True)
n_layers = trial.suggest_int('n_layers', 1, 5)
dropout = trial.suggest_float('dropout', 0.0, 0.5)
model = build_model(lr=lr, n_layers=n_layers, dropout=dropout)
accuracy = train_and_evaluate(model, X_train, y_train, X_val, y_val)
return accuracy
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100)
print(f"Best params: {study.best_params}")
print(f"Best accuracy: {study.best_value}")
# Optuna + Pruning (Hyperband 유사)
study = optuna.create_study(
direction='maximize',
pruner=optuna.pruners.HyperbandPruner()
)
용어 정리¶
| 영어 | 한국어 |
|---|---|
| Hyperparameter Optimization | 하이퍼파라미터 최적화 |
| Grid Search | 그리드 탐색 |
| Random Search | 무작위 탐색 |
| Bayesian Optimization | 베이지안 최적화 |
| Surrogate Model | 대리 모델 |
| Acquisition Function | 획득 함수 |
| Expected Improvement | 기대 향상 |
| Successive Halving | 순차 절반 |
| Population-Based Training | 인구 기반 학습 |
| Multi-fidelity | 다중 충실도 |
| Exploration-Exploitation | 탐험-활용 |
참고 자료¶
- Bergstra & Bengio (2012) - "Random Search for Hyper-Parameter Optimization"
- Snoek, Larochelle, Adams (2012) - "Practical Bayesian Optimization of Machine Learning Algorithms"
- Li et al. (2018) - "Hyperband: A Novel Bandit-Based Approach to Hyperparameter Optimization"
- Jaderberg et al. (2017) - "Population Based Training of Neural Networks" (PBT)
- Falkner et al. (2018) - "BOHB: Robust and Efficient Hyperparameter Optimization at Scale"
- Akiba et al. (2019) - "Optuna: A Next-generation Hyperparameter Optimization Framework"