🤖 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, 정규화 등으로 방지합니다."
💬 기술 토론에서
"학습 데이터가 적을 때는 모델 복잡도를 낮추거나 전이학습을 활용해야 합니다. 파라미터 수가 학습 샘플 수보다 훨씬 많으면 과적합 위험이 높습니다."

⚠️ 흔한 실수 & 주의사항

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

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

학습 곡선 무시

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

올바른 방법

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

🔗 관련 용어

📚 더 배우기