Optuna 효율적 최적화 알고리즘

Optuna 효율적 최적화 알고리즘 (Efficient Optimization Algorithms)

Optuna는 하이퍼파라미터 샘플링과 유망하지 않은 트라이얼의 프루닝에 최신 알고리즘을 채택해 효율적인 하이퍼파라미터 최적화를 가능하게 해요.

출처: Efficient Optimization Algorithms

샘플링 알고리즘 (Sampling Algorithms)

샘플러(sampler)는 기본적으로 제안된 파라미터 값과 평가된 objective 값의 기록을 이용해 탐색 공간을 계속 좁혀 나가요. 더 나은 objective 값을 주는 파라미터를 찾는 최적 탐색 공간으로 이끌어 주죠.

Optuna가 제공하는 샘플링 알고리즘은 다양해요. 예를 들어:

  • Grid Search: GridSampler로 구현돼요. 지정한 그리드에서 조합을 탐색해요.
  • Exhaustive Search: BruteForceSampler로 구현돼요. 모든 조합을 전수 탐색해요.

그 외에도 Default Sampler(기본 TPE), TPESampler, RandomSampler, CmaEsSampler(CMA-ES), NSGAIISampler, MOTPESampler 등 목적에 따라 여러 알고리즘을 선택할 수 있어요.

프루너 활성화 (Activating Pruners)

should_prune()은 반복 학습의 각 단계 후에 호출해요. report()는 중간 objective 값을 주기적으로 기록하고, should_prune()은 미리 정의된 조건을 충족하지 못하는 트라이얼의 종료를 결정해요.

for step in range(num_steps):
    # 학습 로직
    ...
    trial.report(intermediate_value, step)
    if trial.should_prune():
        raise optuna.TrialPruned()

프루닝은 성능이 나쁜 트라이얼을 전체 반복을 마치기 전에 중단해서 컴퓨팅 자원을 아껴요. 프루닝된 트라이얼의 메시지는 "Trial <Trial Number> pruned." 형식으로 출력돼요.

프루닝용 통합 모듈

Optuna의 통합 모듈 전체 목록은 optuna.integration 참조에서 볼 수 있어요. 예를 들어 LightGBMPruningCallback은 학습 반복 로직을 직접 바꾸지 않고도 프루닝을 도입해요.

import optuna.integration

pruning_callback = optuna.integration.LightGBMPruningCallback(trial, 'validation-error')
gbm = lgb.train(param, dtrain, valid_sets=[dvalid], callbacks=[pruning_callback])

더 알아보기