Overfitting
과적합은 모델이 노이즈까지 포함해 학습 데이터를 외우고 새로운 데이터에서는 제대로 작동하지 않을 때 발생합니다. 과적합을 알아차리는 방법과 이를 방지하는 기법을 살펴보세요.
머신러닝 모델이 학습 데이터에 지나치게 맞춰져 실제 패턴뿐 아니라 특정 예시의 노이즈와 특이점까지 학습하면 과적합이 발생합니다. 과적합된 모델은 학습 데이터에서는 점수가 높지만 새 데이터에서는 눈에 띄게 낮은 점수를 보이며, 두 점수의 차이는 과적합의 정도를 나타냅니다. 편향-분산 관점에서 과적합은 높은 분산에 해당합니다. 즉, 모델 예측이 실제로 접한 특정 샘플에 지나치게 좌우됩니다.
과적합 알아보기#
대표적인 징후는 학습 데이터와 검증 데이터 성능의 차이가 커지는 것입니다. 에포크별로 나타낸 학습 곡선에서 학습 손실은 계속 낮아지는 반면 검증 손실은 평탄해졌다가 상승하고, 평균 정밀도(mAP) 같은 검증 지표는 정체되거나 하락합니다. 소규모로 보여주는 전형적인 예에서는 사인파에서 샘플링한 노이즈가 있는 점 12개에 서로 다른 차수의 다항식 두 개를 피팅합니다:
import numpy as np
from numpy.polynomial import Polynomial
rng = np.random.default_rng(0)
# 12 noisy training points from a sine wave, plus clean test points
x_train = rng.uniform(0, 1, 12)
y_train = np.sin(2 * np.pi * x_train) + rng.normal(0, 0.2, 12)
x_test = np.linspace(0, 1, 200)
y_test = np.sin(2 * np.pi * x_test)
for degree in (3, 9):
fit = Polynomial.fit(x_train, y_train, degree)
train_mse = np.mean((fit(x_train) - y_train) ** 2)
test_mse = np.mean((fit(x_test) - y_test) ** 2)
print(f"Degree {degree:2d}: train MSE {train_mse:.4f}, test MSE {test_mse:.4f}")9차 다항식은 노이즈에 맞춰 휘어질 만큼 유연하므로 학습 오차를 0.0356에서 0.0148로 낮추지만, 테스트 오차는 0.0182에서 0.1859로 10배 증가시킵니다.
과적합과 과소적합#
과소적합은 반대되는 문제입니다. 모델이 너무 단순하거나 학습 시간이 너무 짧아 데이터의 패턴을 포착하지 못하므로 학습 데이터와 검증 데이터 모두에서 성능이 낮습니다. 두 오차를 비교하면 문제를 구분하고 서로 다른 해결 방법을 찾을 수 있습니다.
일반적인 원인#
- 데이터에 비해 지나치게 큰 모델 용량: 수백만 개의 파라미터를 가진 신경망은 이미지 수백 장을 그대로 암기할 수 있습니다.
- 노이즈가 있거나 레이블이 잘못된 데이터: 누락된 박스, 잘못된 클래스, 이상치는 실제 세계에는 없는 오류를 모델이 학습하게 합니다.
- 지나치게 긴 학습: 유용한 패턴을 학습한 뒤에는 추가 에포크를 대부분 남아 있는 노이즈에 맞추는 데 사용합니다.
- 범위가 좁은 학습 데이터: 한 대의 카메라로 낮에 촬영한 이미지에만 학습된 검출기는 해당 카메라의 배경과 조명에 과도하게 의존하여 새로운 장소의 객체를 놓칠 수 있습니다.
과적합 방지#
- 더 많고 다양한 데이터: 실제 예시를 추가하는 것이 가장 직접적인 해결책이며, 데이터 증강은 기존 이미지를 뒤집고, 크기를 조정하고, 색상을 바꾸고, 혼합하여 다양성을 늘립니다.
- 정규화: 가중치 감쇠는 큰 가중치에 페널티를 부과하며, 드롭아웃은 학습 중 유닛을 무작위로 비활성화하여 단일 특징이 필수 요소가 되지 않도록 합니다.
- 더 작거나 사전 학습된 모델: 더 작은 모델은 데이터를 암기할 여지가 적으며, 초기 레이어를 고정한 전이 학습은 소규모 데이터셋에서 학습해야 하는 가중치 수를 줄입니다.
- 조기 종료: 매 에포크 후 검증 데이터를 평가하고 점수가 더 이상 개선되지 않으면 중단하여 모델이 노이즈까지 학습하지 않도록 합니다.
- 공정한 평가: 교차 검증은 소규모 데이터셋의 일반화 오차를 더 신뢰성 있게 추정하며, 별도의 테스트 세트는 하이퍼파라미터 튜닝 중 검증 데이터에 과적합되는 문제를 찾아냅니다.
Ultralytics YOLO 학습은 patience 인수로 조기 종료를 적용합니다. 이 인수는 검증 적합도(detection의 경우 mAP50-95)가 개선되지 않은 에포크가 해당 횟수에 도달하면 실행을 종료하며, 학습을 끝까지 진행하더라도 최고 성능을 기록한 에포크의 가중치를 best.pt로 저장합니다.
from ultralytics import YOLO
# 사전 학습된 YOLO26n 모델을 불러옵니다
model = YOLO("yolo26n.pt")
# # 최대 100 에포크까지 학습하되, 검증 성능이 20 에포크 동안 개선되지 않으면 중단합니다.
results = model.train(data="coco8.yaml", epochs=100, patience=20)기본값은 patience=100이며, 이미지가 1,000장 미만인 데이터셋의 경우 YOLO26 파인튜닝 가이드에서는 epochs=50과 patience=20를 제안합니다.
과적합과 관련 용어 비교#
- 데이터 누수: 학습 데이터와 평가 데이터가 겹쳐 과적합을 감춥니다. 같은 동영상에서 나온 거의 중복된 프레임이 학습 및 검증 분할에 모두 포함되면, 학습 세트를 외운 모델이 검증에서도 여전히 좋은 점수를 얻고 배포 후에야 문제가 드러납니다. 동영상 또는 장면 단위로 분할하면 이를 방지할 수 있습니다.
- 편법 학습: 모델이 학습 데이터와 검증 데이터 모두에 있는 워터마크나 배경 같은 허위 단서에 의존합니다. 검증 점수는 양호하게 보이지만, 해당 단서가 없는 새 데이터에서는 모델이 실패합니다.










