가중치 초기화 (Weight Initialization)¶
개요¶
가중치 초기화(Weight Initialization)는 신경망 학습의 시작점을 결정하는 중요한 요소이다. 잘못된 초기화는 기울기 소실(vanishing gradient) 또는 기울기 폭발(exploding gradient)을 유발하여 학습을 불가능하게 만들 수 있다. 좋은 초기화 전략은 각 층의 활성화 분산을 일정하게 유지하여, 기울기가 안정적으로 흐르도록 보장한다.
핵심 개념¶
1. 왜 초기화가 중요한가¶
| 초기화 방법 | 문제점 |
|---|---|
| 모두 0으로 | 모든 뉴런이 동일한 기울기 → 대칭성 문제 (symmetry breaking 실패) |
| 너무 큰 값 | 활성화 폭발 → 기울기 폭발 |
| 너무 작은 값 | 활성화 소실 → 기울기 소실 |
목표: 각 층의 활성화(activation)와 기울기(gradient)의 분산을 적절한 수준으로 유지하는 것이다.
2. Xavier / Glorot 초기화¶
Glorot & Bengio (2010)가 제안한 방법으로, sigmoid나 tanh 같은 대칭 활성화 함수에 적합하다.
정규분포: $\(W \sim \mathcal{N}\left(0, \frac{2}{n_{in} + n_{out}}\right)\)$
균등분포: $\(W \sim U\left(-\sqrt{\frac{6}{n_{in} + n_{out}}}, \sqrt{\frac{6}{n_{in} + n_{out}}}\right)\)$
- \(n_{in}\): 입력 뉴런 수 (fan-in)
- \(n_{out}\): 출력 뉴런 수 (fan-out)
유도 직관: 순전파와 역전파 모두에서 활성화의 분산이 유지되도록 fan-in과 fan-out의 평균을 사용한다. 이는 선형 활성화 가정 하에서 유도되었다.
한계: ReLU에서는 부적합하다. ReLU가 입력의 절반을 0으로 만들기 때문에, 분산이 절반으로 줄어든다.
3. He (Kaiming) 초기화¶
He et al. (2015)이 ReLU 활성화 함수를 위해 제안하였다.
유도 직관: ReLU가 입력의 약 절반을 0으로 만드는 것을 보정하기 위해 분산에 2를 곱한다. fan-out은 사용하지 않고 fan-in만 사용한다.
적합한 활성화: ReLU 및 그 변형 (Leaky ReLU, PReLU 등)
실무에서 가장 널리 사용되는 초기화 방법이다. ReLU가 기본 활성화인 현대 네트워크에서는 He 초기화를 먼저 시도하는 것이 좋다.
4. 직교 초기화 (Orthogonal Initialization)¶
방법: 랜덤 행렬을 생성한 후 SVD(특이값 분해)를 수행하여 직교 행렬을 추출한다.
장점: - 기울기의 노름(norm)이 보존됨 - 순전파와 역전파 시 정보 손실 최소화
사용처: RNN/LSTM의 순환 가중치(recurrent weights)에 특히 유용하다. 순환 가중치가 직교이면 기울기의 노름이 시간 단계를 거쳐도 유지된다.
5. 기타 초기화 기법¶
| 기법 | 설명 | 특징 |
|---|---|---|
| LSUV | 데이터 기반으로 각 층의 분산을 1로 맞춤 | 데이터 의존적, 안정적 |
| Fixup | BatchNorm 없이 깊은 ResNet 학습 가능 | 잔차 블록의 마지막 층을 0으로 초기화 |
| Zero Init (잔차 블록) | 잔차 경로의 마지막 층을 0으로 | 초기에 항등 함수로 시작 |
상세 내용¶
활성화 함수에 따른 초기화 전략¶
flowchart TD
A[가중치 초기화 선택] --> B{활성화 함수?}
B -->|Sigmoid / Tanh| C[Xavier / Glorot]
B -->|ReLU / 변형| D[He / Kaiming]
B -->|RNN 순환 가중치| E[직교 초기화]
B -->|사전 학습 모델| F[사전 학습 가중치 사용]
C --> G["N(0, 2/(n_in + n_out))"]
D --> H["N(0, 2/n_in)"] 초기화에 따른 활성화 분포 변화¶
잘못된 초기화와 올바른 초기화에 따른 층별 활성화 분포를 직관적으로 이해하자:
분산이 너무 작은 경우 (\(W \sim \mathcal{N}(0, 0.01)\)): - 층을 지날수록 활성화 값이 0에 수렴 - 기울기도 함께 소실 → 초기 층 학습 불가
분산이 너무 큰 경우 (\(W \sim \mathcal{N}(0, 1.0)\)): - 층을 지날수록 활성화 값이 폭발 - Sigmoid/Tanh의 포화 영역에 갇힘 → 기울기 소실
적절한 초기화 (Xavier/He): - 층을 지나도 활성화 분포가 일정하게 유지 - 기울기가 안정적으로 흐름 → 효율적 학습
언제 사용하는가¶
| 상황 | 추천 초기화 |
|---|---|
| CNN + ReLU | He 초기화 |
| MLP + Tanh/Sigmoid | Xavier 초기화 |
| RNN 순환 가중치 | 직교 초기화 |
| Transformer | Xavier (PyTorch 기본값으로 충분한 경우 多) |
| ResNet 잔차 블록 | He 초기화 + 마지막 BN의 \(\gamma=0\) |
| Fine-tuning | 사전 학습 가중치 사용 (초기화 불필요) |
| BatchNorm 없는 깊은 네트워크 | Fixup 또는 LSUV |
흔한 오해와 함정¶
-
"초기화는 별로 중요하지 않다": BatchNorm이 초기화에 대한 민감도를 줄여주지만, 초기화가 나쁘면 학습 초기 몇 에폭의 비효율이 생기고, BatchNorm 없는 네트워크에서는 학습 자체가 실패할 수 있다.
-
"사전 학습 모델에서 초기화가 중요하다": 전이 학습에서는 사전 학습된 가중치가 초기화 역할을 하므로, 별도의 초기화 전략보다 사전 학습 가중치를 유지하는 것이 중요하다. 새로 추가한 층에만 적절한 초기화가 필요하다.
-
모든 층에 같은 초기화를 사용: 활성화 함수가 층마다 다른 경우 (예: 은닉층은 ReLU, 출력층은 sigmoid), 각 층에 맞는 초기화를 사용해야 한다.
-
편향(bias) 초기화 무시: 편향은 보통 0으로 초기화하면 충분하다. 그러나 ReLU에서 약간의 양수(0.01)로 초기화하면 dying ReLU를 예방하는 데 도움이 될 수 있다 (논란 있음).