본문 바로가기
C.W.K.
Stream
Lesson 06 of 10 · published

초기화: Xavier와 He

~18 min · init, xavier, he

Level 0호기심
0 XP0/73 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

초기화가 중요한 이유

가중치를 너무 작게 초기화하면 신호가 신경망을 통과하면서 사라지고, 역전파되는 기울기도 함께 사라져. 반대로 너무 크게 초기화하면 신호와 기울기가 폭발해. 적절한 크기로 초기화해야 활성화 분산이 층을 지나도 대략 일정하게 유지되고, 깊은 신경망에서도 기울기의 연쇄 곱이 안정적인 상태를 유지해.

Glorot이라고도 부르는 Xavier 초기화는 std = sqrt(2 / (fan_in + fan_out))를 사용해. Tanh와 시그모이드 활성화에 맞춰 설계됐어. He 초기화는 std = sqrt(2 / fan_in)를 사용해. ReLU는 입력의 절반이 죽기 때문에 이를 보상할 조금 더 큰 가중치가 필요하고, He 초기화는 여기에 맞춰 설계됐어. PyTorch의 nn.Linear 기본값은 He 초기화의 균등분포 변형이야.

팁: PyTorch 기본값은 ReLU와 GELU 신경망에 무난해. 처음으로 맞춤형 층을 만들거나 표준적이지 않은 활성화를 쓴다면 초기화를 명시적으로 재정의해. 그렇지 않으면 기본값이 눈에 띄지 않게 문제를 일으킬 수 있어.

맞춤형 초기화 패턴

기본값과 다른 아키텍처에서는 하나의 init_weights 함수를 작성한 뒤 model.apply(init_weights)로 적용해. 이 메서드는 모듈 트리를 재귀적으로 순회하면서 모든 하위 모듈에 해당 함수를 호출해. Transformer 코드에서 널리 쓰이는 표준 방식이야.

특수한 경우

출력층은 가끔 작은 크기로 초기화해. 예를 들어 Transformer LM 헤드에는 0.02 std를 사용해. 임베딩은 Transformer에서 Normal(0, 0.02)을 사용하고, 단어 임베딩에는 균등분포를 사용해. BatchNorm의 기본값은 γ=1, β=0이야. 일부 방식에서는 잔차 블록의 마지막 BN에 γ=0을 사용해 identity에서 시작하기도 해.

원칙: 초기화는 제대로 작동할 때까지 조정한 뒤에는 건드리지 않는 것 중 하나야. ReLU, GELU, SiLU 신경망에는 He를 쓰고, tanh와 시그모이드에는 Xavier를 써. 나머지는 특별한 이유가 생길 때까지 PyTorch 기본값을 사용해.

Code

ReLU 신경망용 He 초기화·python
import torch.nn as nn
import math

def init_weights(m):
    if isinstance(m, nn.Linear):
        nn.init.kaiming_normal_(m.weight, nonlinearity="relu")
        if m.bias is not None:
            nn.init.zeros_(m.bias)
    elif isinstance(m, nn.Conv2d):
        nn.init.kaiming_normal_(m.weight, nonlinearity="relu")
        if m.bias is not None:
            nn.init.zeros_(m.bias)
    elif isinstance(m, (nn.LayerNorm, nn.BatchNorm2d)):
        nn.init.ones_(m.weight)
        nn.init.zeros_(m.bias)
    elif isinstance(m, nn.Embedding):
        nn.init.normal_(m.weight, mean=0.0, std=0.02)

model = MyModel()
model.apply(init_weights)

External links

Exercise

같은 MLP를 (1) PyTorch 기본값, (2) He 초기화, (3) 의도적으로 나쁜 초기화(std=10)로 각각 학습해. 손실 곡선도 그려. 나쁜 초기화에서는 학습이 되지 않거나 발산해야 해. 초기화가 막아야 하는 문제가 정확히 이것이야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.