Ultralytics YOLO 하이퍼파라미터 튜닝 가이드

소개

하이퍼파라미터 튜닝은 단순히 일회성 설정이 아니라 정확도, 정밀도, 재현율과 같은 머신러닝 모델의 성능 지표를 최적화하기 위한 반복적인 과정입니다. Ultralytics YOLO에서 이러한 하이퍼파라미터는 학습률부터 레이어 수 또는 사용되는 활성화 함수 유형과 같은 아키텍처 세부 사항까지 다양할 수 있습니다. Ultralytics Platform은 구성 가능한 하이퍼파라미터와 실시간 지표 추적을 통한 클라우드 학습을 지원합니다.



Watch: How to Tune Hyperparameters for Better Model Performance 🚀

하이퍼파라미터란 무엇인가요?

하이퍼파라미터는 알고리즘을 위한 상위 수준의 구조적 설정입니다. 이는 학습 단계 이전에 설정되며 학습이 진행되는 동안 일정하게 유지됩니다. Ultralytics YOLO에서 일반적으로 튜닝되는 하이퍼파라미터는 다음과 같습니다:

  • 학습률(Learning Rate) lr0: 손실 함수의 최솟값으로 이동하는 동안 각 반복 단계에서 이동할 보폭을 결정합니다.
  • 배치 사이즈 batch: 순방향 패스(forward pass)에서 동시에 처리되는 이미지의 수입니다.
  • 에포크epochs: 에포크는 모든 학습 예제에 대한 하나의 완전한 순방향 및 역방향 패스를 의미합니다.
  • 아키텍처 세부 사항: 채널 수, 레이어 수, 활성화 함수 유형 등.

Hyperparameter optimization search space visualization

YOLO26에서 사용되는 전체 증강 하이퍼파라미터 목록은 설정 페이지를 참조하십시오.

유전 알고리즘(Genetic Evolution) 및 변이(Mutation)

Ultralytics YOLO는 하이퍼파라미터를 최적화하기 위해 유전 알고리즘을 사용합니다. 유전 알고리즘은 자연 선택과 유전학의 메커니즘에서 영감을 받았습니다.

  • 교차(Crossover): 각 반복은 피트니스 가중치를 적용한 부모 선택과 함께 BLX-α 교차를 사용하여 지금까지 확인된 가장 높은 피트니스 구성을 가진 최대 9개까지의 유전자를 결합합니다.
  • 변이(Mutation): 재조합된 후보는 각 하이퍼파라미터에 적용되는 로그-정규 승법 계수(매개변수당 확률 0.5)에 의해 변형됩니다. 변이 강도 시그마는 첫 300회 반복 동안 0.2에서 0.1로 선형적으로 감소하며, 이를 통해 알고리즘은 초기에 광범위하게 탐색하고 수렴함에 따라 정교화합니다. 1회차 반복에서는 교차할 부모가 없으므로 기본 학습 하이퍼파라미터를 기준값으로 사용합니다.

하이퍼파라미터 튜닝 준비하기

튜닝 과정을 시작하기 전에 다음 사항을 확인하는 것이 중요합니다:

  1. 지표 식별: 모델의 성능을 평가하는 데 사용할 지표를 결정하십시오. 이는 AP50, F1-score 등이 될 수 있습니다.
  2. 튜닝 예산 설정: 할당할 컴퓨팅 자원 규모를 정의하십시오. 하이퍼파라미터 튜닝은 컴퓨팅 집약적일 수 있습니다.

관련 단계

하이퍼파라미터 초기화

적절한 초기 하이퍼파라미터 세트로 시작하십시오. 이는 Ultralytics YOLO에서 설정한 기본 하이퍼파라미터이거나 도메인 지식 또는 이전 실험을 기반으로 한 것일 수 있습니다.

하이퍼파라미터 변이

_mutate 메서드를 사용하여 기존 세트를 기반으로 새로운 하이퍼파라미터 세트를 생성하십시오. Tuner 클래스가 이 과정을 자동으로 처리합니다.

모델 학습

변이된 하이퍼파라미터 세트를 사용하여 학습이 수행됩니다. 그런 다음 선택한 지표를 사용하여 학습 성능을 평가합니다.

모델 평가

AP50, F1-score 또는 사용자 정의 지표와 같은 지표를 사용하여 모델 성능을 평가하십시오. 평가 과정은 현재 하이퍼파라미터가 이전보다 더 나은지 판단하는 데 도움을 줍니다.

결과 기록

성능 지표와 해당 하이퍼파라미터를 향후 참조를 위해 기록하는 것이 중요합니다. Ultralytics YOLO는 이러한 결과를 자동으로 NDJSON 형식으로 저장합니다.

반복

설정된 반복 횟수에 도달하거나 성능 지표가 만족스러울 때까지 이 과정을 반복합니다. 각 반복은 이전 실행에서 얻은 지식을 바탕으로 개선됩니다.

기본 탐색 공간(Search Space) 설명

다음 표는 YOLO26에서 하이퍼파라미터 튜닝을 위한 기본 탐색 공간 매개변수를 나열합니다. 각 매개변수는 튜플 (min, max)로 정의된 특정 값 범위를 갖습니다.

매개변수유형(Type)값 범위설명
lr0float(1e-5, 1e-2)학습 시작 시의 초기 학습률입니다. 낮은 값은 더 안정적인 학습을 제공하지만 수렴 속도가 느려질 수 있습니다.
lrffloat(0.01, 1.0)lr0의 분율로 표시되는 최종 학습률 계수입니다. 학습 중에 학습률이 얼마나 감소할지 제어합니다.
momentumfloat(0.7, 0.98)SGD 모멘텀 계수입니다. 높은 값은 일관된 기울기 방향을 유지하는 데 도움이 되며 수렴 속도를 높일 수 있습니다.
weight_decayfloat(0.0, 0.001)과적합(overfitting) 방지를 위한 L2 정규화 계수입니다. 큰 값은 더 강력한 정규화를 적용합니다.
warmup_epochsfloat(0.0, 5.0)선형 학습률 웜업(warmup)을 위한 에포크 수입니다. 초기 학습 불안정성을 방지하는 데 도움이 됩니다.
warmup_momentumfloat(0.0, 0.95)웜업 단계에서의 초기 모멘텀입니다. 최종 모멘텀 값으로 점진적으로 증가합니다.
boxfloat(1.0, 20.0)총 손실 함수 내의 BBox 손실 가중치입니다. 박스 회귀와 분류 간의 균형을 맞춥니다.
clsfloat(0.1, 4.0)총 손실 함수 내의 분류 손실 가중치입니다. 높은 값은 정확한 클래스 예측을 강조합니다.
cls_pwfloat(0.0, 1.0)클래스 불균형을 처리하기 위한 클래스 가중치 파워입니다. 높은 값은 희귀 클래스에 대한 가중치를 높입니다.
dflfloat(0.4, 12.0)총 손실 함수 내의 DFL (Distribution Focal Loss) 가중치입니다. 높은 값은 정밀한 BBox 위치 결정을 강조합니다.
hsv_hfloat(0.0, 0.1)HSV 색상 공간의 무작위 색조 증강 범위입니다. 색상 변화 전반에 걸쳐 모델이 일반화되도록 돕습니다.
hsv_sfloat(0.0, 0.9)HSV 공간의 무작위 채도 증강 범위입니다. 다양한 조명 조건을 시뮬레이션합니다.
hsv_vfloat(0.0, 0.9)무작위 명도(밝기) 증강 범위입니다. 모델이 다양한 노출 수준을 처리하도록 돕습니다.
degreesfloat(0.0, 45.0)최대 회전 증강(도 단위)입니다. 모델이 객체 방향에 대해 불변성을 갖도록 돕습니다.
translatefloat(0.0, 0.9)이미지 크기의 분율로 표시되는 최대 이동 증강입니다. 객체 위치에 대한 견고성을 향상시킵니다.
scalefloat(0.0, 0.95)무작위 크기 조절 증강 범위입니다. 모델이 다양한 크기의 객체를 감지하도록 돕습니다.
shearfloat(0.0, 10.0)최대 전단(shear) 증강(도 단위)입니다. 학습 이미지에 원근감과 유사한 왜곡을 추가합니다.
perspectivefloat(0.0, 0.001)무작위 원근감 증강 범위입니다. 다양한 시청 각도를 시뮬레이션합니다.
flipudfloat(0.0, 1.0)학습 중 수직 이미지 뒤집기 확률입니다. 항공/드론 이미지에 유용합니다.
fliplrfloat(0.0, 1.0)수평 이미지 뒤집기 확률입니다. 모델이 객체 방향에 대해 불변성을 갖도록 돕습니다.
bgrfloat(0.0, 1.0)색상 채널을 바꾸는 BGR 증강 사용 확률입니다. 색상 불변성에 도움을 줄 수 있습니다.
mosaicfloat(0.0, 1.0)4개 이미지를 결합하는 모자이크 증강 사용 확률입니다. 특히 작은 객체 탐지에 유용합니다.
mixupfloat(0.0, 1.0)두 이미지를 혼합하는 mixup 증강 사용 확률입니다. 모델 견고성을 향상시킬 수 있습니다.
cutmixfloat(0.0, 1.0)cutmix 증강 사용 확률입니다. 로컬 특징을 유지하면서 이미지 영역을 결합합니다.
copy_pastefloat(0.0, 1.0)copy-paste 증강 사용 확률입니다. 인스턴스 분할(segmentation) 성능을 향상시킵니다.
close_mosaicfloat(0.0, 10.0)완료 전 학습을 안정화하기 위해 마지막 N 에포크에서 모자이크를 비활성화합니다.

사용자 정의 탐색 공간 예시

다음은 검색 공간을 정의하고 model.tune() 메서드를 사용하여 Tuner 클래스를 활용해 COCO8에서 YOLO26n의 하이퍼파라미터를 30 에포크 동안 튜닝하는 방법입니다. AdamW 최적화 도구를 사용하고 더 빠른 튜닝을 위해 플로팅, 체크포인트 저장, 최종 에포크 외의 검증은 건너뜁니다.

경고

이 예시는 데모용입니다. 짧거나 소규모 튜닝 실행에서 파생된 하이퍼파라미터는 실제 학습에는 거의 최적이지 않습니다. 실제로 튜닝은 신뢰할 수 있고 전이 가능한 결과를 보장하기 위해 유사한 데이터셋, 에포크, 증강 등을 포함하여 전체 학습과 유사한 설정에서 수행되어야 합니다. 빠른 튜닝은 더 빠른 수렴이나 단기적인 검증 이득에 편향될 수 있으며, 이는 일반화되지 않을 수 있습니다.

예시
from ultralytics import YOLO

# Initialize the YOLO model
model = YOLO("yolo26n.pt")

# Define search space
search_space = {
    "lr0": (1e-5, 1e-2),
    "degrees": (0.0, 45.0),
}

# Tune hyperparameters on COCO8 for 30 epochs
model.tune(
    data="coco8.yaml",
    epochs=30,
    iterations=300,
    optimizer="AdamW",
    space=search_space,
    plots=False,
    save=False,
    val=False,
)

중단된 하이퍼파라미터 튜닝 세션 재개

You can resume an interrupted hyperparameter tuning session by passing resume=True. You can optionally pass the directory name used under runs/{task} to resume. Otherwise, it would resume the last interrupted session. You also need to provide all the previous training arguments including data, epochs, iterations and space.

`model.tune()`과 함께 `resume=True` 사용
from ultralytics import YOLO

# Define a YOLO model
model = YOLO("yolo26n.pt")

# Define search space
search_space = {
    "lr0": (1e-5, 1e-2),
    "degrees": (0.0, 45.0),
}

# Resume previous run
results = model.tune(data="coco8.yaml", epochs=50, iterations=300, space=search_space, resume=True)

# Resume tuning run with name 'tune_exp'
results = model.tune(data="coco8.yaml", epochs=50, iterations=300, space=search_space, name="tune_exp", resume=True)

Results

하이퍼파라미터 튜닝 과정을 성공적으로 완료하면 튜닝 결과를 담은 여러 파일과 디렉토리를 얻게 됩니다. 다음은 각 항목에 대한 설명입니다.

파일 구조

결과 디렉토리 구조는 다음과 같습니다. train1/과 같은 학습 디렉토리에는 개별 튜닝 반복, 즉 하나의 하이퍼파라미터 세트로 학습된 하나의 모델이 포함됩니다. tune/ 디렉토리에는 모든 개별 모델 학습에서 나온 튜닝 결과가 포함됩니다.

runs/
└── detect/
    ├── train1/
    ├── train2/
    ├── ...
    └── tune/
        ├── best_hyperparameters.yaml
        ├── tune_fitness.png
        ├── tune_results.ndjson
        ├── tune_scatter_plots.png
        └── weights/
            ├── last.pt
            └── best.pt

파일 설명

best_hyperparameters.yaml

이 YAML 파일에는 튜닝 과정에서 발견된 최적의 하이퍼파라미터가 포함되어 있습니다. 이 파일을 사용하여 향후 학습 시 최적화된 설정으로 초기화할 수 있습니다.

  • 형식: YAML

  • 용도: 하이퍼파라미터 결과

  • 예시:

    # 558/900 iterations complete ✅ (45536.81s)
    # Results saved to /usr/src/ultralytics/runs/detect/tune
    # Best fitness=0.64297 observed at iteration 498
    # Best fitness metrics are {'metrics/precision(B)': 0.87247, 'metrics/recall(B)': 0.71387, 'metrics/mAP50(B)': 0.79106, 'metrics/mAP50-95(B)': 0.62651, 'val/box_loss': 2.79884, 'val/cls_loss': 2.72386, 'val/dfl_loss': 0.68503, 'fitness': 0.64297}
    # Best fitness model is /usr/src/ultralytics/runs/detect/train498
    # Best fitness hyperparameters are printed below.
    
    lr0: 0.00269
    lrf: 0.00288
    momentum: 0.73375
    weight_decay: 0.00015
    warmup_epochs: 1.22935
    warmup_momentum: 0.1525
    box: 18.27875
    cls: 1.32899
    dfl: 0.56016
    hsv_h: 0.01148
    hsv_s: 0.53554
    hsv_v: 0.13636
    degrees: 0.0
    translate: 0.12431
    scale: 0.07643
    shear: 0.0
    perspective: 0.0
    flipud: 0.0
    fliplr: 0.08631
    mosaic: 0.42551
    mixup: 0.0
    copy_paste: 0.0

tune_fitness.png

이 그래프는 반복 횟수에 따른 적합도(fitness)를 보여줍니다. 유전 알고리즘이 시간 경과에 따라 어떻게 수행되었는지 시각화하는 데 도움이 됩니다.

  • 형식: PNG
  • 용도: 성능 시각화

Hyperparameter Tuning Fitness vs Iteration

이 그래프에는 다음이 포함됩니다:

  • 데이터셋별 반복당 하나의 마커: 따라서 단일 데이터셋 실행 시 반복당 하나의 점이 표시되고, 다중 데이터셋 실행 시 반복당 데이터셋별로 하나의 점이 표시됩니다.
  • 점선으로 된 "평활화된 평균(smoothed mean)" 선: 반복별 최상위 적합도 값에 대해 가우시안 평활화(sigma=3)를 계산한 결과입니다.

tune_results.ndjson

각 튜닝 반복의 상세 결과가 포함된 NDJSON 파일입니다. 각 줄은 종합 적합도, 튜닝된 하이퍼파라미터, 데이터셋별 메트릭을 포함하는 하나의 JSON 객체입니다. 단일 데이터셋 튜닝과 다중 데이터셋 튜닝 모두 동일한 파일 형식을 사용합니다.

  • 형식: NDJSON
  • 용도: 반복별 결과 추적.
  • 예시:

가독성을 위해 아래에 보기 좋게 정렬된(pretty-printed) 예시가 표시됩니다. 실제 .ndjson 파일에서는 각 객체가 한 줄에 저장됩니다.

{
    "iteration": 1,
    "fitness": 0.48628,
    "hyperparameters": {
        "lr0": 0.01,
        "lrf": 0.01,
        "momentum": 0.937,
        "weight_decay": 0.0005
    },
    "datasets": {
        "coco8": {
            "metrics/precision(B)": 0.65666,
            "metrics/recall(B)": 0.85,
            "metrics/mAP50(B)": 0.85086,
            "metrics/mAP50-95(B)": 0.64104,
            "val/box_loss": 1.57958,
            "val/cls_loss": 1.04986,
            "val/dfl_loss": 1.32641,
            "fitness": 0.64104
        },
        "coco8-grayscale": {
            "metrics/precision(B)": 0.6582,
            "metrics/recall(B)": 0.51667,
            "metrics/mAP50(B)": 0.59106,
            "metrics/mAP50-95(B)": 0.33152,
            "val/box_loss": 1.95424,
            "val/cls_loss": 1.64059,
            "val/dfl_loss": 1.70226,
            "fitness": 0.33152
        }
    },
    "save_dirs": {
        "coco8": "runs/detect/coco8",
        "coco8-grayscale": "runs/detect/coco8-grayscale"
    }
}

최상위 fitness는 데이터셋별 fitness 값의 산술 평균입니다. 단일 데이터셋 튜닝의 경우 datasets 딕셔너리에 하나의 항목이 있으며, 해당 항목의 fitness는 최상위 fitness와 같습니다. 완료된 반복당 하나의 JSON 객체가 기록됩니다. 실제 save_dirs 경로는 절대 경로이며, 위 예시에서는 가독성을 위해 생략되었습니다.

tune_scatter_plots.png

이 파일에는 tune_results.ndjson에서 생성된 산점도가 포함되어 있어, 다양한 하이퍼파라미터와 성능 메트릭 간의 관계를 시각화하는 데 도움을 줍니다. 기본값이 0인 하이퍼파라미터(예: 아래의 degreesshear)는 곱셈 기반 변이 요인이 0에 가까운 값에서 확장될 여지가 거의 없기 때문에 초기 시드에서 천천히 진화할 수 있습니다.

  • 형식: PNG
  • 용도: 탐색적 데이터 분석

Hyperparameter tuning results scatter plot analysis

weights/

이 디렉토리에는 하이퍼파라미터 튜닝 과정 중 마지막 반복과 최적의 반복 시 저장된 PyTorch 모델이 포함되어 있습니다.

  • last.pt: last.pt는 학습의 마지막 에포크에서 나온 가중치입니다.
  • best.pt: best.pt는 최적의 적합도 점수를 달성한 반복의 가중치입니다.

이러한 결과를 사용하여 향후 모델 학습 및 분석을 위해 더 나은 결정을 내릴 수 있습니다. 이 아티팩트를 참조하여 모델이 얼마나 잘 수행되었는지, 그리고 어떻게 더 개선할 수 있을지 이해해 보시기 바랍니다.

결론

Ultralytics YOLO의 하이퍼파라미터 튜닝 과정은 BLX-α 교차(crossover)와 로그 정규 변이(log-normal mutation)를 결합한 유전 알고리즘 기반 접근 방식 덕분에 단순하면서도 강력합니다. 이 가이드에 명시된 단계를 따르면 모델을 체계적으로 튜닝하여 더 나은 성능을 얻을 수 있습니다.

더 읽어보기

  1. 위키백과의 하이퍼파라미터 최적화
  2. YOLOv5 하이퍼파라미터 진화 가이드
  3. Ray Tune과 YOLO26을 이용한 효율적인 하이퍼파라미터 튜닝

더 자세한 정보를 원하시면 Tuner 클래스 소스 코드와 관련 문서를 살펴보십시오. 질문, 기능 요청 또는 추가 지원이 필요하시면 언제든지 GitHub 또는 Discord를 통해 문의해 주십시오.

FAQ

하이퍼파라미터 튜닝 중에 Ultralytics YOLO의 학습률을 어떻게 최적화합니까?

Ultralytics YOLO의 학습률을 최적화하려면 lr0 파라미터를 사용하여 초기 학습률을 설정하는 것부터 시작하십시오. 일반적인 값은 0.001에서 0.01 사이입니다. 하이퍼파라미터 튜닝 과정에서 이 값은 최적의 설정을 찾기 위해 변이됩니다. model.tune() 메서드를 사용하여 이 과정을 자동화할 수 있습니다. 예를 들면 다음과 같습니다:

예시
from ultralytics import YOLO

# Initialize the YOLO model
model = YOLO("yolo26n.pt")

# Tune hyperparameters on COCO8 for 30 epochs
model.tune(data="coco8.yaml", epochs=30, iterations=300, optimizer="AdamW", plots=False, save=False, val=False)

자세한 내용은 Ultralytics YOLO 구성 페이지를 확인하십시오.

YOLO26에서 하이퍼파라미터 튜닝을 위해 유전 알고리즘을 사용하면 어떤 이점이 있습니까?

Ultralytics YOLO26의 유전 알고리즘은 하이퍼파라미터 공간을 탐색하는 강력한 방법을 제공하여 모델 성능을 최적화합니다. 주요 이점은 다음과 같습니다:

  • 효율적인 탐색: BLX-α 교차는 가장 적합도가 높은 부모로부터 유전자를 결합하며, 로그 정규 변이는 결과를 변화시켜 새로운 후보를 발견하게 합니다.
  • 지역 최적점(Local Minima) 회피: 무작위성을 도입함으로써 지역 최적점에 빠지는 것을 방지하고 더 나은 전역 최적화를 보장합니다.
  • 성능 메트릭: 작업별 적합도 점수(탐지의 경우 mAP50-95)를 기반으로 적응합니다.

유전 알고리즘이 하이퍼파라미터를 어떻게 최적화하는지 보려면 하이퍼파라미터 진화 가이드를 확인하십시오.

Ultralytics YOLO의 하이퍼파라미터 튜닝 과정은 얼마나 걸립니까?

Ultralytics YOLO의 하이퍼파라미터 튜닝에 필요한 시간은 데이터셋 크기, 모델 아키텍처의 복잡성, 반복 횟수, 가용한 컴퓨팅 자원 등 여러 요인에 따라 크게 달라집니다. 예를 들어, COCO8과 같은 데이터셋에서 YOLO26n을 30 에포크 동안 튜닝하는 데는 하드웨어에 따라 몇 시간에서 며칠이 소요될 수 있습니다.

튜닝 시간을 효과적으로 관리하려면 사전에 명확한 튜닝 예산을 정의하십시오(내부 섹션 링크). 이는 자원 할당과 최적화 목표 사이의 균형을 맞추는 데 도움이 됩니다.

YOLO에서 하이퍼파라미터 튜닝 중 모델 성능을 평가하기 위해 어떤 메트릭을 사용해야 합니까?

YOLO의 하이퍼파라미터 튜닝 중 모델 성능을 평가할 때 다음과 같은 주요 메트릭을 사용할 수 있습니다:

  • AP50: IoU 임계값이 0.50일 때의 평균 정밀도(Average Precision)입니다.
  • F1-Score: 정밀도와 재현율의 조화 평균입니다.
  • 정밀도와 재현율: 참 양성(True Positives) 대 거짓 양성(False Positives) 및 거짓 음성(False Negatives)을 식별하는 모델의 정확도를 나타내는 개별 메트릭입니다.

이러한 메트릭은 모델 성능의 다양한 측면을 이해하는 데 도움이 됩니다. 포괄적인 개요는 Ultralytics YOLO 성능 메트릭 가이드를 참조하십시오.

YOLO26에서 고급 하이퍼파라미터 최적화를 위해 Ray Tune을 사용할 수 있습니까?

네, Ultralytics YOLO26은 고급 하이퍼파라미터 최적화를 위해 Ray Tune과 통합됩니다. Ray Tune은 베이지안 최적화(Bayesian Optimization) 및 Hyperband와 같은 정교한 탐색 알고리즘을 제공하며, 튜닝 과정을 가속화하기 위한 병렬 실행 기능을 지원합니다.

To use Ray Tune with YOLO26, simply set the use_ray=True parameter in your model.tune() method call. For more details and examples, check out the Ray Tune integration guide.

댓글