층마다 입력 분포가 계속 흔들린다
신경망을 학습시키다 보면, 앞쪽 층의 가중치가 업데이트될 때마다 그 다음 층으로 들어오는 입력의 분포(평균·범위)도 함께 흔들린다. 각 층은 매번 달라지는 입력 분포에 다시 적응해야 하므로 학습이 느려지고 불안정해질 수 있다. Batch Normalization(BN)은 각 층의 입력을 미니배치 단위로 정규화해 이 흔들림을 줄이는 기법이다.
Batch Normalization이 하는 일
한 미니배치 안에서 각 층의 입력값을 평균 0, 분산 1이 되도록 정규화한 뒤, 학습 가능한 스케일(γ)과 이동(β) 파라미터로 다시 조정한다. 핵심은 손실함수의 “지형(Optimization Landscape)”을 매끄럽게 만들어 기울기가 지나치게 요동치거나 평평해지는 것을 줄이는 데 있다.
기대 효과 | 내용 |
|---|---|
Gradient 흐름 개선 | 입력 분포가 안정되면서 Gradient Vanishing이 완화된다 |
학습 속도 향상 | 손실 지형이 매끄러워져 더 큰 학습률(Learning Rate)을 써도 안정적으로 수렴한다 |
학습 안정성 확보 | 각 층에 들어오는 입력 분포가 일정하게 유지된다 |
정규화(Regularization) 효과 | 미니배치마다 통계가 조금씩 달라지는 것 자체가 노이즈로 작용해 과적합을 어느 정도 줄여준다 |
아래는 Batch Normalization의 효과를 1차원 손실 지형으로 단순화한 비교다. 재생하면 같은 학습률(η = 0.5)로 5번 업데이트했을 때, 정규화 전의 완만한 지형에서는 거의 움직이지 못한 뒤 정규화된 지형에서는 최솟값을 향해 훨씬 크게 이동한다.
두 번째 비교는 학습률을 η = 1.2로 고정한다. 먼저 정규화된 완만한 지형에서 최솟값으로 수렴하고, 이어서 같은 학습률을 가파른 지형에 적용했을 때 최솟값을 번갈아 뛰어넘으며 발산하는 모습을 보여준다.
코드로 정규화 전후 비교하기
평균 50, 표준편차 20 근처에 흩어져 있는 8개의 값을 정규화하면 평균 0, 표준편차 1로 바뀐다. Batch Normalization은 이 계산을 신경망의 각 층 입력에 대해, 미니배치 단위로 매번 수행한다.
import numpy as np
np.random.seed(42)
x = np.random.normal(loc=50, scale=20, size=8) # 한 층에 들어오는 입력 값 8개
mean, std = x.mean(), x.std()
x_norm = (x - mean) / (std + 1e-5) # 1e-5는 분모가 0이 되는 것을 막는 작은 값
print("정규화 전 평균/표준편차:", round(mean, 2), round(std, 2))
print("정규화 후 평균/표준편차:", round(x_norm.mean(), 4), round(x_norm.std(), 4))
정규화 전 평균/표준편차: 61.02 13.73
정규화 후 평균/표준편차: 0.0 1.0
실제 Batch Normalization 레이어는 여기에 학습 가능한 γ(스케일)와 β(이동) 파라미터를 곱하고 더해, “항상 평균 0, 분산 1로 고정”이 아니라 모델이 필요하면 다른 분포로도 조정할 수 있는 여지를 남긴다.
정리
Batch Normalization은 각 층의 입력을 미니배치 단위로 정규화해 학습 중 입력 분포가 계속 바뀌는 문제를 줄인다. 그 결과 기울기가 안정되고, 더 큰 학습률을 쓸 수 있으며, 부수적으로 과적합을 줄이는 효과도 얻는다. ReLU와 함께 깊은 신경망을 안정적으로 학습시키기 위한 기본 구성 요소로 널리 쓰인다.
참고 자료
Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift (Ioffe & Szegedy, ICML 2015) — Batch Normalization 원 논문 (2026-08-07 확인)
torch.nn.BatchNorm1d — PyTorch 공식 문서 — Batch Normalization 레이어의 공식 API (2026-08-07 확인)
댓글 0
댓글을 불러오는 중…