머신러닝과 딥러닝 모델을 개발하다 보면 한 번쯤은 겪게 되는 문제, 오버피팅(Overfitting).
훈련 데이터에 너무 잘 맞춰진 나머지, 새로운 데이터에서는 형편없는 성능을 보이곤 합니다.
이번 글에서는 실무와 연구에서 검증된 오버피팅 방지 기법 8가지를 정리해봅니다. 단순 개념 설명을 넘어, 각 기법이 어떤 상황에 유리한지도 함께 소개합니다.
핵심 아이디어: 가중치가 너무 커지는 것을 방지하여 모델의 복잡도를 제어
L1 정규화는 가중치의 절댓값 합을 페널티로 부여하여 희소성(sparsity)을 유도
L2 정규화는 가중치 제곱합을 페널티로 부여하여 일반적인 크기 억제
PyTorch 기준:
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, weight_decay=1e-4) # L2 적용
핵심 아이디어: 학습 시 뉴런 일부를 랜덤으로 꺼서 모델이 특정 노드에 과도하게 의존하는 것을 방지
훈련 시에는 일부 연결 제거 → 테스트 시 전체 모델 사용
일반적으로 0.3 ~ 0.5
사이의 Dropout Rate가 효과적
PyTorch 예시:
nn.Dropout(p=0.5)
핵심 아이디어: 검증 성능이 더 이상 향상되지 않을 때 학습을 조기 종료하여 과적합 방지
patience
설정을 통해 몇 번의 검증 실패까지 허용할지 지정 가능
예시 (pseudo-code):
if val_loss > best_loss:
counter += 1
if counter >= patience:
stop_training()
핵심 아이디어: 기존 데이터를 변형하여 학습 데이터 다양성 확보
torchvision.transforms
로 augmentation 구성핵심 아이디어: 모델을 다양한 데이터 분할에서 검증하여 일반화 능력 평가
핵심 아이디어: 여러 모델의 예측을 결합하여 더 안정적인 결과 도출
핵심 아이디어: 파라미터 수를 줄이거나 모델 구조를 단순화하여 과적합 유도 요소 제거
핵심 아이디어: 학습 중 입력 또는 가중치에 노이즈를 추가하여 모델의 과도한 적합 방지
입력 노이즈, 가중치 노이즈, 라벨 노이즈 등 다양하게 응용 가능
예시:
noisy_input = input + torch.randn_like(input) * noise_std
오버피팅은 하나의 기법으로 해결되지 않습니다.
데이터 특성과 모델 구조에 따라, 위 기법들을 조합해 적용하는 것이 가장 효과적입니다.
가능하다면 학습 로그를 기록하고 시각화하여, 오버피팅 징후를 조기에 감지하는 것도 좋습니다.