정규화 기법 (Normalization Techniques)¶
개요¶
정규화(Normalization)는 신경망의 중간 활성화 값을 안정화하여 학습을 빠르고 안정적으로 만드는 기법이다. 층이 깊어질수록 각 층의 입력 분포가 변하는 문제(Internal Covariate Shift)를 완화하며, 더 높은 학습률을 사용할 수 있게 하고, 약한 정규화(regularization) 효과도 제공한다. Batch Normalization을 시작으로 다양한 변형이 등장했으며, 아키텍처에 따라 적합한 정규화 기법이 다르다.
핵심 개념¶
1. Batch Normalization (배치 정규화)¶
Ioffe & Szegedy (2015)가 제안한 가장 대표적인 정규화 기법이다.
수식: $\(\hat{x} = \frac{x - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}\)$ $\(y = \gamma \hat{x} + \beta\)$
- \(\mu_B\), \(\sigma_B^2\): 미니배치 내 평균과 분산
- \(\gamma\), \(\beta\): 학습 가능한 scale과 shift 파라미터
- \(\epsilon\): 수치 안정성을 위한 작은 값
왜 \(\gamma\)와 \(\beta\)가 필요한가: 정규화만 하면 네트워크의 표현력이 제한될 수 있다. 학습 가능한 파라미터를 통해 네트워크가 정규화를 "되돌릴" 수 있도록 한다. 즉, 네트워크가 필요하다면 원래 분포를 복원할 수 있다.
추론 시: 미니배치가 없으므로, 학습 중 누적한 이동 평균(running mean/variance)을 사용한다.
효과: - 더 높은 학습률 허용 → 빠른 수렴 - 약한 정규화 효과 (미니배치의 노이즈로 인해) - 기울기 소실/폭발 완화
한계: - 배치 크기에 의존 (배치 크기가 작으면 통계치가 불안정) - RNN에 적용하기 어려움 (시퀀스 길이가 달라 배치 통계가 불안정)
2. Layer Normalization (층 정규화)¶
Ba et al. (2016)이 제안하였다.
수식은 Batch Normalization과 동일하지만, 정규화 축이 다르다. 단일 샘플의 모든 feature에 대해 정규화한다.
장점: - 배치 크기에 무관 - RNN/Transformer에 적합
Transformer에서의 위치: - Post-LN: 잔차 연결 후에 정규화 → 원래 Transformer 방식 (Vaswani et al., 2017) - Pre-LN: 잔차 연결 전에 정규화 → 학습 안정성 향상, 현재 더 일반적
graph LR
subgraph "Post-LN (원래 방식)"
A1[입력 x] --> B1[SubLayer]
B1 --> C1[+]
A1 --> C1
C1 --> D1[LayerNorm]
end
subgraph "Pre-LN (현재 표준)"
A2[입력 x] --> D2[LayerNorm]
D2 --> B2[SubLayer]
B2 --> C2[+]
A2 --> C2
end 3. Group Normalization¶
Wu & He (2018)이 제안하였다.
채널을 \(G\)개의 그룹으로 나누어 각 그룹 내에서 정규화한다.
특수 케이스: - \(G = 1\): Layer Normalization과 동일 - \(G = C\) (채널 수): Instance Normalization과 동일
장점: 배치 크기에 무관하면서도 CNN에 적합. 특히 배치 크기가 작은 경우(object detection, segmentation)에 Batch Normalization보다 우수하다.
4. Instance Normalization¶
각 채널, 각 샘플에 대해 독립적으로 정규화한다.
주요 사용처: Style Transfer — 스타일 정보(평균, 분산)를 제거하여 콘텐츠만 남긴다.
5. RMSNorm¶
핵심 차이: Layer Normalization에서 평균 빼기(centering)를 생략하고, RMS(Root Mean Square)만으로 정규화한다.
장점: Layer Normalization보다 계산 효율적 (평균 계산 생략)
사용처: LLaMA, Gemma 등 최신 LLM에서 채택
상세 내용¶
정규화 축 비교¶
4차원 텐서 \((N, C, H, W)\)에서 각 기법이 어떤 축을 정규화하는지:
| 기법 | 정규화 축 | 직관 |
|---|---|---|
| Batch Norm | \((N, H, W)\) — 배치 내 동일 채널 | "같은 특징을 가진 모든 샘플에 대해" |
| Layer Norm | \((C, H, W)\) — 한 샘플의 모든 특징 | "한 샘플 내의 모든 특징에 대해" |
| Instance Norm | \((H, W)\) — 한 채널, 한 샘플 | "한 특징 맵 내에서" |
| Group Norm | \((C/G, H, W)\) — 그룹 내 채널들 | "관련된 채널 그룹 내에서" |
graph TD
subgraph "4D 텐서: (N, C, H, W)"
BN["Batch Norm<br>N, H, W 축 정규화<br>채널별 통계"]
LN["Layer Norm<br>C, H, W 축 정규화<br>샘플별 통계"]
IN["Instance Norm<br>H, W 축 정규화<br>채널+샘플별 통계"]
GN["Group Norm<br>C/G, H, W 축 정규화<br>그룹별 통계"]
end 종합 비교 표¶
| 기법 | 배치 의존 | 적합 아키텍처 | 계산 비용 | 특이 사항 |
|---|---|---|---|---|
| Batch Norm | 있음 | CNN (큰 배치) | 중간 | running stats 관리 필요 |
| Layer Norm | 없음 | Transformer, RNN | 중간 | Pre-LN vs Post-LN |
| Group Norm | 없음 | CNN (작은 배치) | 중간 | G 선택 필요 (보통 32) |
| Instance Norm | 없음 | Style Transfer | 낮음 | 스타일 정보 제거 |
| RMSNorm | 없음 | LLM | 낮음 | centering 생략 |
언제 사용하는가¶
flowchart TD
A[정규화 기법 선택] --> B{아키텍처?}
B -->|CNN + 큰 배치| C[Batch Normalization]
B -->|CNN + 작은 배치| D[Group Normalization]
B -->|Transformer| E{모델 규모?}
B -->|RNN| F[Layer Normalization]
B -->|Style Transfer| G[Instance Normalization]
E -->|대규모 LLM| H[RMSNorm]
E -->|일반 Transformer| I[Layer Normalization] 흔한 오해와 함정¶
-
학습/추론 모드 전환 누락: Batch Normalization을 사용할 때, PyTorch에서
model.train()과model.eval()전환을 잊으면 추론 시 배치 통계를 사용하여 결과가 불안정해진다. 이것은 가장 흔한 실수 중 하나이다. -
"Batch Normalization은 Internal Covariate Shift를 해결한다": 원논문의 동기였으나, 후속 연구(Santurkar et al., 2018)는 BN의 효과가 손실 표면의 평활화(smoothing)에 더 가깝다고 분석했다.
-
배치 크기 1에서 Batch Norm 사용: 배치 크기가 1이면 배치 통계가 의미 없다. 이 경우 Group Norm이나 Layer Norm을 사용해야 한다.
-
정규화 순서 무시: Conv → BN → ReLU가 일반적이지만, 연구에 따라 Conv → ReLU → BN이 더 나은 경우도 있다. Pre-LN vs Post-LN 선택도 성능에 영향을 준다.
-
정규화와 정규화(regularization) 혼동: Normalization(분포 정규화)과 Regularization(과적합 방지)은 다른 개념이다. 한국어에서 모두 "정규화"로 번역되어 혼동이 잦다.
다른 주제와의 연결¶
- 활성화 함수: 정규화가 활성화 분포를 안정화
- 가중치 초기화: 정규화가 초기화에 대한 민감도를 줄여줌
- 역전파: 기울기 흐름의 안정화
- CNN: Batch Normalization의 주요 사용처
- Transformer: Layer Normalization, RMSNorm
- RNN/LSTM/GRU: Layer Normalization의 적용
- 전이 학습: Domain-specific BatchNorm