🤖 AI/ML

Overfitting

과적합

학습 데이터에 과도하게 맞춰짐. 새 데이터 일반화 실패.

📖 상세 설명

과적합(Overfitting)은 머신러닝 모델이 학습 데이터에 지나치게 맞춰져서, 새로운 데이터에 대한 예측 성능이 떨어지는 현상입니다. 학습 데이터의 노이즈나 우연한 패턴까지 암기하여 일반화(Generalization) 능력이 저하됩니다.

과적합 개념은 통계학의 편향-분산 트레이드오프(Bias-Variance Tradeoff)에서 유래했습니다. 모델이 복잡해질수록 학습 데이터에는 잘 맞지만(낮은 편향), 새 데이터에는 예측이 불안정해집니다(높은 분산). 1990년대 신경망 연구에서 특히 중요한 문제로 부각되었습니다.

과적합은 학습 손실은 계속 감소하는데 검증 손실이 증가할 때 발생합니다. 모델 파라미터 수가 학습 데이터 양에 비해 과도하게 많거나, 학습을 너무 오래 진행할 때 주로 나타납니다. 반대 현상인 과소적합(Underfitting)은 모델이 너무 단순하여 데이터의 패턴을 학습하지 못하는 경우입니다.

실무에서 과적합 방지는 모델 성능의 핵심입니다. Dropout, 조기 종료(Early Stopping), 데이터 증강, 정규화(L1/L2) 등의 기법이 널리 사용됩니다. 검증 세트와 테스트 세트를 분리하여 모델의 일반화 성능을 객관적으로 평가해야 합니다.

💻 코드 예제

# 과적합 방지 기법 예제 (PyTorch)
import torch
import torch.nn as nn
from torch.optim import Adam

# 과적합 방지 기법이 적용된 모델
class RegularizedModel(nn.Module):
    def __init__(self, input_dim, hidden_dim, output_dim, dropout_rate=0.5):
        super().__init__()
        self.layers = nn.Sequential(
            nn.Linear(input_dim, hidden_dim),
            nn.ReLU(),
            nn.Dropout(dropout_rate),  # 1. Dropout: 무작위로 뉴런 비활성화
            nn.Linear(hidden_dim, hidden_dim),
            nn.ReLU(),
            nn.Dropout(dropout_rate),
            nn.Linear(hidden_dim, output_dim)
        )

    def forward(self, x):
        return self.layers(x)

model = RegularizedModel(10, 64, 1, dropout_rate=0.3)

# 2. L2 정규화 (Weight Decay)
optimizer = Adam(model.parameters(), lr=0.001, weight_decay=0.01)

# 3. Early Stopping 구현
class EarlyStopping:
    def __init__(self, patience=5, min_delta=0.001):
        self.patience = patience
        self.min_delta = min_delta
        self.counter = 0
        self.best_loss = float('inf')
        self.should_stop = False

    def __call__(self, val_loss):
        if val_loss < self.best_loss - self.min_delta:
            self.best_loss = val_loss
            self.counter = 0
        else:
            self.counter += 1
            if self.counter >= self.patience:
                self.should_stop = True
        return self.should_stop

early_stopping = EarlyStopping(patience=10)

# 학습 루프에서 과적합 모니터링
for epoch in range(1000):
    # 학습 단계...
    train_loss = 0.1  # 예시
    val_loss = 0.15   # 예시 - 검증 손실

    # 검증 손실이 증가하면 조기 종료
    if early_stopping(val_loss):
        print(f"Early stopping at epoch {epoch}")
        break

🗣️ 실무에서 이렇게 말하세요

💬 회의에서
"학습 정확도는 98%인데 테스트 정확도가 75%입니다. 전형적인 과적합 상황이라 Dropout을 0.3에서 0.5로 높이고 데이터 증강을 추가할 계획입니다."
💬 면접에서
"과적합은 모델이 학습 데이터를 암기하여 일반화 능력이 떨어지는 현상입니다. 편향-분산 트레이드오프 관점에서 분산이 높아진 상태이며, Dropout, Early Stopping, 정규화 등으로 방지합니다."
💬 기술 토론에서
"학습 데이터가 적을 때는 모델 복잡도를 낮추거나 전이학습을 활용해야 합니다. 파라미터 수가 학습 샘플 수보다 훨씬 많으면 과적합 위험이 높습니다."

이 주제로 모의면접 보기 → WIA SOOM AI 면접 · 무료로 시작

⚠️ 흔한 실수 & 주의사항

❌
테스트 세트로 하이퍼파라미터 튜닝

테스트 세트를 모델 선택에 사용하면 테스트 세트에 과적합됩니다. 반드시 별도의 검증 세트를 사용하세요.

❌
학습 곡선 무시

학습 손실만 보고 모델 성능을 판단하면 과적합을 놓칩니다. 반드시 학습/검증 손실을 함께 모니터링하세요.

✅
올바른 방법

Train/Validation/Test로 데이터를 3분할하고, 학습 곡선을 시각화하여 과적합 시점을 파악하세요. Early Stopping과 모델 체크포인트를 함께 사용합니다.

🔗 관련 용어

📚 더 배우기