🤖 AI/ML

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)로 좁히세요.

n_trials 수를 너무 적게 설정

10~20번 시도로는 최적점을 찾기 어렵습니다. 하이퍼파라미터 개수의 10~20배 이상의 trials를 권장합니다.

올바른 방법

Pruning을 활성화하고, SQLite 저장소로 스터디를 저장하여 중단 후 재개가 가능하도록 설정하세요. 분산 최적화로 여러 GPU를 활용할 수도 있습니다.

🔗 관련 용어

📚 더 배우기