Optuna 시작하기

Optuna 시작하기 (First Optimization)

Optuna는 전부 Python으로 작성됐고 의존성이 적어 가볍게 시작할 수 있어요. 보통 하이퍼파라미터를 최적화하는 데 쓰지만, 간단한 이차 함수를 최적화하는 예시부터 살펴볼게요.

출처: Lightweight, versatile, and platform agnostic architecture

이차 함수 예제

(x - 2)^2 함수를 최적화해 볼게요. 먼저 optuna를 임포트해요.

import optuna

Optuna에서는 최적화할 함수를 관례적으로 objective라고 이름 지어요.

def objective(trial):
    x = trial.suggest_float("x", -10, 10)
    return (x - 2) ** 2

이 함수는 (x - 2)^2의 값을 반환해요. 목표는 objective 함수의 출력을 최소화하는 x 값을 찾는 것, 즉 "최적화"예요. 최적화 중에 Optuna는 서로 다른 x 값으로 objective 함수를 반복 호출하고 평가해요.

Trial 객체는 objective 함수의 단일 실행에 해당하며, 함수가 호출될 때마다 내부적으로 인스턴스화돼요. suggest_float() 같은 제안(suggest) API를 objective 함수 안에서 호출해 특정 트라이얼의 파라미터를 얻어요. suggest_float()는 주어진 범위(여기선 -10부터 10) 안에서 균등하게 파라미터를 고릅니다.

최적화를 시작하려면 study 객체를 만들고 optimize() 메서드에 objective 함수를 넘겨요.

study = optuna.create_study()
study.optimize(objective, n_trials=100)

최적 파라미터는 이렇게 얻어요.

study.best_params
# Found x: 1.9795..., (x - 2)^2: 0.0004...

Optuna가 찾은 x 값이 최적값 2에 가까운 걸 볼 수 있어요. 머신러닝에서 하이퍼파라미터를 탐색할 때는 보통 objective 함수가 모델의 손실이나 정확도를 반환해요.

Study 객체

Optuna 용어를 정리하면 이래요.

  • Trial: objective 함수의 단일 호출
  • Study: 일련의 트라이얼을 모은 최적화 세션
  • Parameter: 위 예시의 x처럼 최적화할 값의 변수

create_study() 메서드가 study 객체를 반환하고, 최적화 결과를 분석하는 데 유용한 속성을 가져요.

# 파라미터 이름과 값의 딕셔너리
study.best_params
# {'x': 1.9795...}

# 최적 관측값
study.best_value
# 0.0004...

# 최적 트라이얼
study.best_trial

# 모든 트라이얼
study.trials

# 트라이얼 수
len(study.trials)
# 100

optimize()를 다시 실행하면 최적화를 이어갈 수 있어요.

study.optimize(objective, n_trials=100)
len(study.trials)
# 200

objective 함수가 매우 쉬워서 마지막 100개 트라이얼은 결과를 개선하지 못했지만, 결과를 다시 확인해 볼 수 있어요.

더 알아보기