핵심 기법 · 3
배치 정규화
배치 정규화 — Ioffe & Szegedy, 2015 — 는 각 feature 를 배치 전체에 걸쳐 평균 0, 분산 1 로 정규화한다. 덕분에 더 깊은 망을 더 큰 학습률로 학습할 수 있다. dropout 처럼 train 과 eval 모드에서 다르게 동작한다: eval 에서는 눈앞의 배치가 아니라 누적된 고정 running 통계를 쓴다 — 그걸 헷갈리는 게 고전적 버그다. 아래 모든 것은 이 페이지에서, 양 언어로 돈다.
배치를 평균 0, 분산 1 로
feature 마다 큰 평균과 퍼짐을 가진 배치를 준다. 학습 모드에서는 각 feature 의 배치 평균을 빼고 배치 표준편차로 나누므로, 출력의 모든 열이 중심화되고 스케일된다.
train 은 배치를, eval 은 running 통계를
학습 모드에서 한 행의 출력은 같은 배치의 다른 행들에 의존한다 — 같은 query 를 다른 배치에 대해 정규화하면 다른 답이 나온다. eval 모드에서는 누적한 running 통계(여기서는 아직 기본값, 평균 0·분산 1)를 쓰므로, 어느 배치에 들어 있는지가 더는 상관없다.
직접: 안정된 답에는 eval() 이 필요하다
이 블록은 같은 query 행을 두 다른 배치에 통과시키고 답이 얼마나 움직이는지 보고한다.
추론에서는 그 값이 0 이어야 한다 — 어떤 배치에 우연히 끼었는지가 예측을 바꾸면 안 된다.
층을 eval() 로 바꿔라.
전과 후, 그려보기
크고 들쭉날쭉한 열 평균을 가진 배치가 들어가(위) 중심화·스케일되어 나온다(아래). 배치 정규화가 열을 고르게 만들어 다음 층이 얌전한 분포를 보게 한다.
기억할 것
- 배치 정규화는 각 feature 를 배치 전체로 평균 0·분산 1 로 정규화한다.
- 더 깊은 망을 더 큰 학습률로 학습하게 해준다.
train은 배치 자신의 통계를,eval은 고정 running 통계를 쓴다 — 추론에서 한 샘플의 답이 배치에 의존하면 안 된다.- borch 에서는
nn.BatchNorm1d/2d,train()/eval()로 전환.