과적합(Overfitting)과 정규화 기법 (L1/L2 정규화, 드롭아웃)
1. 과적합(Overfitting)이란?
딥러닝 모델을 훈련할 때 가장 중요한 목표는 훈련 데이터뿐만 아니라 새로운 데이터에도 잘 일반화할 수 있도록 하는 것입니다. 하지만 때때로 모델이 훈련 데이터에 지나치게 적응하여 새로운 데이터에서는 제대로 성능을 발휘하지 못하는 현상이 발생하는데, 이를 "과적합(Overfitting)"이라고 합니다.
과적합이 발생하면 훈련 데이터에서는 높은 성능을 보이지만, 검증 데이터나 실제 데이터에서는 성능이 저하됩니다. 이는 모델이 데이터의 패턴을 학습하기보다 단순히 암기하는 것에 가까워지는 현상입니다.
과적합은 다음과 같은 원인으로 발생할 수 있습니다:
- 모델의 복잡도가 너무 높음: 뉴런과 레이어 수가 너무 많아 데이터의 노이즈까지 학습하는 경우
- 훈련 데이터 부족: 데이터가 적으면 모델이 일반적인 패턴을 배우기보다 특정 샘플을 암기하는 경향이 있음
- 훈련 데이터와 테스트 데이터의 분포 차이: 실제 환경과 차이가 큰 데이터를 학습하면 테스트 시 성능이 떨어질 수 있음
이를 방지하기 위해 다양한 정규화 기법이 활용됩니다. 대표적으로 L1/L2 정규화, 드롭아웃(Dropout) 등의 방법이 있습니다.
2. L1/L2 정규화 (Lasso & Ridge Regularization)
2.1 L1 정규화 (Lasso Regularization)
L1 정규화는 가중치(Weight)의 절댓값 합을 최소화하는 방식으로, 특정 가중치를 0으로 만드는 특징이 있습니다. 이는 모델이 중요한 특징(feature)만 선택하도록 유도하므로 희소성(Sparsity) 을 증가시키고, 변수 선택이 필요한 경우 효과적입니다.
L1 정규화는 아래와 같이 비용 함수(Cost Function)에 추가됩니다:
$$ J(W) = Loss(W) + \lambda \sum |W_i| $$
여기서 $ \lambda $는 정규화 강도를 조절하는 하이퍼파라미터입니다.
L1 정규화 적용 예제 (Python, TensorFlow/Keras)
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, regularizers
model = keras.Sequential([
layers.Dense(64, activation='relu', kernel_regularizer=regularizers.l1(0.01)),
layers.Dense(32, activation='relu', kernel_regularizer=regularizers.l1(0.01)),
layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
위 코드에서는 kernel_regularizer=regularizers.l1(0.01)을 사용하여 L1 정규화를 적용하였습니다.
2.2 L2 정규화 (Ridge Regularization)
L2 정규화는 가중치의 제곱합을 최소화하는 방식으로, 모델이 너무 큰 가중치를 갖지 않도록 제한합니다. 이는 과적합을 방지하는 데 효과적이며, 모델이 더 일반화되도록 만듭니다.
L2 정규화는 아래와 같이 비용 함수에 추가됩니다:
$$ J(W) = Loss(W) + \lambda \sum W_i^2 $$
L2 정규화는 가중치를 0에 가깝게 만들지만 완전히 0으로 만들지는 않습니다.
L2 정규화 적용 예제 (Python, TensorFlow/Keras)
model = keras.Sequential([
layers.Dense(64, activation='relu', kernel_regularizer=regularizers.l2(0.01)),
layers.Dense(32, activation='relu', kernel_regularizer=regularizers.l2(0.01)),
layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
위 코드에서는 kernel_regularizer=regularizers.l2(0.01)을 사용하여 L2 정규화를 적용하였습니다.
2.3 L1 & L2 정규화 (Elastic Net)
L1과 L2 정규화를 함께 사용하는 방법을 Elastic Net이라고 합니다. 두 방법의 장점을 결합하여 모델을 보다 강건하게 만들 수 있습니다.
model = keras.Sequential([
layers.Dense(64, activation='relu', kernel_regularizer=regularizers.l1_l2(l1=0.01, l2=0.01)),
layers.Dense(32, activation='relu', kernel_regularizer=regularizers.l1_l2(l1=0.01, l2=0.01)),
layers.Dense(10, activation='softmax')
])
3. 드롭아웃 (Dropout)
드롭아웃은 뉴런을 랜덤하게 비활성화하여 과적합을 방지하는 기법입니다. 훈련 과정에서 특정 뉴런을 제거함으로써 모델이 특정 뉴런에 의존하는 것을 막고, 보다 일반화된 학습을 가능하게 합니다.
드롭아웃은 주로 깊은 신경망에서 활용되며, 일반적으로 0.2~0.5의 비율을 사용합니다.
드롭아웃 적용 예제 (Python, TensorFlow/Keras)
model = keras.Sequential([
layers.Dense(128, activation='relu'),
layers.Dropout(0.5),
layers.Dense(64, activation='relu'),
layers.Dropout(0.3),
layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
위 코드에서는 Dropout(0.5)와 Dropout(0.3)을 사용하여 뉴런을 50%와 30% 확률로 비활성화하도록 설정하였습니다.
4. 정리
- 과적합(Overfitting) 은 모델이 훈련 데이터에 지나치게 적응하여 일반화 능력이 떨어지는 현상
- L1 정규화: 희소성을 증가시키며, 중요하지 않은 가중치를 0으로 만듦
- L2 정규화: 큰 가중치를 억제하여 모델이 보다 일반화되도록 유도
- Elastic Net: L1과 L2 정규화를 함께 적용하여 효과를 극대화
- 드롭아웃(Dropout): 뉴런을 랜덤하게 비활성화하여 특정 뉴런에 대한 의존도를 줄이고 일반화 능력을 향상
이러한 정규화 기법을 적절히 활용하면 과적합을 방지하고 보다 일반화된 딥러닝 모델을 구축할 수 있습니다.
'Python > Deep Learning' 카테고리의 다른 글
| 배치 정규화(Batch Normalization)와 학습 속도 향상 기법 (0) | 2025.11.30 |
|---|---|
| 학습률(Learning Rate)과 그 중요성 (0) | 2025.11.28 |
| 확률적 경사 하강법(SGD)과 배치 경사 하강법 (0) | 2025.11.27 |
| 경사 하강법(Gradient Descent)과 최적화 알고리즘 비교 (0) | 2025.11.26 |
| 손실 함수와 비용 함수의 차이 및 활용 (0) | 2025.11.25 |