밑바닥부터 시작하는 딥러닝 1 - BatchNorm 심화
초깃값은 학습 시작 시점의 분포를 다룬다. 배치 정규화(Batch Normalization)는 한 걸음 더 나아가 학습 중간에 각 층으로 들어가는 값의 분포를 직접 조정한다.
이번 글은 BatchNorm을 '학습을 빠르게 한다'는 효과만 외우지 않고, 미니배치 평균과 분산으로 무엇을 바꾸는지, 왜 다시 gamma와 beta를 두는지까지 정리한다.
이번 글에서 잡을 것
- BatchNorm은 미니배치 단위로 평균과 분산을 계산한다.
- 입력값을 평균 0, 분산 1에 가깝게 정규화한다.
- 정규화만 하면 표현이 너무 제한될 수 있으므로 gamma와 beta로 다시 확대/이동한다.
- 초깃값 의존을 줄이고 학습을 안정적으로 만드는 데 도움을 준다.
BatchNorm이 끼어드는 위치
보통 BatchNorm은 Affine 계층과 활성화 함수 사이 또는 활성화 함수 주변에 들어간다. 핵심은 다음 층으로 넘어가기 전에 값의 분포가 지나치게 치우치지 않도록 조정하는 것이다.
작은 숫자로 정규화 과정을 보기
입력값이 `[1, 2, 3]`이라면 평균은 2이고 분산은 약 0.667이다. 각 값에서 평균을 빼고 표준편차로 나누면 중앙은 0 근처가 되고 양쪽 값은 대칭적으로 벌어진다.
| x | x - 평균 | 정규화 후 대략 |
|---|---|---|
| 1 | -1 | -1.225 |
| 2 | 0 | 0 |
| 3 | 1 | 1.225 |
import numpy as np
x = np.array([1.0, 2.0, 3.0])
mu = np.mean(x)
var = np.var(x)
x_hat = (x - mu) / np.sqrt(var + 1e-7)
print(mu)
print(round(var, 3))
print(np.round(x_hat, 3))
왜 gamma와 beta가 필요한가
정규화만 하면 모든 층의 값이 강제로 평균 0, 분산 1 근처에 묶인다. 그런데 어떤 층은 그보다 더 크게 벌어진 값이나, 조금 이동된 값이 필요할 수 있다. 그래서 BatchNorm은 정규화한 뒤 `gamma * x_hat + beta`를 적용한다.
| 값 | 역할 | 처음 값 |
|---|---|---|
| x_hat | 정규화된 값 | 평균 0, 분산 1 근처 |
| gamma | 확대/축소 | 1 |
| beta | 이동 | 0 |
| y | 최종 출력 | gamma*x_hat + beta |
핵심
BatchNorm은 분포를 강제로 맞추되, 필요한 표현까지 없애지 않기 위해 gamma와 beta를 학습한다.
gamma와 beta를 숫자로 적용해보기
정규화된 값 `[-1.225, 0, 1.225]`에 gamma=2, beta=0.5를 적용하면 값의 폭은 2배가 되고 전체 위치는 0.5만큼 이동한다.
import numpy as np
x_hat = np.array([-1.225, 0.0, 1.225])
gamma = 2.0
beta = 0.5
y = gamma * x_hat + beta
print(np.round(y, 3))
예상 출력
[-1.95 0.5 2.95]
| 단계 | 값 | 의미 |
|---|---|---|
| x_hat | [-1.225, 0, 1.225] | 평균 0 근처로 정리된 값 |
| gamma=2 | 폭 2배 | 표현 범위를 다시 넓힘 |
| beta=0.5 | 전체 0.5 이동 | 필요한 기준점으로 위치 조정 |
훈련과 추론의 차이
훈련 중에는 현재 미니배치의 평균과 분산을 쓴다. 하지만 추론 때는 미니배치가 매번 달라지면 출력도 흔들릴 수 있다. 그래서 학습 중 누적해둔 이동 평균 통계를 사용한다.
| 단계 | 사용하는 평균/분산 | 이유 |
|---|---|---|
| 훈련 | 현재 미니배치 통계 | 학습 데이터 흐름에 맞춰 정규화 |
| 추론 | 학습 중 누적한 통계 | 입력 1개가 들어와도 안정적인 출력 |
스스로 점검
- BatchNorm이 평균과 분산을 어떤 단위로 계산하는지 말할 수 있는가?
- 정규화 후 gamma와 beta를 다시 두는 이유를 설명할 수 있는가?
- 훈련 때와 추론 때 BatchNorm이 다른 통계를 쓰는 이유를 말할 수 있는가?
이번 글에서 기억할 것
- BatchNorm은 미니배치 단위로 평균과 분산을 계산한다.
- 입력값을 평균 0, 분산 1에 가깝게 정규화한다.
- 정규화만 하면 표현이 너무 제한될 수 있으므로 gamma와 beta로 다시 확대/이동한다.
- 초깃값 의존을 줄이고 학습을 안정적으로 만드는 데 도움을 준다.
다음 글로 이어지는 질문
다음 글에서는 모델이 훈련 데이터에만 맞춰지는 과대적합을 막기 위해 Dropout과 검증 데이터를 본다.
한 줄 정리: BatchNorm은 층 사이의 값 분포를 정리하되, gamma와 beta를 통해 필요한 표현력은 다시 학습하게 만드는 장치다.