CNN 모델에서 과대적합(Overfitting) 방지하는 법

발라·2025년 6월 5일

AI 이해의 첫걸음

목록 보기
12/21
post-thumbnail

딥러닝 모델을 만들다 보면, 훈련은 엄청 잘 되는데 정작 테스트 데이터에서는 맥을 못 추는 경우가 있어요.
"어..? 분명히 정확도 높았는데?" 싶을 정도로요.

이런 현상을 바로 과대적합(Overfitting)이라고 해요.
이번 글에서는 특히 CNN(Convolutional Neural Network) 모델에서 과대적합이 왜 생기는지, 그리고 어떻게 방지할 수 있는지 정리해볼게요.


✅ 과대적합이란?

훈련 데이터에 너무 딱 맞춰서 학습한 나머지, 새로운 데이터에는 성능이 떨어지는 현상

모델이 훈련 데이터에 있는 노이즈특이한 패턴까지 학습하면서 일반화 능력을 잃어버리게 돼요.
특히 이미지 처리에 자주 쓰이는 CNN 모델에서도 자주 발생하죠.


🔍 이런 증상 보이면 과대적합!

과대적합은 학습 그래프만 봐도 바로 알아차릴 수 있어요.

[ 예시 그래프 흐름 ]

Train Accuracy   : ↗↗↗↗↗↗↗
Validation Acc   : ↗↗→→↘↘↘

Train Loss       : ↘↘↘↘↘↘↘
Validation Loss  : ↘↘→→↗↗↗
  • 훈련 정확도는 계속 높아지는데, 검증 정확도는 오히려 떨어짐
  • 훈련 손실은 줄어드는데, 검증 손실은 다시 증가함

이런 그래프가 보이면 99% 과대적합이에요 😢


🔧 CNN 과대적합 방지 팁 6가지

1. Dropout

신경망의 일부 뉴런을 랜덤하게 끄는 방식으로, 특정 뉴런에 과하게 의존하지 않도록 하는 기법

from tensorflow.keras.layers import Dropout
model.add(Dropout(0.5))

보통 Fully Connected Layer 쪽에 많이 써요.
0.3~0.5 사이 비율이 적당해요!


2. Data Augmentation (데이터 증강)

학습 데이터를 인위적으로 늘려서 모델이 더 다양한 패턴을 학습할 수 있도록 함

from tensorflow.keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(
    rotation_range=15,
    zoom_range=0.1,
    width_shift_range=0.1,
    height_shift_range=0.1,
    horizontal_flip=True
)
datagen.fit(x_train)

특히 이미지가 적을 때 꼭 필요한 기술!
회전, 이동, 좌우 반전 등으로 다양한 이미지를 생성할 수 있어요.


3. L2 정규화 (Weight Decay)

큰 가중치에 패널티를 줘서 모델이 너무 복잡해지지 않도록 막는 기법

from tensorflow.keras.regularizers import l2
Conv2D(32, (3,3), activation='relu', kernel_regularizer=l2(0.001))

L1보다는 L2 정규화가 CNN에서 자주 쓰여요.


4. Early Stopping

검증 손실이 더 이상 줄어들지 않으면 학습을 조기 종료

from tensorflow.keras.callbacks import EarlyStopping

early_stop = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)
model.fit(x_train, y_train, validation_data=(x_val, y_val), epochs=100, callbacks=[early_stop])

과도한 Epoch 돌리기 방지!
훈련 시간이 줄어드는 부가 효과도 있어요 😊


5. 모델 단순화

파라미터 수를 줄이거나, 층 수를 줄여서 복잡도 낮추기

너무 깊거나 복잡한 모델은 데이터가 부족할 때 쉽게 과대적합돼요.
필요 없는 레이어나 과도한 필터 수는 과감히 줄이는 것도 방법입니다.


6. Batch Normalization

각 층의 출력을 정규화하여 학습을 안정화하고, 과대적합도 어느 정도 완화

from tensorflow.keras.layers import BatchNormalization

model.add(BatchNormalization())

Dropout과 같이 쓰면 더 좋아요.
요즘 CNN 아키텍처에는 거의 필수처럼 들어갑니다.


📝 마무리 정리

기법설명
Dropout뉴런 랜덤 끄기
Data Augmentation이미지 변형으로 데이터 늘리기
L2 정규화큰 가중치 억제
Early Stopping검증 손실 멈추면 조기 종료
모델 단순화복잡도 줄이기
Batch Norm학습 안정화 + 일반화

과대적합은 딥러닝을 하다 보면 누구나 한 번쯤 겪는 문제예요.
하지만 위 방법들을 적절히 활용하면 충분히 극복할 수 있어요!

혹시 더 궁금한 점 있으면 댓글이나 메시지로 알려주세요 :)
읽어주셔서 감사합니다!


📌 이 글은 직접 CNN 모델을 만들며 경험한 내용을 바탕으로 작성했습니다.
조금이라도 도움이 되셨다면 좋아요 또는 댓글 부탁드려요 💙

profile
능숙한 바이브코딩을 할 수 있게 됨을 꿈꾸며

0개의 댓글