하이퍼파라미터 탐색
하이퍼파라미터 탐색 (Hyperparameter search)
학습률(learning rate), 배치 크기, 에폭 수 같은 하이퍼파라미터는 학습 결과에 큰 영향을 미쳐요. Trainer.hyperparameter_search()는 각각 다른 값 세트를 가진 여러 트라이얼(trial)을 실행하고 최상의 값을 반환해서 최적의 조합을 찾아줘요.
각 트라이얼은 model_init으로 새 모델을 초기화하고, 새 하이퍼파라미터를 샘플링하며, 전체 학습 루프를 실행하고, 목적값(objective)을 검색 백엔드에 보고해요. 백엔드는 각 목적값을 사용해서 다음 트라이얼을 안내해요. 모든 트라이얼이 끝나면 최상의 하이퍼파라미터가 ~trainer.utils.BestRun으로 반환돼요.
출처: 문서
본문
모델 초기화
이전 실행의 상태를 피하기 위해 각 트라이얼을 새 모델로 시작해요. model_init은 각 트라이얼 시작 시 호출되어 새 모델 인스턴스를 반환하므로, 모든 트라이얼이 동일한 초기 가중치에서 시작해요.
from transformers import AutoModelForCausalLM
def model_init(trial):
return AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-0.6B")
trainer = Trainer(
model_init=model_init,
args=args,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
)
model=와 model_init=를 함께 전달하면 Trainer가 에러를 발생시키므로 주의하세요.
탐색 공간 정의
탐색 공간을 정의하는 함수를 만들어요. 형식은 백엔드에 따라 달라져요. hp_space 함수를 정의하지 않으면 기본 탐색이 learning_rate, num_train_epochs, per_device_train_batch_size를 다뤄요.
# install one of these hyperparam search backends
pip install optuna
pip install wandb
pip install ray[tune]
Optuna는 하이퍼파라미터 최적화를 위한 가벼운 프레임워크예요.
def hp_space(trial):
return {
"learning_rate": trial.suggest_float("learning_rate", 1e-6, 1e-4, log=True),
"per_device_train_batch_size": trial.suggest_categorical("per_device_train_batch_size", [16, 32, 64, 128]),
}
Ray Tune은 스케일러블한 하이퍼파라미터 튜닝 라이브러리로, 트라이얼을 여러 머신에 분산시킬 수도 있어요.
from ray import tune
def hp_space(trial):
return {
"learning_rate": tune.loguniform(1e-6, 1e-4),
"per_device_train_batch_size": tune.choice([16, 32, 64, 128]),
}
Weights & Biases는 내장 하이퍼파라미터 탐색이 있는 실험 추적 플랫폼이에요. Bayesian, random, grid 검색 전략을 지원해요.
def hp_space(trial):
return {
"method": "random",
"metric": {"name": "objective", "goal": "minimize"},
"parameters": {
"learning_rate": {"distribution": "uniform", "min": 1e-6, "max": 1e-4},
"per_device_train_batch_size": {"values": [16, 32, 64, 128]},
},
}
탐색 실행
선택적인 compute_objective 함수를 제공해서 최적화 대상을 정의해요. 기본값은 eval_loss가 있으면 그 값을, 아니면 모든 메트릭 값의 합을 사용해요. 이 폴백에 의존하지 않으려면 명시적 함수를 전달하세요. 검색 backend는 주어진 direction에서 n_trials 실행에 걸쳐 목적값을 최적화해요.
def compute_objective(metrics):
return metrics["eval_loss"]
best_run = trainer.hyperparameter_search(
hp_space=hp_space,
compute_objective=compute_objective,
n_trials=30, # how many trials to run
direction="minimize", # or "maximize" for metrics like accuracy/F1
backend="optuna", # "optuna", "ray", or "wandb"
)
hyperparameter_search()는 목적값과 최상의 하이퍼파라미터 조합을 담은 ~trainer.utils.BestRun을 반환해요.
best_run = trainer.hyperparameter_search(...)
best_run.objective # 0.38 (best eval loss)
best_run.hyperparameters # {"learning_rate": 5e-5, "num_train_epochs": 4, ...}
최상의 하이퍼파라미터를 TrainingArguments에 적용하고 전체 데이터셋으로 다시 학습해요.
더 알아보기 (Learn more)
- Optuna, Ray Tune, Weights & Biases 문서를 확인해 주세요.