초기화가 중요한 이유
가중치를 너무 작게 초기화하면 신호가 신경망을 통과하면서 사라지고, 역전파되는 기울기도 함께 사라져. 반대로 너무 크게 초기화하면 신호와 기울기가 폭발해. 적절한 크기로 초기화해야 활성화 분산이 층을 지나도 대략 일정하게 유지되고, 깊은 신경망에서도 기울기의 연쇄 곱이 안정적인 상태를 유지해.
Glorot이라고도 부르는 Xavier 초기화는 std = sqrt(2 / (fan_in + fan_out))를 사용해. Tanh와 시그모이드 활성화에 맞춰 설계됐어. He 초기화는 std = sqrt(2 / fan_in)를 사용해. ReLU는 입력의 절반이 죽기 때문에 이를 보상할 조금 더 큰 가중치가 필요하고, He 초기화는 여기에 맞춰 설계됐어. PyTorch의 nn.Linear 기본값은 He 초기화의 균등분포 변형이야.
맞춤형 초기화 패턴
기본값과 다른 아키텍처에서는 하나의 init_weights 함수를 작성한 뒤 model.apply(init_weights)로 적용해. 이 메서드는 모듈 트리를 재귀적으로 순회하면서 모든 하위 모듈에 해당 함수를 호출해. Transformer 코드에서 널리 쓰이는 표준 방식이야.
특수한 경우
출력층은 가끔 작은 크기로 초기화해. 예를 들어 Transformer LM 헤드에는 0.02 std를 사용해. 임베딩은 Transformer에서 Normal(0, 0.02)을 사용하고, 단어 임베딩에는 균등분포를 사용해. BatchNorm의 기본값은 γ=1, β=0이야. 일부 방식에서는 잔차 블록의 마지막 BN에 γ=0을 사용해 identity에서 시작하기도 해.