밑바닥부터 시작하는 딥러닝 1 - 초깃값 심화
신경망 학습은 가중치를 조금씩 고쳐가는 과정이다. 그런데 시작점이 나쁘면 아무리 좋은 학습 루프를 만들어도 신호가 잘 흐르지 않거나, 모든 뉴런이 비슷한 일만 하게 된다.
이번 글은 초깃값을 단순히 '랜덤으로 둔다'에서 멈추지 않고, 왜 0이면 안 되는지와 왜 활성화 함수에 따라 Xavier와 He 초깃값을 다르게 쓰는지까지 정리한다.
이번 글에서 잡을 것
- 모든 가중치를 0으로 두면 여러 뉴런이 같은 값으로 갱신되어 대칭성이 깨지지 않는다.
- 초깃값이 너무 크면 활성화값이 극단으로 몰려 기울기 흐름이 약해질 수 있다.
- 초깃값이 너무 작으면 여러 뉴런의 출력이 비슷해져 표현력이 줄어든다.
- Sigmoid/tanh 계열에는 Xavier, ReLU 계열에는 He 초깃값이 자주 쓰인다.
가중치를 모두 0으로 두면 무슨 일이 생기나
은닉층 뉴런이 여러 개 있어도 같은 입력을 받고 같은 가중치에서 시작하면 같은 출력을 낸다. 역전파 때도 같은 기울기를 받아 같은 방식으로 갱신된다. 그러면 뉴런을 여러 개 둔 의미가 줄어든다.
| 상태 | 뉴런 1 | 뉴런 2 | 문제 |
|---|---|---|---|
| 초기 | W=0 | W=0 | 출발점이 같음 |
| 순전파 | 같은 출력 | 같은 출력 | 역할 분리가 안 됨 |
| 역전파 | 같은 기울기 | 같은 기울기 | 같이 갱신됨 |
| 결과 | 같은 특징 학습 | 같은 특징 학습 | 여러 뉴런의 장점 감소 |
import numpy as np
x = np.array([1.0, 2.0])
W_zero = np.zeros((2, 3))
print(np.dot(x, W_zero))
예상 출력
[0. 0. 0.]
초깃값이 너무 크거나 작을 때
초깃값은 단순히 작을수록 좋은 값이 아니다. 너무 크면 시그모이드 출력이 0이나 1 근처로 몰리고, 너무 작으면 출력이 비슷비슷해진다. 둘 다 학습에 좋지 않다.
| 초깃값 상태 | 활성화값 분포 | 문제 |
|---|---|---|
| 너무 큼 | 0 또는 1 근처 | 기울기 소실 가능 |
| 너무 작음 | 중앙 근처에 몰림 | 뉴런들이 비슷한 표현만 만듦 |
| 적절함 | 넓게 퍼짐 | 다양한 특징을 학습하기 쉬움 |
읽는 기준
좋은 초깃값은 값이 크냐 작냐 하나로 결정되지 않는다. 층을 지날 때 신호 분포가 너무 찌그러지지 않게 유지하는 것이 핵심이다.
Xavier와 He를 나누는 기준
Xavier와 He 초깃값은 활성화 함수의 성격에 맞춰 신호 분산을 유지하려는 기준이다. Sigmoid나 tanh처럼 양쪽으로 눌리는 함수와 ReLU처럼 음수 절반을 0으로 막는 함수는 필요한 초기 분포가 다르다.
| 초깃값 | 주로 맞는 활성화 함수 | 표준편차 기준 | 이유 |
|---|---|---|---|
| Xavier | Sigmoid, tanh | 약 1/sqrt(n) | 앞 층 노드 수를 고려해 신호 크기 유지 |
| He | ReLU | 약 sqrt(2/n) | ReLU가 음수 영역을 막는 점을 보정 |
코드에서는 어떻게 보이나
import numpy as np
n = 100 # 앞 층 노드 수
W_xavier = np.random.randn(n, 50) / np.sqrt(n)
W_he = np.random.randn(n, 50) * np.sqrt(2.0 / n)
print(W_xavier.shape)
print(W_he.shape)
관찰 포인트
두 코드 모두 shape는 같지만 난수의 스케일이 다르다. 초깃값 전략은 구조를 바꾸는 것이 아니라 시작 분포를 바꾸는 일이다.
초깃값을 볼 때 출력 분포를 함께 본다
초깃값을 정했다면 가중치 자체만 볼 것이 아니라, 그 가중치를 통과한 활성화값이 어떻게 퍼지는지를 봐야 한다. 값이 한쪽으로 몰리면 앞 층으로 돌아가는 기울기도 약해질 수 있다.
| 확인 대상 | 좋지 않은 신호 | 좋은 신호 |
|---|---|---|
| 가중치 값 | 전부 같거나 0 | 작지만 서로 다른 난수 |
| 은닉층 활성화값 | 0/1 근처 또는 0.5 근처로 몰림 | 적당히 넓게 퍼짐 |
| 역전파 기울기 | 앞 층으로 갈수록 거의 0 | 층을 지나도 너무 죽지 않음 |
이 글에서 가져갈 판단 기준
| 질문 | 답 |
|---|---|
| 왜 0으로 초기화하면 안 되나 | 뉴런들이 같은 일을 하며 대칭성이 깨지지 않기 때문 |
| 왜 랜덤이어야 하나 | 뉴런마다 다른 출발점을 주기 위해 |
| 왜 Xavier/He가 나뉘나 | 활성화 함수가 신호를 통과시키는 방식이 다르기 때문 |
스스로 점검
- 모든 가중치를 0으로 초기화하면 왜 여러 뉴런이 같은 일을 하게 되는지 설명할 수 있는가?
- 초깃값이 너무 큰 경우와 너무 작은 경우의 문제를 구분할 수 있는가?
- Xavier와 He 초깃값을 활성화 함수 기준으로 연결할 수 있는가?
이번 글에서 기억할 것
- 모든 가중치를 0으로 두면 여러 뉴런이 같은 값으로 갱신되어 대칭성이 깨지지 않는다.
- 초깃값이 너무 크면 활성화값이 극단으로 몰려 기울기 흐름이 약해질 수 있다.
- 초깃값이 너무 작으면 여러 뉴런의 출력이 비슷해져 표현력이 줄어든다.
- Sigmoid/tanh 계열에는 Xavier, ReLU 계열에는 He 초깃값이 자주 쓰인다.
다음 글로 이어지는 질문
다음 글에서는 시작 분포를 잘 고르는 것을 넘어, 학습 중간의 데이터 분포를 직접 맞추는 Batch Normalization을 본다.
한 줄 정리: 가중치 초깃값은 단순한 시작 숫자가 아니라, 층을 지나는 신호가 사라지거나 한쪽으로 몰리지 않도록 잡는 출발 분포다.