Skip to content

Hyperopt

쉽게 하이퍼파라미터를 찾아주는 파이썬 라이브러리

Hyperopt를 이용한 하이퍼파라미터 최적화

Hyperopt는 베이지안 최적화(Bayesian Optimization) 알고리즘을 사용하여 모델의 하이퍼파라미터를 탐색하는 Python 라이브러리입니다. Grid Search나 Random Search보다 효율적으로 최적의 조합을 찾아냅니다.

주요 진행 단계

Hyperopt를 통한 최적화는 일반적으로 다음 4단계로 진행됩니다.

  1. 목적 함수(Objective Function) 정의: 최적화하려는 대상 함수를 정의합니다. Hyperopt는 이 함수가 반환하는 Loss(손실) 값을 최소화하는 방향으로 작동합니다.
  2. 탐색 공간(Search Space) 설정: 하이퍼파라미터의 범위와 분포를 설정합니다 (hp.choice, hp.uniform, hp.loguniform 등 사용).
  3. 최적화 알고리즘 선택: 주로 TPE(Tree-structured Parzen Estimator) 알고리즘을 사용하여 과거 시도 결과를 바탕으로 다음 후보를 예측합니다.
  4. 결과 분석 및 적용: fmin 함수를 통해 도출된 최적의 값(best)을 실제 모델에 적용합니다.

PyTorch 적용 예시

PyTorch 학습 루프를 목적 함수 내부에 포함시켜 최적화를 수행하는 코드 구조입니다.

import torch
import torch.nn as nn
import torch.optim as optim
from hyperopt import fmin, tpe, hp, STATUS_OK, Trials

# 1. 모델 정의
class SimpleNet(nn.Module):
    def __init__(self, input_size):
        super(SimpleNet, self).__init__()
        self.fc = nn.Linear(input_size, 1)

    def forward(self, x):
        return self.fc(x)

# 2. Hyperopt 목적 함수
def objective(params):
    lr = params['lr']
    optimizer_name = params['optimizer']

    model = SimpleNet(input_size=10)
    criterion = nn.MSELoss()

    # Optimizer 선택
    if optimizer_name == 'adam':
        optimizer = optim.Adam(model.parameters(), lr=lr)
    else:
        optimizer = optim.SGD(model.parameters(), lr=lr)

    # 학습 시뮬레이션
    inputs = torch.randn(32, 10)
    targets = torch.randn(32, 1)

    model.train()
    for epoch in range(10):
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, targets)
        loss.backward()
        optimizer.step()

    # 최소화할 Loss 반환
    return {'loss': loss.item(), 'status': STATUS_OK}

# 3. 탐색 공간 설정
space = {
    'lr': hp.loguniform('lr', -5, -1), # 1e-5 ~ 1e-1
    'optimizer': hp.choice('optimizer', ['adam', 'sgd'])
}

# 4. 실행
trials = Trials()
best = fmin(fn=objective,
            space=space,
            algo=tpe.suggest,
            max_evals=20,
            trials=trials)

print(f"Best parameters: {best}")

주요 팁

  • 학습률(LR) 설정: hp.loguniform을 사용하여 로그 스케일로 탐색하는 것이 효율적입니다.
  • 기록 확인: Trials 객체를 통해 모든 시도(iteration)의 세부 결과와 Loss 변화를 추적할 수 있습니다.
  • 확장성: 학습 시간이 오래 걸리는 딥러닝 모델의 경우, Ray Tune과 결합하여 병렬 탐색을 수행하는 것을 권장합니다.

See also