CNN의 핵심 구조인 Batch Normalization (BN) 과 다양한 Normalization 기법
CNN 학습 안정화와 수렴 가속을 위해 왜 normalization이 필요한지, 수식적으로 어떻게 작동하는지, 그리고 실제 학습/테스트 단계에서의 차이점
Batch Normalization의 개념
등장 배경
- 딥러닝 학습이 깊어질수록 Internal Covariate Shift (내부 공변량 변화) 문제가 생김.
- 즉, 각 레이어 입력 분포가 학습 도중 계속 변해서, 이전 레이어 학습 변화가 다음 레이어에 계속 영향을 줌.
- 그 결과:
- 학습 속도 ↓
- 초기화에 민감
- 학습 불안정해결 아이디어
“각 레이어의 출력을 정규화(normalize) 하자!”
즉, 한 배치(batch) 내의 activation을 평균 0, 분산 1로 맞추는 것.
\(\hat{x}^{(k)} = \frac{x^{(k)} - \mu_B^{(k)}}{\sqrt{(\sigma_B^{(k)})^2 + \epsilon}}\)
여기서:
- \( \mu_B^{(k)} \): batch 평균
- \( \sigma_B^{(k)} \): batch 표준편차
- \( \epsilon \): 수치적 안정성을 위한 작은 상수
Batch Normalization 수식과 파라미터
Normalization만 하면 모델의 표현력이 제한됨 (항상 0~1 근처로 가버리니까).
따라서 두 개의 학습 가능한 파라미터를 추가함:
\(y^{(k)} = \gamma^{(k)} \hat{x}^{(k)} + \beta^{(k)}\)
- \( \gamma \): scale 파라미터 (variance 조정)
- \( \beta \): shift 파라미터 (mean 조정)
즉, BN은 정규화 후 다시 자유롭게 scale & shift 할 수 있게 함으로써,
모델의 표현력을 보존하면서 안정적인 학습을 가능하게 함.
Batch Normalization의 역할
BN이 가지는 장점:
- Gradient vanishing/exploding 완화
→ 활성값의 분포가 일정하게 유지되어 역전파가 안정적임. - 학습 속도 향상
→ 학습률(learning rate)을 크게 설정해도 발산하지 않음. - 초기화에 덜 민감
- 약한 정규화 효과
→ dropout 없이도 일정 수준의 regularization이 생김.
Batch Normalization의 입력/출력 형태
BN은 batch 단위로 계산하기 때문에, 입력 형태를 다음과 같이 본다:
변수 의미
| N | 배치 크기 (# of samples per batch) |
| D | 각 샘플의 feature 수 |
| \(x_i \in \mathbb{R}^D\) | i번째 샘플의 feature vector |
문제점: Batch 의존성
BN은 현재 배치(batch) 의 평균과 분산으로 정규화하기 때문에,
- 배치 크기가 너무 작으면 통계값이 불안정함.
- 서로 다른 batch에서 통계가 달라지면 output 분포가 흔들림.
-> 특히 작은 배치(batch size < 8) 이거나
입력 크기가 불균일할 때 문제 발생.
학습 vs 테스트 시 차이
Train
- 각 배치마다 계산된 \(\mu_B, \sigma_B\) 사용.
- 동시에 전체 데이터셋 평균/분산의 이동평균(running average)을 저장함.
Test
- 배치 통계값이 아니라 학습 중 누적된 이동평균(running mean, running var) 사용.
- 즉, 고정된 통계로 정규화함.
이 단계 구분은 PyTorch의 BatchNorm2d()에서도 명확히 존재함.
BN의 미스터리 (이론적 불명확성)
“BN이 왜 이렇게 잘 되는지는 아직도 완전히 이론적으로 증명되지 않았다.”
- 경험적으로 매우 효과적이지만,
- 실제로 “internal covariate shift를 줄인다”는 원래 설명보다,
gradient smoothing 효과나 optimization landscape 평탄화 등 다른 설명이 더 유력하게 받아들여짐.
Training/Test 불일치의 위험
- BN은 학습(train)과 테스트(test) 때 다르게 동작하므로,
코드에서 mode 설정(model.train(), model.eval())이 매우 중요함. - 이를 혼동하면 성능이 심각하게 깨짐.
(예: 테스트에서 여전히 batch 통계를 쓰면 결과 불안정)
BatchNorm 외 다른 Normalization 기법 비교
BN의 한계를 보완한 다양한 변형들이 존재함:
종류 설명 사용 상황
| Layer Normalization (LN) | 한 샘플의 모든 feature 단위로 정규화 | RNN, Transformer 등 |
| Instance Normalization (IN) | 한 샘플의 한 채널에 대해 정규화 | 스타일 트랜스퍼, 영상 생성 |
| Group Normalization (GN) | 채널을 그룹 단위로 묶어 정규화 | Batch size 작을 때 유리 |
| Batch Normalization (BN) | 배치 전체의 통계로 정규화 | CNN, 대규모 batch |
BN은 대규모 CNN 학습에 탁월하지만,
작은 배치에서는 IN, GN이 더 안정적임.
BatchNorm 공식
정리 수식:
\(\text{Forward: } \hat{x} = \frac{x - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}, \quad y = \gamma \hat{x} + \beta\)
\(\text{Test time: } \mu_B, \sigma_B \text{ 대신 running mean/var 사용}\)
핵심 포인트
- BN은 “층(Layer)”의 출력 분포를 일정하게 유지
- Normalization + learnable affine transform (γ, β) 구조
- 학습 안정화, 빠른 수렴, 정규화 효과
CNN 구조와 Normalization의 관계
마지막 파트는 CNN 전체 구조 속에서 normalization이 어떻게 결합되는지를 요약합니다.
예시:
\(\text{Conv → BN → ReLU → Pool → Conv → BN → ReLU → …}\)
- 일반적인 CNN 블록에서는 항상 BN이 Conv 뒤에 붙음.
- 이 조합이 현대 CNN (예: ResNet, VGG, AlexNet, DenseNet 등) 의 기본 빌딩블록.