courses
훈련 예제를 거의 완벽하게 맞추지만 새 데이터에서는 실패하는 모델을 학습하셨나요? 누구나 한 번쯤 겪습니다.
그게 바로 과적합의 상위 수준 정의입니다. 모델이 실제 패턴을 학습한 것이 아니라 훈련 데이터를 외워버린 상태죠. 운영 환경에서 새로운, 보지 못한 데이터가 들어오면 이 모델의 예측을 신뢰하기 어렵습니다. 실제 데이터가 훈련 표본과 달라질수록 상황은 더 나빠집니다.
정규화는 손실 함수에 패널티를 추가하여 이를 해결합니다. 이 패널티는 복잡한 모델을 억제합니다. 즉, 모델이 모든 데이터 포인트를 억지로 맞추지 못하게 하고 대신 일반화하도록 만드는 장치입니다.
이 글에서는 정규화의 직관, 가장 일반적인 방법인 L1, L2, 엘라스틱넷(Elastic Net), 그리고 용도에 맞는 기법을 고르는 방법을 살펴보겠습니다.
운영 환경에서 머신 러닝 모델이 왜, 어떻게 실패하는지 이해하고 싶다면 바이어스-분산 트레이드오프 블로그 글을 읽어보세요.
머신 러닝에서 정규화란?
정규화는 모델의 복잡성을 억제하기 위해 손실 함수에 패널티 항을 추가하는 기법입니다.
이 패널티가 없다면 모델은 원하는 만큼 유연하게 훈련 데이터를 맞출 수 있습니다. 그 과정에는 노이즈와 이상치도 포함됩니다. 정규화는 그 유연성에 비용을 부과합니다. 모델이 복잡해지려 할수록 더 큰 패널티를 받습니다.
모델의 손실 함수는 일반적으로 예측값과 실제값의 차이를 측정합니다. 정규화는 그 식에 모델 계수가 커질수록 함께 커지는 추가 항을 더합니다. 이제 모델은 훈련 데이터를 잘 맞추는 것과 계수를 작게 유지하는 것, 두 가지 상충하는 목표를 균형 있게 고려해야 합니다.
그 균형이 모델의 유연성을 제어합니다.
매우 유연한 모델은 훈련 데이터를 맞추기 위해 어떤 형태로든 휘어질 수 있습니다. 정규화는 이를 더 단순한 형태로 매끈하게 되돌립니다. 그 형태가야말로 모델이 보지 못한 데이터에도 더 잘 버틸 가능성이 큽니다.
왜 정규화가 필요한가
여러분이 학습하는 모든 모델은 쓸 수 없는 두 모델 사이 어딘가에 놓입니다. 하나는 너무 단순하고, 다른 하나는 너무 복잡합니다.
너무 단순한 모델은 데이터의 실제 패턴을 제대로 “이해하지” 못합니다. 신호를 놓치죠. 이것이 과소적합입니다. 훈련 데이터와 새로운 데이터 모두에서 성능이 낮습니다.
너무 복잡한 모델은 그 반대입니다. 훈련 데이터의 노이즈까지 모든 세부를 맞춥니다. 이것이 과적합입니다. 훈련 데이터에서는 성능이 훌륭하지만, 엉뚱한 것을 외워서 새 데이터에서는 실패합니다.
다항 회귀를 예로 들어보겠습니다. 완만한 곡선을 보이는 데이터에 3차 다항식을 맞추면 올바른 패턴을 포착할 가능성이 큽니다. 하지만 같은 데이터에 15차 다항식을 적용하면 과적합이 발생합니다. 곡선이 모든 데이터 포인트를 통과하지만 그 사이에서는 엉뚱한 예측을 합니다.
아래 차트는 실제로 어떤 모습인지 보여줍니다.

적당한 모델과 너무 복잡한 모델
이것이 바이어스-분산 트레이드오프입니다.
단순한 모델은 바이어스가 높습니다. 강한 가정을 하며 실제 패턴을 놓칩니다. 복잡한 모델은 분산이 높습니다. 본 훈련 표본에 과도하게 민감해 데이터가 조금만 바뀌어도 전혀 다른 모델이 만들어집니다.
정규화는 두 장점을 모두 취할 수 있도록 돕습니다. 복잡성을 없애진 않지만 패널티를 부과합니다. 그 결과 모델이 실제 신호를 학습할 가능성이 커집니다.
정규화는 어떻게 동작하나
모든 모델은 손실 함수를 최소화하며 학습합니다. 예측이 얼마나 틀렸는지의 척도죠. 정규화가 없다면 모델의 유일한 목표는 그 오차를 줄이는 것입니다. 훈련 데이터에는 잘 맞지만 일반화하지 못하는 큰 계수를 키우는 등, 무엇이든 할 것입니다.
정규화는 목표를 바꿉니다. 오차만 최소화하는 대신 이제 다음을 최소화합니다:

정규화는 이렇게 동작합니다
패널티 항은 모델 계수의 함수입니다. 큰 계수일수록 더 큰 패널티가 부과됩니다. 총 비용을 낮게 유지하려면 모델은 계수를 작게 유지해야 합니다. 이는 더 단순하고 일반화 가능한 해를 의미합니다.
λ(람다)는 패널티의 중요도를 제어합니다. λ가 클수록 모델은 더 단순하도록 강하게 압박받습니다. λ가 작을수록 데이터 적합에 더 집중할 수 있습니다. 아래의 ‘정규화 강도 선택’ 섹션에서 튜닝 방법을 확인하세요.
머신 러닝의 정규화 유형
모델 복잡성에 패널티를 주는 방법은 여러 가지가 있습니다. 각 방법은 계수에 다른 방식으로 압력을 가하므로, 상황에 따라 더 잘 맞는 기법이 달라집니다.
L2 정규화(릿지 회귀)
L2 정규화는 각 계수의 제곱값에 패널티를 부과합니다. 계수가 클수록 패널티 기여도가 커지고, 모델은 이를 줄이기 위해 더 노력합니다.

L2 정규화
여기서 핵심 단어는 ‘축소(shrink)’입니다. L2는 모든 계수를 0을 향해 밀어내지만 정확히 0에는 도달하지 않습니다. 모든 특성은 더 작은 가중치로 모델에 남습니다. 그래서 대부분의 특성이 유의미하다고 믿고 안정적이며 거동이 좋은 모델을 원할 때 릿지는 기본값으로 적합합니다.
L1 정규화(라쏘 회귀)
L1 정규화는 제곱 대신 각 계수의 절댓값에 패널티를 부과합니다.

L1 정규화
작아 보이는 이 차이가 큰 결과를 만듭니다. L1은 계수를 정확히 0까지 밀어낼 수 있습니다. 즉, 특성을 모델에서 제거합니다. 자동 특성 선택으로 볼 수 있습니다. 다시 말해, 라쏘 정규화는 특성을 제거하여 모델을 단순화할 수 있습니다.
L1 vs. L2 정규화
핵심 차이는 희소성에 있습니다. L1은 희소한 모델을 만듭니다. 일부 특성만 남습니다. L2는 밀집 모델을 만듭니다. 모든 특성이 남되 가중치가 작아집니다.
이는 해석 가능성에도 영향을 줍니다. 활성 특성이 5개뿐인 라쏘 모델은, 50개 특성이 조금씩 기여하는 릿지 모델보다 설명하기 쉽습니다. 하지만 특성들 간 상관관계가 있을 때는 릿지가 더 안정적인 경향이 있습니다. 가중치를 임의로 하나만 택하지 않고 여러 특성에 분산시키기 때문입니다.
차이를 한눈에 볼 수 있는 개요입니다:

L1과 L2 정규화
파이썬에서 이들을 비교해 보고 싶다면 파이썬으로 라쏘와 릿지 회귀 튜토리얼을 참고하세요.
엘라스틱넷 정규화
엘라스틱넷은 L1과 L2를 하나의 패널티 항으로 결합합니다.

엘라스틱넷 정규화
목표는 두 장점을 모두 얻는 것입니다. L1의 특성 선택과 L2의 안정성입니다. 상관관계가 있는 특성이 있고 그중 일부는 제거하고 싶을 때 유용합니다. 라쏘만 쓰면 상관된 그룹에서 하나만 선택하고 나머지는 무시하는 경향이 있습니다. 엘라스틱넷은 관련 없는 특성을 제거하면서도 몇 개는 유지할 가능성이 큽니다.
다양한 모델에서의 정규화
정규화는 여러 머신 러닝 모델에서 다양한 형태로 등장합니다. 몇 가지를 보여드리겠습니다.
선형 회귀는 대부분의 사람이 정규화를 처음 접하는 곳입니다. 선형 회귀에 L2 정규화를 더하면 릿지 회귀가 됩니다. 마찬가지로 L1을 더하면 라쏘 회귀가 됩니다. 수학은 위에서 설명한 것과 같습니다. 최소제곱 손실에 패널티 항을 추가합니다.
로지스틱 회귀도 동일한 방식으로 작동합니다. 손실 함수만 바뀝니다. 제곱 오차 대신 교차 엔트로피를 쓰지만 패널티 항은 동일합니다. 대부분의 머신 러닝 라이브러리는 로지스틱 회귀에 기본으로 L2 정규화를 적용합니다. 그래서 scikit-learn에서 C라는 매개변수를 보게 됩니다. 이는 λ의 역수이므로 C가 작을수록 더 강한 정규화를 의미합니다.
신경망은 몇 가지 다른 접근을 사용합니다:
- 가중치 감쇠(weight decay): 네트워크 가중치에 L2 정규화를 적용합니다. 방식은 같지만 규모가 훨씬 큽니다.
- 드롭아웃: 훈련 중 매 번 일부 뉴런을 무작위로 비활성화하여, 네트워크가 특정 경로에 과도하게 의존하지 못하게 합니다.
두 방법 모두 과적합을 줄이지만 방식은 다릅니다.
트리 기반 모델은 손실 패널티를 사용하지 않습니다. 대신 전지(pruning)를 통해 복잡도를 제어합니다. 트리가 커질 수 있는 깊이를 제한하거나, 예측을 충분히 개선하지 못하는 가지를 제거합니다. scikit-learn의 max_depth, min_samples_split 같은 하이퍼파라미터는 이름은 다르지만 정규화 매개변수입니다.
정규화와 바이어스-분산 트레이드오프
정규화는 타협의 기술입니다.
패널티 항을 추가하면 모델이 할 수 있는 일을 제한합니다. 더 이상 원하는 만큼 훈련 데이터를 가깝게 맞출 수 없습니다. 이 제약은 바이어스를 도입합니다. 모델이 단순함을 유지하도록 의도적으로 약간의 잘못된 가정을 하게 되는 것이죠.
하지만 같은 제약이 분산을 줄입니다. 모든 데이터 포인트를 맞출 수 없는 모델은 훈련 표본에 덜 민감합니다. 약간 다른 데이터셋으로 학습해도 비슷한 결과를 얻습니다. 그 안정성이 바로 운영 환경에서 실패하지 않게 하는 핵심입니다.
정규화가 없으면 모델은 매우 유연해집니다. 바이어스는 낮고(가정이 적고 훈련 데이터를 잘 맞춤), 분산은 높습니다(훈련 데이터의 작은 변화에도 모델이 크게 달라져서 새 데이터에 신뢰할 수 없음).
정규화는 균형을 옮기는 일입니다. 약간의 바이어스를 늘리는 대신 분산을 크게 줄이면, 본 적 없는 데이터에서 더 나은 성능을 내는 경우가 많습니다. 그 타협은 대부분의 경우 가치가 있습니다.
정규화 강도 선택
머신 러닝 실무자라면 정규화 유형을 고른 다음 정규화 강도를 설정해야 합니다.
강도는 하이퍼파라미터로 제어합니다. 수학 표기에서는 보통 lambda (λ), scikit-learn에서는 alpha라고 부릅니다. 패널티 항 앞의 곱셈 인자입니다. 이를 바꾸면 모델을 단순하게 밀어붙이는 정도가 달라집니다.
양쪽으로 잘못 설정하면 운영 환경에서 문제가 생깁니다:
- 너무 낮음: 패널티가 유명무실합니다. 정규화를 하지 않은 것처럼 모델이 과적합합니다.
- 너무 높음: 패널티가 지배적입니다. 제약이 너무 강해 데이터의 실제 패턴을 이해하지 못합니다. 이는 과소적합입니다.
적정 값은 그 사이 어딘가에 있으며, 보편적인 정답은 없습니다. 데이터, 모델, 노이즈 수준에 따라 달라집니다.
표준적인 방법은 교차 검증입니다. 훈련 데이터를 폴드로 나누고, 각 폴드 조합에서 모델을 학습한 뒤 다양한 alpha 값에 대한 검증 성능을 측정합니다. 평균 검증 점수가 가장 좋은 값을 사용합니다.
scikit-learn에서는 RidgeCV와 LassoCV가 이를 자동으로 수행합니다. alpha 값 그리드에 대해 교차 검증을 돌리고 최적값을 선택합니다.
from sklearn.linear_model import RidgeCV
model = RidgeCV(alphas=[0.01, 0.1, 1.0, 10.0], cv=5)
model.fit(X_train, y_train)
print(model.alpha_)
출력된 alpha는 교차 검증으로 찾은 최적값입니다. 처음에는 넓은 범위로 시작하고, 최적 범위가 보이면 점차 좁혀가세요.
결론
정규화는 모델이 스스로의 영리함에 발목 잡히지 않도록 막는 방법입니다.
정규화는 복잡성에 패널티를 부과해 모델이 훈련 데이터를 외우는 대신 일반화 가능한 해를 찾도록 강제합니다. L2는 모든 특성을 유지하되 영향력을 줄입니다. L1은 관련 없는 특성을 제거합니다. 엘라스틱넷은 둘을 결합합니다. 선형 모델, 로지스틱 회귀, 신경망, 앙상블 모델 전반에서 같은 아이디어가 서로 다른 모습으로 등장하며, 항상 “정규화”라고 불리지는 않습니다.
가장 중요한 것은 선택한 기법과 설정한 강도입니다. 그러니 해야 할 일은 실험입니다. 다양한 접근법과 매개변수 값을 시도하세요. 하나만 고르고 넘어가지 마세요.
데이터가 무엇이 효과적인지 알려줄 것입니다.
정규화 기법을 더 보고 싶다면 Machine Learning Scientist in Python 트랙에 등록해 보세요. 채용에 바로 도움이 될 85시간 분량의 자료를 제공합니다.
FAQs
머신 러닝에서 정규화란 무엇인가요?
정규화는 모델의 복잡성을 억제하기 위해 손실 함수에 패널티 항을 추가하는 기법입니다. 계수를 작게 유지하도록 강제해 과적합을 방지하며, 그 결과 새 데이터에도 더 잘 일반화되는 단순한 해를 찾게 만듭니다.
정규화는 언제 사용해야 하나요?
훈련 데이터에서는 성과가 좋은데 검증 또는 테스트 데이터에서는 성과가 나쁜 경우—즉, 그 격차가 과적합의 신호일 때 정규화를 사용하세요. 특성 차원이 높거나, 특성 수가 표본 수와 비슷하거나 더 많은 데이터셋에서도 정규화는 좋은 기본값입니다.
정규화가 항상 모델 성능을 향상시키나요?
항상 그런 것은 아닙니다. 모델이 이미 과소적합 상태라면 정규화를 추가하면 더 단순한 해로 밀어버려 상황을 악화시킵니다. 핵심은 균형을 찾는 것입니다. 정규화는 모델이 너무 복잡할 때 도움이 되지, 너무 단순할 때는 도움이 되지 않습니다.
라쏘의 alpha와 로지스틱 회귀의 C는 무엇이 다른가요?
둘 다 정규화 강도를 제어하지만 방향이 반대입니다. 라쏘의 alpha는 패널티를 스케일하며, 값이 클수록 정규화가 강합니다. scikit-learn의 로지스틱 회귀에서 C는 패널티 강도의 역수이므로 C가 작을수록 정규화가 강합니다. 둘 사이를 전환할 때는 alpha를 키우는 것과 C를 줄이는 것이 같은 효과라는 점을 기억하세요.
L1과 L2 정규화를 함께 사용할 수 있나요?
가능합니다. 그것이 바로 엘라스틱넷입니다. 두 패널티 항을 하나의 목적함수로 결합해 L1의 특성 선택과 L2의 안정성을 동시에 제공합니다. 상관관계가 있는 특성이 있고 일부는 가지치기하고 싶을 때 유용합니다. 라쏘만 사용하면 상관된 그룹에서 임의로 하나만 남기고 나머지는 버리는 경향이 있습니다.