🤖
AI/ML
Regularization
정규화
과적합 방지 기법. L1, L2, Dropout. 모델 일반화 향상.
정규화
과적합 방지 기법. L1, L2, Dropout. 모델 일반화 향상.
Regularization(정규화)은 머신러닝 모델이 학습 데이터에 과적합(Overfitting)되는 것을 방지하기 위한 기법의 총칭입니다. 모델의 복잡도에 제약을 가하여 새로운 데이터에 대한 일반화 성능을 향상시키며, L1, L2, Dropout, Early Stopping 등 다양한 방법이 있습니다.
정규화 개념은 통계학의 편향-분산 트레이드오프(Bias-Variance Tradeoff)에서 유래했으며, 1990년대 신경망 연구에서 본격적으로 발전했습니다. 2012년 Dropout의 등장으로 딥러닝에서 정규화가 필수 기법으로 자리잡았습니다.
정규화의 핵심 원리는 "복잡한 모델에 페널티 부여"입니다. L1(Lasso)은 가중치의 절댓값 합을, L2(Ridge)는 가중치 제곱합을 손실 함수에 추가합니다. Dropout은 학습 중 무작위로 뉴런을 비활성화하고, BatchNorm은 레이어 출력을 정규화합니다. 각 기법은 다른 메커니즘으로 과적합을 방지합니다.
실무에서 정규화는 모든 딥러닝 모델에 필수입니다. 일반적으로 Dropout(0.1~0.5), Weight Decay(L2, 1e-4~1e-2), 그리고 BatchNorm을 조합하여 사용합니다. 데이터 증강(Data Augmentation)도 넓은 의미의 정규화로, 이미지 분류에서는 특히 효과적입니다.
PyTorch에서 다양한 정규화 기법 적용 예제입니다.
import torch
import torch.nn as nn
class RegularizedModel(nn.Module):
"""다양한 정규화 기법이 적용된 모델"""
def __init__(self, input_dim, hidden_dim, output_dim, dropout_rate=0.3):
super().__init__()
# 레이어 정의 (BatchNorm 포함)
self.fc1 = nn.Linear(input_dim, hidden_dim)
self.bn1 = nn.BatchNorm1d(hidden_dim) # BatchNorm 정규화
self.dropout = nn.Dropout(dropout_rate) # Dropout 정규화
self.fc2 = nn.Linear(hidden_dim, hidden_dim)
self.bn2 = nn.BatchNorm1d(hidden_dim)
self.fc3 = nn.Linear(hidden_dim, output_dim)
def forward(self, x):
x = self.dropout(torch.relu(self.bn1(self.fc1(x))))
x = self.dropout(torch.relu(self.bn2(self.fc2(x))))
return self.fc3(x)
# 모델 초기화
model = RegularizedModel(784, 256, 10, dropout_rate=0.3)
# L2 정규화 (Weight Decay) - 옵티마이저에서 설정
optimizer = torch.optim.AdamW(
model.parameters(),
lr=1e-3,
weight_decay=1e-4 # L2 정규화 강도
)
# L1 정규화 - 손실 함수에 직접 추가
def l1_regularization(model, lambda_l1=1e-5):
l1_penalty = sum(p.abs().sum() for p in model.parameters())
return lambda_l1 * l1_penalty
# 학습 루프에서 사용
# loss = criterion(output, target) + l1_regularization(model)
print(f"모델 파라미터 수: {sum(p.numel() for p in model.parameters()):,}")