딥러닝 기초 (6) - 가중치 초기화: Xavier와 He
0 초기화가 왜 안 되는지(대칭성)부터, 초기 스케일이 너무 작거나 크면 신호가 소멸·포화하는 문제, 그리고 활성화에 맞춰 분산을 유지하는 Xavier·He 초기화까지 — 50층 신경망에 흘려 실측한 딥러닝 기초 (6)편입니다.
딥러닝 기초 시리즈의 6편입니다. 전체 목차는 0편에 있습니다. 좋은 옵티마이저(5편)가 있어도 시작점이 나쁘면 학습이 안 됩니다. 이 편은 그 시작점을 다룹니다.
0으로 초기화하면 안 되는 이유
가중치를 어떻게 시작하느냐가 학습의 성패를 가릅니다. 먼저 “그냥 0으로 두면 되지 않나”부터 봅니다. 안 됩니다. 모든 가중치가 0이면 같은 층의 뉴런들이 완전히 똑같은 출력을 내고, 똑같은 기울기를 받아, 똑같이 갱신됩니다. 뉴런이 몇 개든 영원히 한 뉴런처럼 움직입니다(대칭성이 깨지지 않음). 그래서 초기값은 반드시 무작위여야 합니다.
스케일이 문제다
무작위이되, 스케일이 중요합니다. 너무 작으면 층을 지날수록 활성값이 0으로 소멸하고, 너무 크면 2편에서 본 것처럼 tanh·sigmoid가 포화하거나 값이 폭발합니다. 신호가 여러 층을 지나도 분산을 유지해야 합니다. 50층짜리 tanh 신경망에 무작위 입력을 흘려 각 층 활성값의 표준편차를 재보면 차이가 분명합니다.
1
2
3
4
5
6
def propagate(std): # 50층, 폭 256, tanh
x = np.random.randn(1000, 256)
for l in range(50):
W = np.random.randn(256, 256) * std
x = np.tanh(x @ W)
# 층 1, 10, 50에서 x.std()를 기록
| 초기화 | 층 1 | 층 10 | 층 50 |
|---|---|---|---|
std=0.01 (너무 작음) | 0.156 | 0.000 | 0.000 |
Xavier (1/√256≈0.0625) | 0.626 | 0.226 | 0.103 |
std=0.01은 열 층도 못 가 활성값이 0으로 죽습니다. 신호가 사라지니 기울기도 사라져 학습이 안 됩니다. 반면 입력 뉴런 수 n에 맞춰 분산을 잡은 초기화는 깊이 들어가도 신호가 살아 있습니다.
Xavier와 He
핵심은 “층을 지나도 분산이 유지되도록 n에 맞춰 스케일을 잡는다”이고, 활성화에 따라 상수가 다릅니다.
- Xavier(Glorot) 초기화 — 분산을
1/n규모로. tanh·sigmoid처럼 0 근처에서 대칭인 활성화에 맞습니다. - He 초기화 — 분산을
2/n규모로. ReLU는 음수 절반을 0으로 죽이므로, 그만큼 분산을 키워 보정합니다. ReLU 계열의 표준입니다.
기억할 것은 하나입니다. 활성화 함수에 맞는 초기화를 쓴다. ReLU면 He, tanh·sigmoid면 Xavier. 프레임워크는 층을 만들 때 대개 적절한 초기화를 기본으로 적용하지만, 왜 그런지를 알면 학습이 안 될 때 초기화를 의심할 수 있습니다.
정리
| 개념 | 한 줄 요약 |
|---|---|
| 0 초기화 금지 | 대칭성이 안 깨져 모든 뉴런이 한 뉴런처럼 |
| 스케일 | 너무 작으면 소멸, 너무 크면 포화·폭발 |
| Xavier | 분산 1/n. tanh·sigmoid용 |
| He | 분산 2/n. ReLU용 |
초기화로 시작을 잘하고 옵티마이저로 잘 내려가도, 층이 깊어지면 학습 중 각 층의 입력 분포가 계속 흔들립니다. 다음 편은 그 흔들림을 잡는 정규화 계층입니다.