Optuna 파이썬 탐색 공간

Optuna 파이썬 탐색 공간 (Pythonic Search Space)

하이퍼파라미터 샘플링을 위해 Optuna는 다음 기능을 제공해요.

  • optuna.trial.Trial.suggest_categorical() — 범주형 파라미터
  • optuna.trial.Trial.suggest_int() — 정수 파라미터
  • optuna.trial.Trial.suggest_float() — 부동소수점 파라미터

steplog 선택 인자로 정수·부동소수점 파라미터를 이산화하거나 로그를 취할 수 있어요.

출처: Pythonic Search Space

import optuna

def objective(trial):
    # Categorical parameter
    optimizer = trial.suggest_categorical("optimizer", ["MomentumSGD", "Adam"])
    # Integer parameter
    num_layers = trial.suggest_int("num_layers", 1, 3)
    # Integer parameter (log)
    num_channels = trial.suggest_int("num_channels", 32, 512, log=True)
    # Integer parameter (discretized)
    num_units = trial.suggest_int("num_units", 10, 100, step=5)
    # Floating point parameter
    dropout_rate = trial.suggest_float("dropout_rate", 0.0, 1.0)
    # Floating point parameter (log)
    learning_rate = trial.suggest_float("learning_rate", 1e-5, 1e-2, log=True)
    # Floating point parameter (discretized)
    drop_path_rate = trial.suggest_float("drop_path_rate", 0.0, 1.0, step=0.1)

파라미터 공간 정의

Optuna에서는 조건문과 반복문을 포함한 익숙한 Python 문법으로 탐색 공간을 정의해요. 파라미터 값에 따라 분기나 반복도 쓸 수 있죠.

  • 분기(branches):
import sklearn.ensemble
import sklearn.svm

def objective(trial):
    classifier_name = trial.suggest_categorical("classifier", ["SVC", "RandomForest"])
    if classifier_name == "SVC":
        svc_c = trial.suggest_float("svc_c", 1e-10, 1e10, log=True)
        classifier_obj = sklearn.svm.SVC(C=svc_c)
    else:
        rf_max_depth = trial.suggest_int("rf_max_depth", 2, 32, log=True)
        classifier_obj = sklearn.ensemble.RandomForestClassifier(max_depth=rf_max_depth)
  • 반복(loops):
import torch
import torch.nn as nn

def create_model(trial, in_size):
    n_layers = trial.suggest_int("n_layers", 1, 3)
    layers = []
    for i in range(n_layers):
        n_units = trial.suggest_int(f"n_units_l{i}", 4, 128, log=True)
        layers.append(nn.Linear(in_size, n_units))
        layers.append(nn.ReLU())
        in_size = n_units
    layers.append(nn.Linear(in_size, 10))
    return nn.Sequential(*layers)

이런 define-by-run 방식 덕분에 하이퍼파라미터 값에 따라 달라지는 조건부 탐색 공간이나 동적인 파라미터 수를 자연스럽게 표현할 수 있어요.

파라미터 수에 대한 참고

최적화의 난이도는 파라미터 수에 대해 대략 지수적으로 증가해요. 즉 파라미터 수가 늘면 필요한 트라이얼 수가 지수적으로 늘어나므로, 중요하지 않은 파라미터는 추가하지 않는 걸 권장해요.

더 알아보기