콘텐츠로 이동

가중치 초기화 (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 활성화 함수를 위해 제안하였다.

\[W \sim \mathcal{N}\left(0, \frac{2}{n_{in}}\right)\]

유도 직관: 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

흔한 오해와 함정

  1. "초기화는 별로 중요하지 않다": BatchNorm이 초기화에 대한 민감도를 줄여주지만, 초기화가 나쁘면 학습 초기 몇 에폭의 비효율이 생기고, BatchNorm 없는 네트워크에서는 학습 자체가 실패할 수 있다.

  2. "사전 학습 모델에서 초기화가 중요하다": 전이 학습에서는 사전 학습된 가중치가 초기화 역할을 하므로, 별도의 초기화 전략보다 사전 학습 가중치를 유지하는 것이 중요하다. 새로 추가한 층에만 적절한 초기화가 필요하다.

  3. 모든 층에 같은 초기화를 사용: 활성화 함수가 층마다 다른 경우 (예: 은닉층은 ReLU, 출력층은 sigmoid), 각 층에 맞는 초기화를 사용해야 한다.

  4. 편향(bias) 초기화 무시: 편향은 보통 0으로 초기화하면 충분하다. 그러나 ReLU에서 약간의 양수(0.01)로 초기화하면 dying ReLU를 예방하는 데 도움이 될 수 있다 (논란 있음).


다른 주제와의 연결

  • 활성화 함수: 활성화 함수에 따라 초기화 전략이 달라짐
  • 역전파: 기울기 흐름의 안정성과 직접 연관
  • 정규화: BatchNorm이 초기화에 대한 민감도를 줄여줌
  • RNN/LSTM/GRU: 직교 초기화의 주요 사용처
  • 전이 학습: 사전 학습 가중치가 초기화를 대체
  • CNN: ResNet에서의 초기화 전략