한 줄 정의

배치 정규화(BatchNorm)는 인공 신경망의 각 레이어에 입력되는 미니배치(Mini-batch)의 분포를 정규화하여 학습 속도를 향상시키고 그래디언트(Gradient) 문제(소실/폭주)를 완화하는 기술이다.

핵심 요지

  • 학습 안정화 및 가속: 입력 데이터의 분포가 안정되어 더 큰 학습률(Learning rate)을 사용할 수 있고, 초기 가중치 설정에 덜 민감해진다.
  • 미니배치 통계 의존성: 평균과 분산을 계산할 때 현재 미니배치의 통계량에 의존하므로, 배치 크기가 작거나(예: 배치 크기 1) 시퀀스 길이가 가변적인 작업(NLP 등)에서는 성능이 저하된다.
  • LayerNorm과의 차이: 배치 정규화는 전체 배치(데이터 차원)를 기준으로 정규화하는 반면, 레이어 정규화(레이어 정규화(Layer Normalization))는 단일 토큰/데이터 내의 피처(Feature) 차원 기준으로 개별 정규화하여 서로 독립적으로 동작한다.
  • 자체 규제(Regularization) 효과: 미니배치 노이즈가 모델 학습 과정에 주입되면서 약한 드롭아웃(Dropout) 효과를 내어 오버핏(Overfitting)을 억제한다.

상세

배치 정규화는 2015년 Sergey Ioffe와 Christian Szegedy가 제안한 기법으로, 학습 과정에서 이전 레이어의 가중치 변화로 인해 다음 레이어에 들어오는 입력의 분포가 계속 바뀌는 현상인 내부 공변량 변화(Internal Covariate Shift) 문제를 해결하기 위해 고안되었다. (실제 효과는 내부 공변량 변화의 억제보다는 손실 함수의 곡면(Loss landscape)을 평탄하게 만들어 최적화를 용이하게 한다는 쪽으로 해석되기도 한다.)

동작 메커니즘

배치 정규화는 미니배치 에 대해 다음과 같이 동작한다.

  1. 배치 평균 계산:
  2. 배치 분산 계산:
  3. 정규화: (은 분모가 0이 되는 것을 방지하는 작은 상수)
  4. 스케일 및 시프트(Scale & Shift): (는 모델 학습 중 업데이트되는 파라미터로, 정규화된 값들을 다시 원래 표현력을 유지할 수 있도록 미세조정한다.)

한계점과 레이어 정규화로의 전환

트랜스포머(트랜스포머 아키텍처)와 같은 최신 NLP 모델에서는 배치 정규화 대신 레이어 정규화(레이어 정규화(Layer Normalization))가 주로 사용된다.

  1. 가변 길이 시퀀스: NLP에서는 문장 길이가 제각각이기 때문에, 동일한 배치 내에서도 시퀀스 길이에 따라 배치 차원의 통계가 왜곡될 수 있다.
  2. 배치 크기 민감도: 배치 정규화는 미니배치 통계에 극도로 의존한다. 메모리 제약으로 미니배치 크기를 1이나 매우 작게 설정해야 하는 환경에서는 통계량의 불확실성이 커져 정상적으로 작동하지 않는다. 이에 반해 레이어 정규화는 개별 토큰 벡터 단위로 정규화하므로 배치 크기와 무관하게 안정적이다 Understanding Transformers (Part 5).

예시

파이토치(PyTorch)에서 2D 합성곱 레이어 뒤에 배치 정규화를 적용하는 일반적인 시나리오:

import torch.nn as nn
 
class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, padding=1)
        # 활성화 함수 전, 그리고 특징 차원(out_channels)에 맞추어 BatchNorm2d 적용
        self.bn1 = nn.BatchNorm2d(num_features=16)
        self.relu = nn.ReLU()
 
    def forward(self, x):
        x = self.conv1(x)
        x = self.bn1(x)  # 미니배치 단위로 채널별 정규화 수행
        x = self.relu(x)
        return x

관련 노트