전역 정규화

AI
gemma-4-31b
작성자
익명
작성일
2026.08.06
조회수
2
버전
v2

📋 문서 버전

이 문서는 2개의 버전이 있습니다. 현재 최신 버전을 보고 있습니다.

전역 정규화 (Global Normalization)

1. 개요

전역 정규화(Global Normalization)란 머신러닝 모델 학습 전, 데이터셋 전체의 통계량(평균, 표준편차, 최솟값, 최댓값 등)을 산출하여 모든 개별 데이터를 일정한 범위나 분포로 변환하는 데이터 전처리 기법이다.

이 과정의 주된 목적은 서로 다른 단위(Unit)나 스케일을 가진 특성(Feature)들이 모델 학습 시 특정 특성에 의해 편향되는 것을 방지하고, 경사 하강법(Gradient Descent)과 같은 최적화 알고리즘의 수렴 속도를 높이는 데 있다.

2. 작동 원리 및 수식

전역 정규화는 데이터셋 전체 $\mathcal{D}$에 대해 단일한 변환 파라미터를 계산한 뒤, 이를 모든 샘플 $x$에 동일하게 적용한다. 가장 대표적인 두 가지 방식은 Standardization과 Normalization이다.

2.1. 주요 정규화 기법 비교

구분 Standardization (표준화) Normalization (정규화)
수식 $z = \frac{x - \mu}{\sigma}$ $x_{scaled} = \frac{x - x_{min}}{x_{max} - x_{min}}$
핵심 통계량 평균($\mu$), 표준편차($\sigma$) 최솟값($x_{min}$), 최댓값($x_{max}$)
변환 결과 평균 0, 표준편차 1인 분포 $[0, 1]$ 또는 $[-1, 1]$ 사이의 값
특징 데이터의 분포를 유지하며 중심을 이동 데이터의 절대적 범위를 제한
이상치 영향 상대적으로 덜 민감함 매우 민감함 (범위가 극단적으로 변함)

3. 전역 정규화 vs 지역 정규화 (Local Normalization)

데이터를 변환하는 기준 범위에 따라 전역 방식과 지역 방식으로 구분한다.

  • 전역 정규화 (Global Normalization): 데이터셋 전체의 통계량을 기준으로 변환한다. 모든 샘플이 동일한 척도(Scale) 상에서 비교되므로, 샘플 간의 상대적인 크기 차이가 보존된다. 일반적인 정형 데이터 분석 및 딥러닝 입력층 전처리에 사용된다.
  • 지역 정규화 (Local Normalization): 개별 샘플 내부의 특성들이나 특정 윈도우(Window) 단위로 통계량을 계산하여 변환한다. 예를 들어, 이미지의 개별 샘플(이미지 한 장) 내에서 픽셀 값들의 평균과 표준편차를 계산하여 정규화하는 Instance Normalization이나 Layer Normalization이 이에 해당한다. 샘플 간의 절대적 차이보다는 샘플 내부의 상대적 패턴을 강조할 때 사용한다.

4. 주요 활용 사례

전역 정규화는 다양한 도메인의 머신러닝 파이프라인에서 필수적으로 활용된다.

  • 이미지 처리 (Pixel Scaling): 0~255 사이의 픽셀 값을 0~1 사이로 변환하거나, ImageNet 데이터셋의 전역 평균과 표준편차를 사용하여 표준화함으로써 모델의 학습 안정성을 확보한다.
  • 자연어 처리 (Text Vectorization): TF-IDF 벡터화 이후 L2 정규화를 적용하여, 문서의 길이에 상관없이 전역적인 임베딩 공간 내에서 벡터의 방향성을 기준으로 유사도를 측정하게 한다.
  • 정형 데이터 분석: 나이(0~100), 연봉(수백만~수억)과 같이 단위 차이가 큰 특성들을 동일한 스케일로 맞추어 거리 기반 알고리즘(KNN, SVM, K-Means)의 성능을 최적화한다.

5. 구현 예제

Python의 <a href="/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4/%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4/scikit-learn" class="wiki-link">scikit-learn</a> 라이브러리를 사용하여 전역 정규화를 구현하는 방법은 다음과 같다.

import numpy as np
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from sklearn.model_selection import train_test_split

# 1. 가상 데이터 생성
X = np.array([[10, 0.001], [20, 0.002], [30, 0.005], [40, 0.010], [50, 0.020]])
y = np.array([0, 0, 1, 1, 1])

# 2. 데이터 분리 (데이터 누수 방지를 위해 반드시 먼저 수행)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 3. 전역 정규화 적용 (StandardScaler 예시)
scaler = StandardScaler()

# 학습 데이터의 통계량(평균, 표준편차)을 계산하고 변환 적용
X_train_scaled = scaler.fit_transform(X_train)

# 테스트 데이터는 학습 데이터의 통계량을 그대로 사용하여 변환 (fit 호출 금지)
X_test_scaled = scaler.transform(X_test)

# 결과 확인
print("Calculated Mean:\n", scaler.mean_)
print("Calculated Scale (Std):\n", scaler.scale_)
print("\nScaled Train Data (Top 5):\n", X_train_scaled[:5])
print("Scaled Test Data (Top 5):\n", X_test_scaled[:5])

6. 주의사항 및 한계점

6.1. 데이터 누수 (Data Leakage) 방지 절차

전역 정규화 시 가장 빈번하게 발생하는 실수는 전체 데이터셋에 대해 먼저 fit을 수행한 후 데이터를 분리하는 것이다. 이는 테스트 데이터의 정보가 학습 과정에 유입되는 데이터 누수(Data Leakage)를 유발하여 모델 성능이 과대평가되는 결과를 초래한다.

[데이터 누수 방지 프로세스 순서도] 전체 데이터셋 $\rightarrow$ Train/Test Split $\rightarrow$ Train Set에 fit() $\rightarrow$ Train Set transform() $\rightarrow$ Test Set transform(Train 통계량 사용)

6.2. 데이터 분포의 변화 (시각화 관점)

정규화 전후의 데이터 분포는 다음과 같이 변화한다.

  • 정규화 전: 특성별로 X축의 범위가 서로 달라 산점도 상에서 매우 길쭉한 타원형 분포를 보인다.
  • 정규화 후: 모든 특성이 유사한 범위 내에 위치하게 되어, 산점도 상에서 원형에 가까운 균형 잡힌 분포를 띠게 된다. 이는 비등방성(Anisotropy)이 제거되어 비용 함수의 조건수(Condition Number)가 개선됨을 의미하며, 결과적으로 최적화 경로를 단축시킨다.

[분포 변화 시각화 개념] - Before: $\text{Feature A (0~1)} \times \text{Feature B (0~1,000,000)} \rightarrow$ 극단적인 타원형 - After: $\text{Feature A (-1~1)} \times \text{Feature B (-1~1)} \rightarrow$ 정원(Circle)에 가까운 형태

6.3. 이상치(Outlier) 처리와 Robust Scaling

Min-Max Scaling은 최솟값과 최댓값에 의존하므로, 극단적인 이상치가 존재할 경우 대부분의 정상 데이터가 매우 좁은 범위로 압축되는 문제가 발생한다. 이를 해결하기 위해 Robust Scaling을 사용한다.

RobustScaler의 원리: 평균과 표준편차 대신 중앙값(Median)사분위수 범위(IQR, Interquartile Range)를 사용한다. $$x_{robust} = \frac{x - Q_2(Median)}{Q_3 - Q_1(IQR)}$$ 이 방식은 상위 25%와 하위 25%를 제외한 중앙 영역의 통계량을 사용하므로, 이상치의 영향을 최소화하면서 전역적인 스케일링을 수행할 수 있다.

전역 정규화의 수학적 배경과 최적화

전역 정규화가 경사 하강법(Gradient Descent)의 수렴 속도를 개선하는 이유는 비용 함수(Cost Function)의 곡률을 균일하게 만들어 Hessian 행렬의 조건수(Condition Number)를 낮추기 때문이다.

Hessian 행렬과 곡률

비용 함수 $J(\theta)$의 2차 미분 행렬인 Hessian 행렬 $H$는 다음과 같이 정의된다. $$H_{ij} = \frac{\partial^2 J(\theta)}{\partial \theta_i \partial \theta_j}$$

특성 간의 스케일 차이가 극심할 경우, 특정 방향으로는 곡률이 매우 크고 다른 방향으로는 매우 작은 '길쭉한 타원형'의 등고선이 형성된다. 이는 Hessian 행렬의 최대 고윳값($\lambda_{max}$)과 최소 고윳값($\lambda_{min}$)의 차이가 매우 큼을 의미하며, 조건수 $\kappa$는 다음과 같이 계산된다. $$\kappa = \frac{\lambda_{max}}{\lambda_{min}}$$

최적화 경로의 물리적 변화

  • 정규화 전 ($\kappa \gg 1$): 조건수가 높으면 경사 하강법 수행 시 최적점으로 향하는 직선 경로가 아니라, 곡률이 큰 방향으로 진동(Oscillation)하며 수렴 속도가 매우 느려진다.
  • 정규화 후 ($\kappa \approx 1$): 전역 정규화를 통해 모든 특성의 스케일을 맞추면 비용 함수의 등고선이 원형에 가까워진다. 이는 모든 방향의 곡률이 유사해짐을 의미하며, $\kappa$가 1에 가까워져 최적점으로 최단 거리로 빠르게 수렴하게 된다.

[시각화 개념] - High Condition Number: $\text{Contour} \rightarrow \text{Narrow Ellipse} \rightarrow \text{Zig-zag Path}$ - Low Condition Number: $\text{Contour} \rightarrow \text{Circle} \rightarrow \text{Direct Path}$

실시간 데이터 스트림에서의 전역 정규화

정적인 데이터셋과 달리, 지속적으로 데이터가 유입되는 스트림 환경에서는 전체 데이터를 메모리에 적재하여 통계량을 계산할 수 없다. 이를 위해 점진적 정규화(Incremental Normalization) 기법을 사용한다.

점진적 통계량 업데이트

새로운 데이터 $x_{new}$가 들어올 때마다 평균($\mu$)과 분산($\sigma^2$)을 다음과 같이 업데이트한다. (Welford's Algorithm 기반) 1. $n \leftarrow n + 1$ 2. $\Delta = x_{new} - \mu_{old}$ 3. $\mu_{new} = \mu_{old} + \frac{\Delta}{n}$ 4. $M_{new} = M_{old} + \Delta \times (x_{new} - \mu_{new})$ (여기서 $M$은 제곱합) 5. $\sigma^2_{new} = \frac{M_{new}}{n}$

점진적 정규화 의사코드

class IncrementalScaler:
    def __init__(self):
        self.n = 0
        self.mean = 0
        self.M2 = 0

    def partial_fit(self, x):
        self.n += 1
        delta = x - self.mean
        self.mean += delta / self.n
        delta2 = x - self.mean
        self.M2 += delta * delta2

    def transform(self, x):
        std = np.sqrt(self.M2 / self.n) if self.n > 0 else 1
        return (x - self.mean) / std

희소 행렬을 위한 MaxAbsScaler

전역 정규화 기법 중 MaxAbsScaler는 데이터의 중심을 0으로 유지하면서 모든 값을 $[-1, 1]$ 범위로 스케일링한다. $$x_{scaled} = \frac{x}{\max(|x|)}$$ 이 방식은 평균을 빼는 과정(Centering)이 없기 때문에, 0이 많은 희소 행렬(Sparse Matrix)의 구조를 파괴하지 않고 메모리 효율성을 유지하며 정규화를 수행할 수 있다는 특수성이 있다.

딥러닝 모델의 안정성과 전역 정규화

전역 정규화는 딥러닝 모델의 학습 초기 단계에서 가중치 초기화(Weight Initialization)와 상호보완적인 역할을 수행한다.

  • 활성화 함수 포화(Saturation) 완화: 입력 데이터의 스케일이 너무 크면 Sigmoid나 Tanh 함수에서 출력값이 0 또는 1로 수렴하여 기울기가 소실되는(Gradient Vanishing) 포화 문제가 발생한다. 전역 정규화는 입력값을 적절한 범위로 제한하여 활성화 함수의 선형 영역(Linear Region)에 데이터가 위치하게 함으로써 학습 효율을 높인다.
  • 가중치 초기화와의 상관관계: Xavier나 He 초기화는 입력/출력 노드의 분산을 일정하게 유지하려 한다. 입력 데이터 자체가 전역 정규화되어 분산이 통제되어 있다면, 초기 가중치와 결합했을 때 층을 통과하는 신호의 크기가 폭주하거나 소멸하는 현상을 효과적으로 방지할 수 있다.

파이프라인 기반의 데이터 누수 방지 구현

교차 검증(Cross-Validation) 시, 전체 데이터에 대해 정규화를 먼저 수행하면 검증 셋의 정보가 학습 셋에 반영되는 데이터 누수가 발생한다. 이를 방지하기 위해 scikit-learn<a href="/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EA%B0%9C%EB%B0%9C/%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85/Pipeline" class="wiki-link wiki-link-missing">Pipeline</a>을 사용하여 '분할 $\rightarrow$ 학습 셋 기준 fit $\rightarrow$ 변환' 과정을 원자적으로 묶어 처리해야 한다.

Scikit-learn 파이프라인 구현 예제

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score

# 1. 파이프라인 구성: 정규화와 모델을 하나의 단위로 묶음
pipeline = Pipeline([
    ('scaler', StandardScaler()), 
    ('classifier', LogisticRegression())
])

# 2. 교차 검증 수행
# Pipeline을 사용하면 각 폴드(Fold) 내에서 
# Train 폴드로만 scaler.fit()을 수행하고 Validation 폴드에 transform()을 적용함
scores = cross_val_score(pipeline, X, y, cv=5)

print(f"Cross-validation Accuracy: {scores.mean():.4f}")

AI 생성 콘텐츠 안내

이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?