L1와 L2 정규화 이해하기: 최적화된 모델 학습을 위한 기법
이번 글에서는 L1 정규화와 L2 정규화가 무엇이며 어떻게 작동하는지 깊이 있게 살펴보겠습니다. 이 글은 AI 번역본입니다. 오역이 있을 경우 댓글로 자유롭게 알려주세요.
Created on September 15|Last edited on September 15
Comment

출처: DALLE
소개
오버피팅은 기계 학습 모델을 학습할 때 흔히 발생하는 문제입니다. 본질적으로 오버피팅은 모델이 암기한다 노이즈까지 학습하여 학습 데이터에 과도하게 맞춰지면, 새로운 데이터에 잘 일반화하지 못하는 모델이 됩니다.
오버피팅을 해결하는 널리 사용되는 방법 중 하나는 L1 및 L2 정규화. 이러한 기법은 손실 함수에 패널티 항을 추가하여 모델이 더 작은 매개변수 값을 갖도록 유도합니다.
이 글에서는 두 기법을 자세히 살펴보고, 이해를 돕기 위한 코드 구현도 함께 다룹니다.
정규화의 기초

작성자 제공 이미지
간단히 말해, 정규화는 머신러닝에서 오버피팅을 줄이고 새로운 데이터에 대한 일반화 능력을 향상시켜 모델이 잘 맞도록 하는 기법입니다.
정규화는 학습 과정에서 모델에 추가적인 제약이나 패널티를 부여하여 복잡도를 관리하고, 학습 데이터의 특정 특징이나 패턴에 과도하게 의존함으로써 발생하는 오버피팅을 방지하는 기법입니다. 이를 통해 학습 데이터를 정확하게 맞추는 것과 보지 못한 데이터에 잘 일반화하는 것 사이의 균형을 이루도록 돕습니다.
주요 정규화 방법으로는 L1 정규화(라쏘), L2 정규화(리지), 엘라스틱넷 정규화가 있습니다.
L1 정규화는 계수의 절대값 합을 손실 함수에 패널티 항으로 추가하여 희소성을 촉진하고 관련 특성의 선택을 유도함으로써 모델을 개선합니다. 반면 L2 정규화는 계수의 제곱값 합을 패널티 항으로 추가하여 계수를 0이 되지 않도록 작지만 더 안정적으로 끌어내립니다. 마지막으로 엘라스틱넷 정규화는 L1 정규화와 L2 정규화를 결합한 방식입니다.
L1 정규화 이해하기
L1 정규화, 즉 라쏘 (엘동쪽 에절댓값 에수축과 에선거 오회귀 계수의 절댓값 크기에 페널티를 부과하여 모델의 과적합을 줄이는 정규화 기법이다.
L1 정규화에서는 페널티가 계수 크기의 절댓값에 해당하며, 이로 인해 일부 계수가 0으로 수축되어 데이터셋의 불필요한 특성이 제거됩니다. 이는 모델의 희소성을 높여 주며, 변수가 많은 모델에서 특성 선택에 L1 정규화를 매우 유용하게 만듭니다.
L1 정규화에서 추가되는 페널티 항은 계수들의 절댓값 합에 정규화 파라미터(λ)를 곱한 값이다.

위 그림에서 β_i는 모델의 계수를 나타내고, λ는 페널티 강도를 조절하는 음이 아닌 하이퍼파라미터이다. λ의 값이 클수록 페널티가 커지며, 그 결과 더 많은 계수가 0으로 수축될 수 있다.
L1 정규화는 일부 계수를 0으로 수축시킬 수 있으므로, 모델에서 해당 특성을 완전히 제거하는 효과가 있습니다. 이는 일부 특성이 무의미하거나 중복될 수 있는 고차원 데이터를 다룰 때 특히 유용합니다. 동시에 더 중요한 특성을 자동으로 선택하여, 내장된 특성 선택 기능을 제공하게 됩니다.
L1 정규화가 활용되는 실무 예로는 금융 모델링이 있습니다. 특히 주가 예측이나 리스크 평가용 예측 모델을 구축할 때, 방대한 경제 지표와 과거 데이터 중에서 가장 예측력이 높은 요인을 선택하는 데 L1 정규화가 도움이 됩니다. 또한 이미지 처리와 컴퓨터 비전에서도 특징 선택이 중요하며, 이를 통해 계산 복잡도를 줄이고 이미지 분류 모델의 성능을 향상시킬 수 있습니다.
전반적으로, 이러한 이유로 L1 정규화는 모델의 단순성과 해석 가능성이 중요하거나 무의미한 특성이 포함된 데이터를 다룰 때 인기 있는 선택지입니다.
L2 정규화 이해하기
L2 정규화는 릿지 정규화라고도 하며, 계수의 크기에 페널티를 부과해 과적합을 방지하는 데 사용되는 또 다른 일반적인 머신러닝 기법입니다. 계수의 절댓값 합을 손실 함수에 더하는 L1 정규화와 달리, L2 정규화는 계수의 제곱을 더합니다. 이러한 접근 방식의 차이로 인해 모델에 나타나는 특성과 효과도 서로 달라집니다.
L2 정규화 항은 계수들의 제곱 합에 정규화 파라미터(λ)를 곱한 값입니다.

작성자 제공 이미지
위 그림에서 볼 수 있듯이, L1과 L2의 수식 차이는 β_i가 제곱되느냐에 있습니다. 아니요 절댓값.
L1 정규화와 달리, L2 정규화는 일반적으로 계수에 희소성을 유도하지 않습니다. 모든 특성이 크기가 작더라도 어느 정도 기여하므로, 어떤 계수도 0으로 설정되지 않습니다. 이는 특성을 버리는 것이 바람직하지 않은 상황에서 유리할 수 있습니다. 또한 L2 정규화는 다중공선성(독립 변수들 간 상관이 매우 높은 상태)을 처리하는 데 특히 효과적입니다. 계수의 크기에 페널티를 부과해 모델이 입력의 작은 변화에 과도하게 민감해지는 것을 막아, 안정성과 성능을 유지하기 때문���니다.
L2 정규화의 실용적인 적용 사례로는 의료 분야가 있습니다. 여기서는 다양한 임상 특성에 기반해 환자 결과를 예측하는 모델이 사용됩니다. 임상 데이터셋은 여러 혈액 검사 결과처럼 상관된 변수가 많은 경우가 흔하므로, 이러한 모델에서 L2 정규화는 특히 유용합니다. 계수에 페널티를 부과함으로써 L2 정규화는 다중공선성에 대한 모델의 민감도를 낮추고, 예측을 안정화하며, 새로운 환자 데이터에 대한 모델의 일반화 성능을 향상시킵니다.
또 다른 예로 스포츠 분석이 있습니다. 과거 데이터를 바탕으로 선수의 퍼포먼스나 경기 결과를 예측할 때, 선수 기록처럼 상관관계가 높은 통계적 특성이 많으면 과적합이 발생하기 쉽습니다. 이때 L2 정규화는 이러한 상관된 특성을 다루며 과적합을 완화하는 데 도움이 됩니다. 그 결과 모델은 여러 시즌에 걸치거나 팀과 리그가 달라져도 더 견고하고 신뢰할 수 있게 됩니다.
전반적으로 L2 정규화는 회귀와 분류 모델 전반에서 널리 사용되며, 특히 특성 선택을 반드시 수행하지 않더라도 모델 복잡도를 제어해 일반화 성능을 향상시키는 것이 목표일 때 효과적입니다.
L1와 L2 정규화 비교

작성자 제공 이미지
L1와 L2의 유일한 차이는 페널티 항에 있다, 이로 인해 두 방법은 여러 측면에서 차이를 보입니다. L1의 페널티 항은 일부 계수가 정확히 0이 되도록 수축을 유도하여, 정보가 없거나 중요도가 낮은 특성을 제거함으로써 사실상 특성 선택을 수행하고 특성 공간을 줄인 희소 모델을 만듭니다. 반면 L2의 페널티 항은 계수를 0에 가깝게 수축하지만 보통 0이 되지는 않으므로, 모든 특성이 크기가 작더라도 기여하는 밀집 모델을 형성합니다. 이는 다중공선성을 다루고 모델의 안정성을 높이는 데 도움이 됩니다.
다중공선성 처리 측면에서 보면, L1은 상관이 높은 특성들 사이에서 임의로 하나를 선택해 버릴 수 있어 효과가 떨어집니다. 반면 L2는 상관된 특성들 사이에 계수 값을 분산시켜 부여하므로 다중공선성을 다루는 데 매우 효과적입니다.
다음으로 모델 복잡도와 해석 가능성을 비교해 보면, L1이 우위에 있습니다. L1은 일부 특성을 완전히 제거해 모델 복잡도를 낮추며, 사용되는 특성이 줄어들어 각 특성의 영향력을 이해하기 쉬워져 해석 가능성이 높아집니다. 반면 L2는 모든 특성이 남되 영향력이 줄어드는 방식이어서, 개별 효과를 구분하기가 상대적으로 어려워 L1에 비해 해석 가능성이 낮습니다.
마지막으로 최적화 측면을 살펴보면, L1 정규화는 페널티 항이 계수의 절댓값을 포함해 0에서 미분 가능하지 않다는 점 때문에 최적화가 까다롭습니다. 이로 인해 좌표 하강법이나 서브그레이디언트 방법처럼 이러한 한계에도 불구하고 손실 함수를 효과적으로 최적화할 수 있는 특화된 알고리즘이 필요한 경우가 많습니다. 반면 L2 정규화의 제곱 항은 연속적으로 미분 가능하므로, 표준 경사 기반 알고리즘을 사용한 최적화가 계산 효율적입니다.
L1 또는 L2 정규화를 사용할지는 문제의 특성과 주어진 데이터의 속성에 따라 달라집니다. 예를 들어, 야생동물 보전 분야에서 연구자들이 현장에서 수집한 소수의 데이터 포인트를 바탕으로 희귀 종 개체군에 다양한 환경 요인이 미치는 영향을 모델링한다고 가정해 봅시다. 이들은 기후 조건, 포식률, 인간 활동 수준처럼 잠재적으로 매우 많은 요인 중에서 핵심 요인을 가려내는 모델을 원합니다. 이 경우 L1 정규화가 적합합니다. L1은 중요도가 낮은 요인의 계수를 0으로 만들어 제거할 수 있어, 보전 담당자들이 종 보전에 가장 도움이 될 변화에 노력을 집중할 수 있도록 도와줍니다.
또 다른 예로, 한 영화 제작사가 장르 인기, 예산, 주연 배우진, 개봉 시기 등 다양한 특성을 바탕으로 다음 대작의 흥행을 예측하고자 한다고 합시다. 이러한 요인들이 모두 어느 정도 영향을 미치지만 상호 관계가 강하게 상관되어 있다면, L2 정규화가 더 적합합니다. L2 정규화는 이러한 다중공선성을 잘 관리하여 예측 모델의 안정성을 높이고, 개별 효과가 작더라도 모든 잠재적 영향을 반영하도록 도와줍니다.
머신러닝 알고리즘에서 L1·L2 정규화 구현하기
이제 L1과 L2 정규화를 이해하셨기를 바랍니다. 다음부터는 Weights & Biases와 함께 각 방법의 코드 구현을 다루겠으며, Diabetes 데이터셋을 사용할 것입니다. L1과 L2의 코드는 거의 동일하고, 유일한 차이는 3단계에 있습니다.
1단계: 라이브러리 가져오기
import numpy as npimport pandas as pdfrom sklearn.datasets import load_diabetesfrom sklearn.linear_model import Lassofrom sklearn.model_selection import train_test_splitimport wandb
“numpy”는 수치 연산에 사용됩니다. “pandas”는 데이터 조작에 사용됩니다. “sklearn.datasets”에는 Diabetes 데이터셋이 포함되어 있습니다. “sklearn.linear_model”에는 L1과 L2 정규화를 위한 Lasso와 Ridge 클래스가 들어 있습니다. “sklearn.model_selection”은 데이터를 학습용과 테스트용으로 나누는 “train_test_split” 메서드를 제공합니다. “wandb”(Weights & Biases)는 머신러닝 실험을 추적하고 시각화하는 도구입니다.
2단계: 초기화 및 데이터 준비
Weights & Biases에 로그인
wandb.login()
Weights & Biases 프로젝트 초기화
wandb.init(project='L1_Regularization_Diabetes')
Diabetes 데이터셋 불러오기
data = load_diabetes()X = data.datay = data.target
데이터를 학습용과 테스트용으로 분할하기
deX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
정규화 강도 설정
alphas = np.logspace(-4, 0, 30)
“alphas”는 정규화 강도 α에 대한 값들을 로그 스케일로 1e-4부터 1e4까지 생성한 배열로, 약한 정규화부터 강한 정규화까지의 효과를 폭넓게 확인할 수 있도록 다양한 값을 제공합니다.
로깅 설정
train_scores = []test_scores = []coefficients = []
3단계: 학습 및 로깅(L1)
for alpha in alphas:lasso = Lasso(alpha=alpha)lasso.fit(X_train, y_train)train_scores.append(lasso.score(X_train, y_train))test_scores.append(lasso.score(X_test, y_test))coefficients.append(lasso.coef_)wandb.log({'alpha': alpha, 'Train Score': lasso.score(X_train, y_train), 'Test Score': lasso.score(X_test, y_test), 'Coefficients': lasso.coef_})
3단계: 학습 및 로깅(L2)
for alpha in alphas:ridge = Ridge(alpha=alpha)ridge.fit(X_train, y_train)train_scores.append(ridge.score(X_train, y_train))test_scores.append(ridge.score(X_test, y_test))coefficients.append(ridge.coef_)wandb.log({'alpha': alpha, 'Train Score': ridge.score(X_train, y_train), 'Test Score': ridge.score(X_test, y_test), 'Coefficients': ridge.coef_})
이 루프는 α 값 배열을 순회합니다. 각 α에 대해 모델(Lasso 또는 Ridge) 인스턴스를 생성하여 학습 데이터셋으로 학습시킵니다. 이후 학습 세트와 테스트 세트에서 모델 성능을 평가하고, 결과 점수를 각각 train_scores와 test_scores 리스트에 저장합니다. 또한 매 반복마다 모델의 계수도 함께 저장합니다. 이렇게 얻은 학습·테스트 점수와 계수 등 모든 지표는 매 반복마다 Weights & Biases (W&B)에 로깅됩니다. 이 설정을 통해 α의 변화가 모델 성능과 계수에 어떤 영향을 미치는지 추적할 수 있어, 정규화 강도의 영향에 대한 통찰을 제공합니다.
4단계: W&B에 차트 로깅하기(L1)
먼저 학습 및 테스트 점수를 위한 표를 생성하겠습니다.
train_scores_table = wandb.Table(data=pd.DataFrame({'alpha': alphas, 'Train Scores': train_scores}))test_scores_table = wandb.Table(data=pd.DataFrame({'alpha': alphas, 'Test Scores': test_scores}))
계수 표 및 차트 그리기 코드:
coefficients_df = pd.DataFrame(coefficients, columns=[f"Feature {i+1}" for i in range(len(coefficients[0]))])coefficients_df['Alpha'] = alphascoefficients_table = wandb.Table(dataframe=coefficients_df)wandb.log({"Coefficients Table": coefficients_table})for feature in coefficients_df.columns[:-1]: # Exclude the 'Alpha' columncoef_plot = wandb.plot.line(coefficients_table, 'Alpha', feature, title=f"Coefficients Evolution: {feature}")wandb.log({f"Plot - {feature}": coef_plot})
다음으로 학습 및 테스트 점수에 대한 차트를 로깅합니다:
wandb.log({"Train Scores Chart": wandb.plot.line(train_scores_table, 'alpha', 'Train Scores', title="L1 - Train Scores vs Alpha"),"Test Scores Chart": wandb.plot.line(test_scores_table, 'alpha', 'Test Scores', title="L1 - Test Scores vs Alpha")})
그리고 W&B 실행을 종료합니다.
wandb.finish()
반복이 완료되면 학습 루프 동안 수집한 각 특성의 학습 점수, 테스트 점수, 계수를 Pandas DataFrame에 저장합니다. 그런 다음 이 DataFrame을 Weights & Biases에서 시각화를 위해 요구하는 형식인 wandb.Table로 변환합니다. 이후 α의 서로 다른 값에 따라 각 특성의 계수 변화와 학습·테스트 점수에 대한 선형 차트를 생성하여 wandb.plot.line()을 사용해 W&B에 로깅합니다.
L1 정규화에 대해 로깅된 결과는 다음과 같습니다.







L2 정규화에 대해 로깅된 결과는 다음과 같습니다.







결론
이 글에서는 과적합을 방지하고 모델의 일반화 성능을 높이기 위한 머신러닝의 핵심 기법인 L1과 L2 정규화를 살펴보았습니다. L1 정규화(Lasso)는 모델 계수에 희소성을 유도하여 중요도가 낮은 특성의 계수를 사실상 0으로 만들어 특성 선택에 적합합니다. 반면 L2 정규화(Ridge)는 모든 계수를 0에 가깝게 줄이되 완전히 0으로 만들지는 않기 때문에, 특성들 간 상관관계가 높은 상황에서 모델 예측을 안정화하는 데 유리합니다.
L1과 L2 중 무엇을 선택할지는 데이터 특성과 모델의 구체적인 요구에 크게 좌우됩니다. 해석 용이성이나 성능을 위해 적은 수의 특성이 필요한 모델에는 L1이 선호되고, 모든 특성을 고려하되 각 특성의 영향력을 완화하여 사용해야 할 때는 L2가 적합합니다.
이 기법들을 직접 실험해 보시길 강력히 권합니다. 두 방법을 다양한 데이터셋에 적용해 보면서 각자에게 맞는 최적의 접근법을 찾아 보세요. 이렇게 하면 견고하고 정확한 모델을 개발하는 데 큰 도움이 됩니다.
Add a comment