본문 바로가기
데이터 과학 수학

훈련 99% 검증 67%, 과적합을 잡는 L1·L2 규제의 원리

by dexien 2026. 4. 10.

과적합(Overfitting)을 처음 제대로 맞닥뜨린 건 모델을 만들고 나서 훈련 데이터 정확도가 99%가 나왔을 때였습니다. 신나서 검증 데이터에 돌려봤더니 67%였습니다. 모델이 훈련 데이터의 패턴을 학습한 게 아니라 답을 통째로 외워버린 겁니다. 이 경험이 L1·L2 규제를 제대로 공부하게 된 계기였습니다.

과적합은 생각보다 자주 발생합니다. 모델이 복잡할수록, 데이터가 적을수록 더 자주 생깁니다. 오늘은 이 문제를 수학적으로 어떻게 해결하는지, L1 규제와 L2 규제가 내부에서 어떻게 작동하는지 구체적으로 따라가 보겠습니다.

과적합 Overfitting과 규제의 수학적 본질
훈련 99% 검증 67%, 과적합을 잡는 L1·L2 규제의 원리

과적합이란 무엇인가 — 암기와 이해의 차이

과적합(Overfitting)은 모델이 훈련 데이터의 패턴뿐 아니라 잡음(Noise)까지 학습한 상태입니다. 시험 문제집의 답을 이해가 아닌 암기로 외운 학생과 비슷합니다. 같은 문제가 나오면 100점이지만 조금만 변형된 문제가 나오면 0점입니다.

과적합이 발생했는지는 훈련 손실과 검증 손실의 차이를 보면 알 수 있습니다.

정상 학습:
훈련 손실: 0.05, 검증 손실: 0.07 → 비슷하면 정상

과적합:
훈련 손실: 0.01, 검증 손실: 0.45 → 차이가 크면 과적합

과소적합:
훈련 손실: 0.40, 검증 손실: 0.42 → 둘 다 높으면 과소적합

과적합이 생기는 이유는 모델의 복잡도가 데이터의 복잡도보다 훨씬 높기 때문입니다. 파라미터가 10만 개인 모델에 데이터가 100개밖에 없으면 모델은 100개를 전부 외워버립니다. 일반화가 불가능한 상태입니다. 해결책은 데이터를 늘리거나, 모델을 단순하게 하거나, 규제를 추가하는 것입니다.


규제의 원리 — 손실 함수에 벌점 추가하기

규제(Regularization)의 핵심 아이디어는 단순합니다. 손실 함수에 가중치의 크기에 대한 벌점(Penalty)을 추가하는 겁니다. 모델이 가중치를 크게 쓰면 추가 비용이 발생하도록 만드는 거죠.

기존 손실 함수: L = 예측 오차

규제 추가 손실 함수:
L_total = L + λ × 규제항

λ (람다): 규제 강도를 조절하는 하이퍼파라미터
λ가 크면 규제 강함 → 가중치가 작아짐
λ가 작으면 규제 약함 → 원래 손실 함수에 가까워짐
λ = 0이면 규제 없음

가중치가 크다는 건 특정 특성에 과도하게 의존한다는 뜻입니다. 예를 들어 집값 예측 모델에서 "방의 개수"에 가중치가 비정상적으로 크다면 그 변수에만 집착하는 모델이 됩니다. 규제는 이런 과도한 집착을 수학적으로 억제합니다.


L1 규제(Lasso) — 가중치를 0으로 만드는 방식

L1 규제는 가중치의 절댓값 합을 벌점으로 추가합니다. Lasso(Least Absolute Shrinkage and Selection Operator) 회귀라고도 부릅니다.

L1 규제: L_total = L + λ × Σ|w|

예시: w = [3.0, 0.1, 2.5, 0.05, 1.8]
L1 벌점 = λ × (3.0 + 0.1 + 2.5 + 0.05 + 1.8)
= λ × 7.45

학습 후 결과: w = [2.1, 0.0, 1.6, 0.0, 0.9]
→ 작은 가중치들이 정확히 0이 됨 (Sparse Model)

L1의 핵심 특징은 작은 가중치를 완전히 0으로 만든다는 겁니다. |w|의 미분은 w가 양수면 +1, 음수면 -1입니다. 가중치 크기와 상관없이 항상 일정한 크기로 0 방향으로 당깁니다. 이미 작은 가중치는 이 당김에 버티지 못하고 0이 됩니다.

결과적으로 중요한 변수만 살아남고 불필요한 변수는 제거되는 특성 선택(Feature Selection) 효과가 생깁니다. 변수가 수천 개인데 실제로 중요한 변수가 몇 개밖에 없는 상황에서 L1 규제가 강력합니다.


L2 규제(Ridge) — 가중치를 고르게 줄이는 방식

L2 규제는 가중치의 제곱합을 벌점으로 추가합니다. 가중치 감쇠(Weight Decay)라고도 부르며 딥러닝에서 가장 많이 쓰입니다.

L2 규제: L_total = L + λ × Σw²

예시: w = [3.0, 0.1, 2.5, 0.05, 1.8]
L2 벌점 = λ × (9.0 + 0.01 + 6.25 + 0.0025 + 3.24)
= λ × 18.5

학습 후 결과: w = [2.4, 0.08, 2.0, 0.04, 1.4]
→ 모든 가중치가 줄어들지만 0이 되지는 않음

L2의 미분은 2w입니다. 가중치가 클수록 당기는 힘도 강합니다. 이 때문에 큰 가중치는 강하게 억제되고, 작은 가중치는 약하게 억제됩니다. 결과적으로 모든 가중치가 고르게 작아지면서 어떤 특성도 지나치게 우세하지 않은 균형 잡힌 모델이 됩니다.

PyTorch에서 L2 규제는 optimizer의 weight_decay 파라미터로 간단하게 적용할 수 있습니다.

# PyTorch L2 규제 적용
optimizer = torch.optim.Adam(
    model.parameters(),
    lr=0.001,
    weight_decay=0.01 # 이게 L2 규제 (λ)
)

L1과 L2, 언제 무엇을 써야 하는가

L1과 L2는 비슷해 보이지만 쓰는 상황이 다릅니다. 핵심 차이는 희소성(Sparsity)입니다. L1 규제는 불필요한 가중치를 0으로 만들어 희소한 모델을 만들고, L2 규제는 모든 가중치를 고르게 줄여 균형 잡힌 모델을 만듭니다.

구분 L1 규제 (Lasso) L2 규제 (Ridge)
벌점 형태 Σ|w| (절대값 합) Σw² (제곱합)
가중치 결과 일부가 정확히 0 모두 작아지지만 0은 아님
특성 선택 자동으로 중요 변수만 남김 모든 변수를 유지
적합한 상황 변수가 많고 일부만 중요할 때 대부분의 딥러닝 모델

편향-분산 트레이드오프

규제를 이해하려면 편향-분산 트레이드오프(Bias-Variance Tradeoff)를 알아야 합니다. 편향(Bias)은 모델이 얼마나 단순하냐의 문제이고, 분산(Variance)은 새로운 데이터에 얼마나 민감하냐의 문제입니다.

규제 강함 (λ 크게):
편향 높아짐 → 훈련 데이터에서 오차 증가
분산 낮아짐 → 새 데이터에 안정적

규제 약함 (λ 작게):
편향 낮아짐 → 훈련 데이터에 잘 맞음
분산 높아짐 → 새 데이터에 민감 (과적합 위험)

→ 최적의 λ를 찾는 게 핵심

모델 상태에 따른 편향과 분산의 관계입니다.

구분 과소적합 적정 상태 과적합
편향 높음 낮음 매우 낮음
분산 낮음 낮음 매우 높음
규제 처방 규제 줄이기 현상 유지 규제 강화 필수

실무에서 규제를 적용하는 방법

규제 외에도 과적합을 막는 방법이 몇 가지 더 있습니다. 드롭아웃(Dropout)은 학습 중 무작위로 일부 뉴런을 꺼버리는 방식입니다. 특정 뉴런에 과도하게 의존하지 못하게 만들어 일반화를 돕습니다. PyTorch에서는 nn.Dropout(p=0.5)으로 50% 뉴런을 랜덤 하게 비활성화할 수 있습니다.

조기 종료(Early Stopping)는 검증 손실이 다시 올라가기 시작하는 시점에 학습을 멈추는 방법입니다. 훈련을 계속하면 과적합이 심해지기 때문에 검증 손실이 최저점인 순간의 모델을 저장해두는 겁니다.

과적합 대응 방법 요약:

1. 데이터 증강: 데이터 자체를 늘리는 방법 (가장 효과적)
2. L1/L2 규제: 가중치 크기에 벌점 추가
3. Dropout: 학습 중 뉴런 무작위 비활성화
4. Early Stopping: 검증 손실이 오르면 학습 중단
5. Batch Normalization: 층마다 값 분포 정규화

→ 보통 2~3가지를 조합해서 사용

훈련 정확도 99%에 검증 정확도 67%였던 모델에 L2 규제와 Dropout을 함께 적용했더니 훈련 정확도는 94%로 줄었지만 검증 정확도가 91%까지 올라갔습니다. 훈련 성능을 일부러 낮췄더니 실제 성능이 올라간 겁니다. 규제가 왜 필요한지를 수치로 보여주는 경험이었습니다.


소개 및 문의 · 개인정보처리방침 · 면책조항

© 2026 블로그 이름