본문 바로가기

LAB

[ML/DL] 모델 학습 시 over-fitting(과적합)은 왜 일어날까? + 해결 방법

over-fitting: 모델이 학습 데이터만 과하게 학습하여 새로운 데이터(test)에서는 일반화 성능이 떨어지는 현상
=> train 시 높은 정확도 & 낮은 loss, test 시 낮은 정확도 & 높은 loss 발생
쉽게 말해서 모델이 학습 데이터셋을 외운 상태라고 볼 수 있다.
이처럼 모델이 과적합 상태가 되면 학습 단계에서만 높은 성능을 내고 실제 테스트에서는 낮은 성능을 보이게 된다.

Epoch을 필요 이상으로 주게 될 시 발생한다.
train 데이터셋을 과도하게 학습 -> 해당 데이터셋의 노이즈, 패턴 등을 암기 -> 깡통 모델이 뿅

가장 고성능의 에폭 값은 train과 val의 loss가 갑자기 과하게 벌어지는 지점에서 얻을 수 있다.
*val은 test를 수행하기 전 예비 test 느낌이라고 보면 된다.

그러나 요즘은 모델이 과적합 상태에 빠지지 않도록 Early Stopping과 Model Checkpoint를 사용하여 자동으로 제어할 수 있다.
위에서 말한 과정 그대로 train과 val의 loss 격차가 커지기 시작하는 시점에서 학습을 자동으로 중단 -> 그때의 모델 가중치를 best.pt로 저장
여에서 best.pt 파일이 val의 loss가 최소가 되는 시점의 모델(= train과 val의 균형이 가장 잘 맞는 지점의 모델)이다.

-
예제 코드

from ultralytics import YOLO

# 모델 불러오기
model = YOLO('yolov8n.pt')

# 학습
results = model.train(
    data='dataset.yaml',     # dataset 설정 파일
    epochs=100,              
    patience=3,              # 성능이 3 Epoch 동안 개선되지 않으면 Early Stopping
    batch=16,                # 배치 크기
    imgsz=640,               
    project='runs/train',    # 저장 폴더
    name='exp',              # 실험 이름
    exist_ok=True            # 폴더 덮어쓰기 허용
)

학습하면서 train loss와 val loss를 매 epoch마다 비교함 -> 일정 epoch 동안 val loss가 개선되지 않으면 자동으로 학습 중단 (Early Stopping)
중단과 동시에 val loss가 가장 낮았던 시점의 가중치(best.pt) 를 저장
=> best.pt 얻기 가능

배치에 관해서는 추후 내용 삽입