728x90
반응형
모델이 훈련 데이터에서는 정확도가 높은데, 검증 데이터나 실제 환경에서는 예측 성능이 크게 떨어지는 경우가 있나요?
그렇다면 당신의 모델은 **과적합(overfitting)**에 걸렸을 확률이 높습니다.
이번 글에서는:
- 과적합이 왜 생기는지
- 실전에서 어떻게 막거나 줄이는지
- 그리고 코드 예시까지 포함해 실용적으로 정리합니다.
1. 과적합이란?
과적합은 모델이 훈련 데이터를 과하게 학습해, 데이터의 패턴뿐 아니라 노이즈까지 외워버리는 현상입니다.
그 결과, 새로운 데이터에 일반화되지 못하고 성능이 떨어지는 문제가 생깁니다.
원인
- 모델이 너무 복잡할 때 (레이어 많고 파라미터 많은 딥러닝 모델 등)
- 훈련 데이터 양이 적을 때
- 불필요한 특성(feature)이 포함됐을 때
2. 과적합 방지 전략
A. 데이터 관련 전략
① 데이터 증강 (Data Augmentation)
- 특히 이미지, 텍스트, 오디오에서는 입력을 다양하게 변형해서 데이터 수를 늘리는 효과.
- 일반화에 큰 도움을 줍니다.
from keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(
rotation_range=20,
zoom_range=0.15,
width_shift_range=0.2,
height_shift_range=0.2,
horizontal_flip=True)
datagen.fit(X_train)
② 데이터 양 늘리기
- 더 많은 데이터를 확보하면, 모델이 특정 샘플을 외울 가능성이 줄어듭니다.
- 웹 크롤링, 시뮬레이션, 증강 등 다양한 방식으로 수집 가능.
📌 B. 모델 구조 관련 전략
③ 드롭아웃(Dropout)
- 학습 중 일부 뉴런을 랜덤하게 끄는 방식.
- 특정 뉴런에 의존하지 않도록 하여 일반화 성능 향상.
from keras.layers import Dropout, Dense
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
④ 배치 정규화 (Batch Normalization)
- 각 배치 단위로 입력을 정규화 → 학습 안정화 + 과적합 억제
from keras.layers import BatchNormalization
model.add(Dense(128))
model.add(BatchNormalization())
model.add(Activation('relu'))
⑤ 모델 단순화
- 복잡한 모델은 데이터를 외우기 쉽습니다.
- 레이어 수나 노드 수를 줄이기만 해도 과적합을 막을 수 있음.
C. 학습 관련 전략
⑥ 조기 종료 (Early Stopping)
- 검증 손실이 일정 에폭 이상 개선되지 않으면 학습을 멈춤
- 가장 좋은 모델 상태를 자동 저장 가능
from keras.callbacks import EarlyStopping
early_stop = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)
model.fit(X_train, y_train, validation_split=0.2, epochs=100, callbacks=[early_stop])
⑦ 정규화 (Regularization)
- L1 정규화: 가중치 일부를 0으로 만들어 특성 선택 효과
- L2 정규화: 가중치가 너무 커지는 걸 막아 일반화 향상
from keras.regularizers import l2
model.add(Dense(64, activation='relu', kernel_regularizer=l2(0.01)))
⑧ 학습률 스케줄링
- 처음엔 빠르게 학습하다가 나중에는 천천히 → 안정적 수렴
from keras.callbacks import ReduceLROnPlateau
lr_schedule = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=3)
3. 에폭 수 조절 및 시각화
너무 짧은 학습 → 과소적합
너무 긴 학습 → 과적합
그래서 검증 손실이 언제부터 다시 증가하는지 확인하는 것이 중요합니다.
시각화 도구 추천:
- TensorBoard
- Weights & Biases (wandb)
# TensorBoard 사용 예시
tensorboard --logdir=logs/
실전 적용 예시: 케라스로 조기 종료 + 정규화 적용하기
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.callbacks import EarlyStopping
model = Sequential()
model.add(Dense(64, activation='relu', kernel_regularizer=l2(0.001)))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
early_stop = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, validation_split=0.2, epochs=100, callbacks=[early_stop])
마무리
과적합은 모든 모델이 한 번쯤 겪는 자연스러운 문제입니다.
하지만 적절한 전략을 적용하면 충분히 통제 가능합니다.
기억하세요:
- 복잡한 모델 + 적은 데이터 조합은 과적합 위험이 큼
- 검증 성능을 항상 함께 체크
- 하나의 전략이 아닌, 여러 전략을 조합해서 사용하는 것이 실전에서는 일반적 훈련 정확도에 만족하지 말고, 진짜 실력은 검증 데이터와 실제 환경에서 드러난다는 점을 꼭 기억하세요.
728x90
반응형
'Basic' 카테고리의 다른 글
[Backend][Basic] AWS에서 서비스 배포 및 관리: Lambda, EC2, RDS, S3와 Auto Scaling, ELB 활용 (0) | 2025.03.31 |
---|---|
[Backend][Basic] 머신러닝/딥러닝 모델 성능 평가 (0) | 2025.03.25 |
[Backend][Basic] 자바 메모리 구조와 가비지 컬렉션 완벽 정리 (0) | 2025.03.24 |
[Backend][Basic] 대규모 언어 모델(LLM) 완벽 가이드 (0) | 2025.03.21 |
[Backend][Basic] REST API와 JWT 인증, AWS EC2를 이용한 배포 과정 완벽 가이드 (2) | 2025.03.19 |