Optuna
Optuna
자동 하이퍼파라미터 최적화 프레임워크. 베이지안 최적화.
Optuna
자동 하이퍼파라미터 최적화 프레임워크. 베이지안 최적화.
Optuna는 머신러닝과 딥러닝 모델의 하이퍼파라미터를 자동으로 최적화하는 오픈소스 프레임워크입니다. 학습률, 레이어 수, 배치 크기 등 모델 성능에 영향을 미치는 하이퍼파라미터의 최적 조합을 효율적으로 탐색합니다.
Optuna는 2018년 일본 Preferred Networks에서 개발되었습니다. 기존 Grid Search나 Random Search의 비효율성을 개선하기 위해, 베이지안 최적화 기반의 TPE(Tree-structured Parzen Estimator) 알고리즘을 핵심으로 채택했습니다.
핵심 원리는 "Define-by-Run" 방식입니다. 탐색 공간을 사전에 정의하는 대신, 코드 실행 중에 동적으로 하이퍼파라미터를 샘플링합니다. 이전 시도의 결과를 학습하여 더 유망한 영역을 집중 탐색하는 베이지안 최적화로 효율성을 높입니다.
실무에서는 모델 튜닝 시간을 크게 단축시킵니다. Pruning 기능으로 성능이 낮은 시도를 조기에 중단하고, Dashboard로 최적화 과정을 시각화할 수 있어 실험 관리에도 유용합니다.
# Optuna 하이퍼파라미터 최적화 예제
import optuna
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
# 데이터 로드
iris = load_iris()
X, y = iris.data, iris.target
# 목적 함수 정의 (최적화 대상)
def objective(trial):
# 하이퍼파라미터 탐색 공간 정의 (Define-by-Run)
n_estimators = trial.suggest_int("n_estimators", 10, 200)
max_depth = trial.suggest_int("max_depth", 2, 32)
min_samples_split = trial.suggest_float("min_samples_split", 0.1, 1.0)
min_samples_leaf = trial.suggest_int("min_samples_leaf", 1, 10)
# 모델 생성 및 평가
clf = RandomForestClassifier(
n_estimators=n_estimators,
max_depth=max_depth,
min_samples_split=min_samples_split,
min_samples_leaf=min_samples_leaf,
random_state=42
)
# 교차 검증 점수 반환 (Optuna가 최대화할 값)
score = cross_val_score(clf, X, y, cv=5).mean()
return score
# 스터디 생성 및 최적화 실행
study = optuna.create_study(direction="maximize") # 정확도 최대화
study.optimize(objective, n_trials=100) # 100번 시도
# 최적 결과 출력
print(f"Best accuracy: {study.best_value:.4f}")
print(f"Best params: {study.best_params}")
# 최적화 과정 시각화 (선택)
# optuna.visualization.plot_optimization_history(study)
"수동 튜닝으로 3일 걸리던 작업을 Optuna로 자동화해서 반나절 만에 최적 하이퍼파라미터를 찾았습니다. 정확도도 2% 개선되었고요."
"Optuna의 TPE 알고리즘은 베이지안 최적화를 기반으로 합니다. 이전 시도 결과를 확률 모델로 학습하여 성능이 좋을 것으로 예상되는 하이퍼파라미터 조합을 우선 탐색합니다."
"Optuna의 Pruning 기능이 핵심입니다. MedianPruner를 설정하면 중간 성능이 다른 시도들의 중앙값보다 낮으면 조기 중단되어 GPU 시간을 60% 이상 절약할 수 있습니다."
learning_rate를 1e-10~1 범위로 설정하면 비효율적입니다. 도메인 지식을 활용해 합리적인 범위(예: 1e-5~1e-2)로 좁히세요.
10~20번 시도로는 최적점을 찾기 어렵습니다. 하이퍼파라미터 개수의 10~20배 이상의 trials를 권장합니다.
Pruning을 활성화하고, SQLite 저장소로 스터디를 저장하여 중단 후 재개가 가능하도록 설정하세요. 분산 최적화로 여러 GPU를 활용할 수도 있습니다.