🎯 왜 초기화가 중요한가?

딥러닝 모델은 학습을 시작하기 전 모든 가중치를 무작위로 초기화합니다.
이 시작점이 너무 작거나 너무 크면 학습이 비효율적이거나 아예 실패할 수 있습니다.

똑같은 모델, 똑같은 데이터라도
가중치 초기값에 따라 성능이 크게 달라지는 경우가 많습니다.


⚠️ 잘못된 초기화가 초래하는 문제

  1. Vanishing Gradient (기울기 소실)
    • 작은 값으로 초기화하면, 역전파 시 gradient가 계속 작아져 → 학습 불가
  2. Exploding Gradient (기울기 폭발)
    • 너무 큰 값으로 초기화하면 gradient가 점점 커져 → 발산
  3. Symmetry Breaking 실패
    • 모든 가중치를 0 또는 같은 값으로 초기화하면,
      각 뉴런이 같은 학습을 반복 → 비효율적

⚙️ 주요 초기화 전략

초기화 방법설명사용 시점
Random Normal / Uniform 기본적인 무작위 값 단순 MLP 등
Xavier (Glorot) Initialization 입력과 출력의 수에 기반한 분산 제어 Sigmoid, Tanh 계열
He Initialization ReLU 계열 활성 함수에 최적화 CNN, DNN 대부분
LeCun Initialization SELU 등에 적합 특수 비선형 모델
Orthogonal Initialization 직교 행렬 기반 → 폭발/소실 방지 RNN, GAN
 

🧪 실습 예시 (PyTorch)

import torch
import torch.nn as nn
import torch.nn.functional as F

# 간단한 MLP 모델 정의
class SimpleMLP(nn.Module):
    def __init__(self):
        super(SimpleMLP, self).__init__()
        self.fc1 = nn.Linear(784, 256)
        self.fc2 = nn.Linear(256, 128)
        self.fc3 = nn.Linear(128, 10)
        self.init_weights()

    def init_weights(self):
        # He Initialization (ReLU에 적합)
        nn.init.kaiming_normal_(self.fc1.weight, nonlinearity='relu')
        nn.init.kaiming_normal_(self.fc2.weight, nonlinearity='relu')
        nn.init.kaiming_normal_(self.fc3.weight, nonlinearity='relu')

    def forward(self, x):
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        return self.fc3(x)

model = SimpleMLP()
print(model)
 

✅ 위 예시에서는 kaiming_normal_을 사용해 ReLU에 적합한 He 초기화를 적용했습니다.
초기화를 바꿔가며 성능 비교 실험을 해보는 것도 실전에서 매우 중요합니다.


📌 정리 포인트

  • 가중치 초기화는 모델의 학습 시작 지점을 결정함
  • 적절하지 않은 초기화는 학습 자체를 망칠 수 있음
  • 활성 함수와 모델 구조에 따라 맞는 초기화 전략을 선택해야 함
  • 실전에서는 대부분 He (ReLU용) 또는 Xavier (Tanh/Sigmoid용)를 사용

+ Recent posts