Optuna 파이썬 탐색 공간
Optuna 파이썬 탐색 공간 (Pythonic Search Space)
하이퍼파라미터 샘플링을 위해 Optuna는 다음 기능을 제공해요.
optuna.trial.Trial.suggest_categorical()— 범주형 파라미터optuna.trial.Trial.suggest_int()— 정수 파라미터optuna.trial.Trial.suggest_float()— 부동소수점 파라미터
step과 log 선택 인자로 정수·부동소수점 파라미터를 이산화하거나 로그를 취할 수 있어요.
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 방식 덕분에 하이퍼파라미터 값에 따라 달라지는 조건부 탐색 공간이나 동적인 파라미터 수를 자연스럽게 표현할 수 있어요.
파라미터 수에 대한 참고
최적화의 난이도는 파라미터 수에 대해 대략 지수적으로 증가해요. 즉 파라미터 수가 늘면 필요한 트라이얼 수가 지수적으로 늘어나므로, 중요하지 않은 파라미터는 추가하지 않는 걸 권장해요.
더 알아보기
- Optuna 시작하기 — 첫 최적화
- Efficient Optimization Algorithms — 샘플링·프루닝
- Optuna 예제 — 다양한 사용 사례