Batch Normalization
배치 정규화는 미니배치의 각 채널을 표준화한 다음 학습된 매개변수로 다시 스케일링합니다. 수학적 원리, 추론 동작, 한계를 다룹니다.
배치 정규화 또는 BatchNorm은 현재 미니배치의 평균과 분산으로 입력의 각 채널을 정규화한 다음, 학습되는 두 개의 파라미터로 결과를 재조정하는 신경망 층입니다. Sergey Ioffe와 Christian Szegedy는 2015년에 이를 소개했으며, 이를 통해 Inception 이미지 분류기는 학습 단계를 14배 줄이고도 같은 정확도를 달성했습니다. BatchNorm은 더 높은 학습률을 허용하고 가중치 초기화에 대한 학습 민감도를 낮추며, ResNet과 같은 합성곱 신경망(CNNs)의 표준 구성 요소가 되었습니다.
배치 정규화의 작동 방식#
합성곱 층의 경우 BatchNorm은 각 채널마다 평균 μ와 분산 σ²를 하나씩 계산하며, 배치의 모든 이미지와 모든 공간 위치를 대상으로 집계합니다. 그런 다음 각 활성값 x에 다음 두 단계를 적용합니다.
- 정규화: x̂ = (x − μ) / √(σ² + ε)이며, 기본적으로 PyTorch에서 1e-5인 작은 ε은 0으로 나누는 것을 방지합니다.
- 스케일 및 시프트: y = γ·x̂ + β이며, γ와 β는 채널별로 학습됩니다. 이 값들을 통해 네트워크는 다음 층에 적합한 평균과 분산을 복원할 수 있으며, 정규화를 완전히 되돌릴 수도 있습니다.
BatchNorm은 일반적으로 합성곱과 활성화 함수 사이에 배치됩니다. β가 이미 채널별 오프셋을 더하므로, 앞선 합성곱의 바이어스는 중복되어 보통 비활성화됩니다.
학습과 추론 비교#
학습 중에는 각 순전파에서 배치 통계의 지수 이동 평균으로 이동 평균과 이동 분산도 업데이트합니다. PyTorch의 BatchNorm2d는 기본적으로 새로운 배치마다 해당 값들을 배치 통계 쪽으로 10% 이동시킵니다(momentum=0.1). 추론 시에는 이 이동 평균으로 정규화하므로, 한 이미지의 예측은 더 이상 같은 배치에 포함된 다른 이미지에 좌우되지 않습니다. model.train()와 model.eval()은 두 동작을 전환합니다.
import torch
torch.manual_seed(0)
bn = torch.nn.BatchNorm2d(num_features=3)
# A batch of 8 three-channel feature maps with mean 5 and standard deviation 2
x = 5 + 2 * torch.randn(8, 3, 16, 16)
# Training mode normalizes with this batch's per-channel mean and variance
out = bn(x)
print(f"train mode: output mean {out.mean():.3f}, std {out.std():.3f}")
# The same call nudges the running averages 10% of the way toward the batch statistics
print(f"running mean {bn.running_mean[0]:.3f}, running var {bn.running_var[0]:.3f}")
# Eval mode normalizes with the running averages instead of the batch statistics
bn.eval()
out = bn(x)
print(f"eval mode: output mean {out.mean():.3f}, std {out.std():.3f}")학습 모드에서는 입력 평균이 5여도 출력 평균은 0.000, 표준편차는 1.000입니다. 배치 하나를 처리한 뒤 이동 평균은 0에서 0.496으로, 이동 분산은 1에서 1.294로만 변하므로 평가 모드 출력의 평균은 3.920이 됩니다. 이동 평균이 수렴하려면 수십 개의 배치가 필요하며, 잘못된 모드로 평가하거나 통계가 안정화되기 전에 평가한 모델은 실제 정확도보다 훨씬 낮은 점수를 기록합니다.
추론 시 BatchNorm은 채널별 고정 선형 변환이므로 앞선 합성곱에 통합할 수 있습니다. 합성곱 가중치에 γ/√(σ² + ε)를 곱하고, 바이어스를 β − γμ/√(σ² + ε)로 설정합니다. YOLO26의 표준 합성곱 블록은 바이어스가 없는 합성곱 다음에 BatchNorm과 SiLU 활성화 함수를 배치합니다. Ultralytics는 예측 및 내보내기 전에 각 BatchNorm 층을 합성곱에 융합하여, 동일한 출력을 생성하면서 해당 층을 제거합니다.
배치 정규화가 효과적인 이유#
원 논문은 BatchNorm의 이점이 내부 공변량 변화, 즉 앞선 층이 업데이트될 때 각 층의 입력 분포가 변하는 현상을 줄이는 데 있다고 설명했습니다. 이후 BatchNorm 층 뒤에 무작위 분포 변화를 주입한 실험에서는 학습에 거의 영향이 없음을 확인했으며, 이점의 원인을 더 예측 가능한 기울기를 제공하는 매끄러운 손실 곡면으로 설명했습니다. 이를 통해 옵티마이저는 더 크고 안정적인 단계를 취할 수 있습니다. 사전 활성값을 평균 0, 분산 1에 가깝게 유지하면 포화 활성화 함수가 평탄한 영역에 들어가는 것도 방지되어 기울기 소실 문제를 완화하는 데 도움이 됩니다.
각 예제를 무작위로 추출한 배치의 통계로 정규화하므로, BatchNorm은 약한 정규화 기법으로 작용하는 노이즈도 추가합니다. 원 논문에서는 이 덕분에 일부 경우 드롭아웃이 필요하지 않을 수 있다고 보고했습니다.
한계#
- 작은 배치: 각 장치에 이미지가 적으면 배치 통계에 노이즈가 커집니다. GPU당 이미지가 2개일 때, 각 이미지 안에서 채널 그룹을 대상으로 통계를 계산하는 그룹 정규화는 ResNet-50에서 BatchNorm보다 ImageNet 오류율이 10.6% 낮았습니다.
- 멀티 GPU 학습: 층을 SyncBatchNorm으로 변환하지 않으면 각 GPU는 배치 중 자신에게 할당된 부분의 통계로 정규화합니다. SyncBatchNorm은 추가 통신 비용을 감수하고 장치 전체의 통계를 집계합니다.
- 시퀀스 모델: 가변 길이 시퀀스와 배치에 따라 달라지는 통계는 잘 맞지 않으므로, 트랜스포머는 대신 층 정규화를 사용합니다.
배치 정규화와 관련 용어 비교#
- 데이터 정규화: 전처리 중 픽셀 값을 255로 나누는 것처럼 원시 입력을 한 번 재조정합니다. BatchNorm은 모든 층과 학습 단계에서 중간 활성값을 정규화합니다.
- 층 정규화: 각 예제의 특성 전체를 대상으로 정규화하므로 학습과 추론에서 동일하게 동작하며 배치 크기에 영향을 받지 않습니다. 평균을 빼지 않는 더 단순한 변형인 RMSNorm은 대규모 언어 모델에서 널리 사용됩니다.
- 그룹 정규화: 각 이미지의 채널을 그룹으로 나누고 그룹별로 정규화하므로, 작은 배치로 학습하는 탐지 및 세그멘테이션 모델에 적합합니다.
- 인스턴스 정규화: 각 이미지의 각 채널을 따로 정규화하여 이미지별 대비를 제거합니다. 학습과 테스트 모두에서 BatchNorm을 인스턴스 정규화로 바꾸면 빠른 뉴럴 스타일 전이의 품질이 크게 향상되었습니다.










