Underfitting vs Overfitting
Neural Network를 학습시킬 때 두 가지 문제가 발생할 수 있습니다.
설명
| Underfitting | 학습 데이터 샘플들의 정확도가 매우 낮은 상태 |
| Overfitting | 학습 데이터 샘플들의 정확도는 높지만 새로운 데이터에는 예측 성능이 떨어지는 상태 |
네트워크는 Overfitting을 막고 Underfitting을 피하는 적절한 균형을 찾아야 합니다.
Overfitting 해결 방법들
Overfitting을 줄이는 방법은 여러 가지가 있습니다.
- 학습 데이터셋 늘리기 : 더 많은 데이터로 일반적인 패턴을 학습
- L2 Regularization : Weight가 너무 커지지 않도록 패널티를 주는 방법
- Batch Normalization : 각 레이어의 입력값을 정규화해 학습을 안정화
- Dropout : 뉴런을 랜덤하게 꺼서 특정 패턴에 과하게 의존하지 않도록 하는 방법
Dropout이란?
지금까지는 모든 노드(뉴런)를 사용해서 고양이인지 아닌지 판단했습니다.
Dropout은 각각의 뉴런들 중 몇몇의 뉴런을 꺼두고 학습하는 방법입니다.
일반 학습 Dropout 적용
○─○─○─○ ○─○─ ─○
│ │ │ │ │ │ │
○─○─○─○ → ○─ ─○─○ ← 랜덤으로 일부 뉴런 OFF
│ │ │ │ │ │
○─○─○─○ ○─○─ ─○
모든 뉴런 사용 일부 뉴런만 사용
꺼지는 뉴런은 랜덤으로 설정됩니다.
고양이 예시로 이해하기
Dropout 없이 학습할 때:
고양이의 모든 특징(귀, 수염, 발톱, 털, 눈...)을 전부 보면서 고양이를 맞춘다
Dropout을 사용해 학습할 때:
특정 몇 가지 특징만 보여주고 맞춰봐!
이렇게 학습하면 새로운 종류의 고양이 사진을 보여줄 때도 몇 가지 특징만 있으면 쉽게 고양이라고 맞출 수 있게 됩니다.
특정 특징에만 과하게 의존하지 않고, 다양한 특징으로 판단하는 능력이 생기기 때문입니다.
학습 vs 테스트에서의 Dropout
Dropout
| 학습(Training) | 랜덤으로 일부 뉴런을 끄고 학습 |
| 테스트(Test) | 모든 뉴런을 사용해서 예측 |
학습이 완료된 후 테스트할 때는 모든 뉴런을 사용합니다.
학습할 때 일부 뉴런만으로도 잘 맞추도록 훈련됐기 때문에, 테스트 때 모든 뉴런을 사용하면 더욱 높은 정확도를 낼 수 있습니다.
코드 적용
# rate : 뉴런을 몇 퍼센트 비율로 끌것인지 (0~1 사이 값)
# 일반적으로 0.3 또는 0.5 를 사용
def dropout(rate):
return tf.keras.layers.Dropout(rate)
모델에 적용할 때는 Dense + ReLU 다음에 한 줄만 추가합니다:
for i in range(2):
self.model.add(dense(256, weight_init))
self.model.add(relu())
self.model.add(dropout(rate=0.5)) # 각 뉴런의 50%만 사용해서 학습
training 파라미터
logits = model(images, training=True) # 학습 시 : Dropout 적용
logits = model(images, training=False) # 테스트 시 : Dropout 미적용 (모든 뉴런 사용)
training=True 와 training=False 로 학습과 테스트를 구분합니다.
학습 때는 Dropout을 켜고, 테스트 때는 Dropout을 꺼서 모든 뉴런을 사용합니다.
정리
개념 설명
| Dropout | 뉴런을 랜덤하게 꺼서 과적합을 방지하는 정규화 기법 |
| rate | 뉴런을 끄는 비율 (0.3 또는 0.5 주로 사용) |
| training=True | 학습 시 Dropout 적용 |
| training=False | 테스트 시 Dropout 미적용, 모든 뉴런 사용 |
Dropout은 코드 한 줄만 추가하면 되는 간단한 방법이지만, Overfitting을 효과적으로 줄여주는 강력한 기법입니다. 🚀
'AI > ML' 카테고리의 다른 글
| CNN으로 MNIST 손글씨 분류하기 (TensorFlow) (0) | 2026.03.29 |
|---|---|
| CNN : Convolutional Neural Network (0) | 2026.03.29 |
| Weight Initialization : 웨이트 초기화의 중요성 (0) | 2026.03.25 |
| ReLU로 MNIST 손글씨 분류하기 (TensorFlow) (0) | 2026.03.23 |
| ReLU : Vanishing Gradient 문제와 해결책 (0) | 2026.03.22 |