
딥러닝 모델을 만들다 보면, 훈련은 엄청 잘 되는데 정작 테스트 데이터에서는 맥을 못 추는 경우가 있어요.
"어..? 분명히 정확도 높았는데?" 싶을 정도로요.
이런 현상을 바로 과대적합(Overfitting)이라고 해요.
이번 글에서는 특히 CNN(Convolutional Neural Network) 모델에서 과대적합이 왜 생기는지, 그리고 어떻게 방지할 수 있는지 정리해볼게요.
훈련 데이터에 너무 딱 맞춰서 학습한 나머지, 새로운 데이터에는 성능이 떨어지는 현상
모델이 훈련 데이터에 있는 노이즈나 특이한 패턴까지 학습하면서 일반화 능력을 잃어버리게 돼요.
특히 이미지 처리에 자주 쓰이는 CNN 모델에서도 자주 발생하죠.
과대적합은 학습 그래프만 봐도 바로 알아차릴 수 있어요.
[ 예시 그래프 흐름 ]
Train Accuracy : ↗↗↗↗↗↗↗
Validation Acc : ↗↗→→↘↘↘
Train Loss : ↘↘↘↘↘↘↘
Validation Loss : ↘↘→→↗↗↗
이런 그래프가 보이면 99% 과대적합이에요 😢
신경망의 일부 뉴런을 랜덤하게 끄는 방식으로, 특정 뉴런에 과하게 의존하지 않도록 하는 기법
from tensorflow.keras.layers import Dropout
model.add(Dropout(0.5))
보통 Fully Connected Layer 쪽에 많이 써요.
0.3~0.5 사이 비율이 적당해요!
학습 데이터를 인위적으로 늘려서 모델이 더 다양한 패턴을 학습할 수 있도록 함
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)
특히 이미지가 적을 때 꼭 필요한 기술!
회전, 이동, 좌우 반전 등으로 다양한 이미지를 생성할 수 있어요.
큰 가중치에 패널티를 줘서 모델이 너무 복잡해지지 않도록 막는 기법
from tensorflow.keras.regularizers import l2
Conv2D(32, (3,3), activation='relu', kernel_regularizer=l2(0.001))
L1보다는 L2 정규화가 CNN에서 자주 쓰여요.
검증 손실이 더 이상 줄어들지 않으면 학습을 조기 종료
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 돌리기 방지!
훈련 시간이 줄어드는 부가 효과도 있어요 😊
파라미터 수를 줄이거나, 층 수를 줄여서 복잡도 낮추기
너무 깊거나 복잡한 모델은 데이터가 부족할 때 쉽게 과대적합돼요.
필요 없는 레이어나 과도한 필터 수는 과감히 줄이는 것도 방법입니다.
각 층의 출력을 정규화하여 학습을 안정화하고, 과대적합도 어느 정도 완화
from tensorflow.keras.layers import BatchNormalization
model.add(BatchNormalization())
Dropout과 같이 쓰면 더 좋아요.
요즘 CNN 아키텍처에는 거의 필수처럼 들어갑니다.
| 기법 | 설명 |
|---|---|
| Dropout | 뉴런 랜덤 끄기 |
| Data Augmentation | 이미지 변형으로 데이터 늘리기 |
| L2 정규화 | 큰 가중치 억제 |
| Early Stopping | 검증 손실 멈추면 조기 종료 |
| 모델 단순화 | 복잡도 줄이기 |
| Batch Norm | 학습 안정화 + 일반화 |
과대적합은 딥러닝을 하다 보면 누구나 한 번쯤 겪는 문제예요.
하지만 위 방법들을 적절히 활용하면 충분히 극복할 수 있어요!
혹시 더 궁금한 점 있으면 댓글이나 메시지로 알려주세요 :)
읽어주셔서 감사합니다!
📌 이 글은 직접 CNN 모델을 만들며 경험한 내용을 바탕으로 작성했습니다.
조금이라도 도움이 되셨다면 좋아요 또는 댓글 부탁드려요 💙