본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] Overfitting 방지를 위한 L1/L2 Regularization의 3가지 수학적 해석과 Weight Decay 해결 방법

by Papa Martino V 2026. 4. 28.
728x90

L1/L2 Regularization
L1/L2 Regularization

 

딥러닝과 머신러닝 모델을 설계할 때 가장 큰 숙제는 훈련 데이터에만 지나치게 최적화되는 과적합(Overfitting)을 어떻게 제어하느냐입니다. 모델이 복잡해질수록 가중치($w$)의 절대값이 커지는 경향이 있으며, 이는 결정 경계가 요동치는 결과를 초래합니다. 이를 해결하기 위해 우리는 비용 함수(Cost Function)에 페널티 항을 추가하는 규제(Regularization) 기법을 사용합니다.

본 포스팅에서는 L1(Lasso)과 L2(Ridge) 규제가 수학적으로 어떻게 가중치를 수축시키는지, 그리고 옵티마이저의 관점에서 가중치 감소(Weight Decay)와 규제가 구체적으로 어떤 차이를 갖는지 심층적으로 분석합니다.


1. L1 vs L2 Regularization의 수학적 정의와 특징

기본적인 손실 함수를 $J(\theta)$라고 할 때, 규제가 포함된 전체 손실 함수 $L(\theta)$는 다음과 같이 정의됩니다.

L1 Regularization (Lasso)

가중치의 절대값 합을 페널티로 부여합니다. 수학적으로는 $L_1$ norm을 사용합니다.

$$L = J(\theta) + \lambda \sum_{i=1}^{n} |w_i|$$

L2 Regularization (Ridge)

가중치의 제곱 합을 페널티로 부여합니다. 수학적으로는 $L_2$ norm의 제곱을 사용합니다.

$$L = J(\theta) + \frac{\lambda}{2} \sum_{i=1}^{n} w_i^2$$

여기서 $\lambda$(Lambda)는 규제의 강도를 조절하는 하이퍼파라미터입니다. 이 값이 클수록 가중치에 대한 압박이 강해져 모델은 더 단순해집니다.


2. L1/L2 규제의 핵심 비교 요약

항목 L1 Regularization (Lasso) L2 Regularization (Ridge)
수학적 공식 $\lambda |w|$ $\frac{1}{2} \lambda w^2$
미분 결과 (Gradient) $\lambda \cdot \text{sign}(w)$ $\lambda w$
가중치 형태 희소 행렬(Sparse Matrix) 생성 가능 가중치가 0에 가깝게 작아짐 (0은 안됨)
주요 장점 불필요한 피처 선택(Feature Selection) 이상치에 강인하며 일반화 성능 우수
해석적 의미 마름모 형태의 제약 영역 원 형태의 제약 영역

3. 가중치 감소(Weight Decay)와의 상관관계

가중치 감소는 매 반복(Iteration)마다 가중치를 일정 비율로 줄이는 기법입니다. SGD(Stochastic Gradient Descent) 옵티마이저에서는 L2 Regularization과 Weight Decay가 수학적으로 완전히 동일하게 작동합니다.

가중치 업데이트 식을 살펴보면 다음과 같습니다.

$$w_{t+1} = w_t - \eta \frac{\partial L}{\partial w_t} = w_t - \eta (\frac{\partial J}{\partial w_t} + \lambda w_t)$$

이를 정리하면: $$w_{t+1} = (1 - \eta\lambda)w_t - \eta \frac{\partial J}{\partial w_t}$$

즉, 기존 가중치 $w_t$에 $(1 - \eta\lambda)$라는 인수를 곱해 크기를 먼저 줄인 뒤 경사 하강을 진행하는 것과 같습니다. 하지만 Adam과 같은 적응형 학습률 옵티마이저에서는 L2 규제와 Weight Decay가 다르게 동작하므로 주의가 필요하며, 이를 위해 AdamW 같은 알고리즘이 등장했습니다.


4. 실무 적용을 위한 Python 샘플 코드 (Example 7선)

개발자가 실무에서 즉시 활용할 수 있는 다양한 프레임워크 기반의 구현 예제입니다.

Ex 1. Scikit-learn을 이용한 Lasso (L1) 회귀 구현

from sklearn.linear_model import Lasso
from sklearn.datasets import make_regression

# 데이터 생성
X, y = make_regression(n_samples=100, n_features=10, noise=0.1)

# L1 규제 적용 (alpha가 수학식의 lambda와 동일)
lasso_mod = Lasso(alpha=0.1)
lasso_mod.fit(X, y)

print("회귀 계수(Sparse 확인):", lasso_mod.coef_)

Ex 2. Scikit-learn을 이용한 Ridge (L2) 회귀 구현

from sklearn.linear_model import Ridge

# L2 규제 적용
ridge_mod = Ridge(alpha=1.0)
ridge_mod.fit(X, y)

print("회귀 계수:", ridge_mod.coef_)

Ex 3. PyTorch에서 전역적으로 Weight Decay (L2) 적용하기

import torch.optim as optim
import torch.nn as nn

model = nn.Sequential(nn.Linear(10, 5), nn.ReLU(), nn.Linear(5, 1))

# optimizer 선언 시 weight_decay 파라미터 설정 (L2와 동일)
optimizer = optim.SGD(model.parameters(), lr=0.01, weight_decay=1e-4)

Ex 4. Keras/TensorFlow에서 레이어별 L1/L2 동시 적용

from tensorflow.keras import layers, regularizers, models

model = models.Sequential([
    layers.Dense(64, activation='relu', 
                 kernel_regularizer=regularizers.l1_l2(l1=1e-5, l2=1e-4),
                 input_shape=(10,))
])
model.compile(optimizer='adam', loss='mse')

Ex 5. PyTorch에서 수동 L1 Regularization 손실 추가

def l1_loss(model, lambda_l1):
    l1_reg = torch.tensor(0.)
    for param in model.parameters():
        l1_reg += torch.norm(param, 1)
    return lambda_l1 * l1_reg

# 학습 루프 내에서
# loss = criterion(outputs, targets) + l1_loss(model, 0.001)

Ex 6. AdamW 옵티마이저를 활용한 올바른 가중치 감소 처리

# Adam에서는 L2보다 AdamW를 사용하는 것이 수학적으로 더 정확한 Weight Decay를 보장함
optimizer = optim.AdamW(model.parameters(), lr=1e-3, weight_decay=0.01)

Ex 7. Elastic Net (L1 + L2 혼합) 구현

from sklearn.linear_model import ElasticNet

# l1_ratio: 1에 가까울수록 Lasso, 0에 가까울수록 Ridge
elastic = ElasticNet(alpha=0.5, l1_ratio=0.5)
elastic.fit(X, y)

print("Elastic Net 계수:", elastic.coef_)

5. 결론: 어떤 규제를 선택해야 하는가?

모델의 피처(Feature) 중 유의미한 변수가 적고 모델을 단순화하여 설명 가능성을 높여야 한다면 L1 Regularization을 선택하십시오. 반면, 데이터의 모든 변수를 활용하면서 변수 간의 상관관계가 높고 안정적인 성능을 원한다면 L2 Regularization이 표준적인 선택입니다. 최근 딥러닝 실무에서는 Batch Normalization이나 Dropout이 규제 역할을 상당 부분 대체하고 있으나, 근본적인 수치 안정성을 위해 Weight Decay(L2)를 기본적으로 병행하는 것이 2026년 현재까지도 가장 권장되는 프랙티스입니다.


참고 문헌 (Sources)

  • Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep Learning. MIT Press.
  • Loshchilov, I., & Hutter, F. (2019). "Decoupled Weight Decay Regularization". ICLR.
  • Hastie, T., Tibshirani, R., & Friedman, J. (2009). The Elements of Statistical Learning. Springer.
728x90