본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] 가중치 초기화(Weight Initialization) 전략 2가지 : Xavier와 He가 수렴 속도에 미치는 영향과 해결 방법

by Papa Martino V 2026. 4. 18.
728x90

가중치 초기화(Weight Initialization)
가중치 초기화 (Weight Initialization)

 

딥러닝 모델을 설계할 때 층(Layer)을 깊게 쌓는 것만큼 중요한 것이 바로 초기 상태 설정입니다. 많은 초보 개발자들이 모델의 구조나 옵티마이저 선택에는 공을 들이지만, 정작 가중치 초기값(Weight Initialization)이 학습의 성패를 가른다는 사실을 간과하곤 합니다. 가중치를 단순히 0이나 무작위 상수로 초기화하면, 층이 깊어질수록 그래디언트 소실(Vanishing Gradient) 혹은 폭주(Exploding Gradient) 현상이 발생하여 학습이 아예 시작되지 않을 수도 있습니다. 본 포스팅에서는 현대 딥러닝의 표준인 Xavier(Glorot)He(Kaiming) 초기화 전략의 수학적 차이를 분석하고, 활성화 함수와의 상관관계를 통해 초기 수렴 속도를 극대화하는 7가지 실전 구현 예시를 제시합니다.


1. Xavier vs He: 활성화 함수에 따른 초기화 전략의 핵심 차이

가중치 초기화의 목적은 출력값의 분산을 입력값의 분산과 일정하게 유지하여, 역전파 시 그래디언트가 모든 층에 골고루 전달되도록 하는 것입니다.

항목 Xavier 초기화 (Glorot) He 초기화 (Kaiming) 성능 해결 포인트
제안 시점 2010년 (AISTATS) 2015년 (ICCV) ReLU 기반 신경망 최적화
적합한 활성화 함수 Sigmoid, Tanh, Softmax ReLU, LeakyReLU, ELU 함수 특성에 따른 분산 보정
핵심 수식 (분산) $Var(W) = \frac{2}{n_{in} + n_{out}}$ $Var(W) = \frac{2}{n_{in}}$ ReLU의 반쪽 상쇄 보정(2배)
수렴 속도 영향 초기 안정성 위주 깊은 망에서 매우 빠름 초기 학습 병목 현상 제거

2. 실무 딥러닝 모델 최적화를 위한 가중치 초기화 패턴 (7 Examples)

파이썬 PyTorch 프레임워크의 torch.nn.init 모듈을 활용하여 실제 실무 아키텍처에서 즉시 적용할 수 있는 7가지 고도화된 해결 예시입니다.

Example 1: CNN 레이어에 He 초기화(Kaiming Normal) 적용 방법

ReLU를 사용하는 합성곱 신경망(CNN)에서 가장 권장되는 초기화 방식입니다.

import torch
import torch.nn as nn
import torch.nn.init as init

class HeModel(nn.Module):
    def __init__(self):
        super(HeModel, self).__init__()
        self.conv = nn.Conv2d(3, 64, kernel_size=3)
        # ReLU에 최적화된 He 초기화 적용
        init.kaiming_normal_(self.conv.weight, mode='fan_out', nonlinearity='relu')

model = HeModel()

Example 2: MLP(다층 퍼셉트론)에서 Xavier Uniform 초기화 적용

Sigmoid나 Tanh를 출력층 혹은 은닉층에 사용할 때 수치적 안정성을 확보하는 해결책입니다.

def init_weights_xavier(m):
    if isinstance(m, nn.Linear):
        # Tanh 계열 활성화 함수에 최적화
        init.xavier_uniform_(m.weight)
        if m.bias is not None:
            init.zeros_(m.bias)

model = nn.Sequential(nn.Linear(784, 256), nn.Tanh(), nn.Linear(256, 10))
model.apply(init_weights_xavier)

Example 3: LeakyReLU를 위한 보정 계수(Gain) 포함 초기화

활성화 함수의 기울기가 1이 아닌 경우(LeakyReLU 등) Gain 값을 계산하여 분산을 맞추는 방법입니다.

# LeakyReLU의 음수 기울기(negative_slope)를 고려한 Gain 계산
gain = init.calculate_gain('leaky_relu', 0.01)
layer = nn.Linear(100, 100)
init.kaiming_normal_(layer.weight, a=0.01, nonlinearity='leaky_relu')

Example 4: RNN/LSTM의 직교 초기화(Orthogonal Initialization) 해결 방법

순환 신경망에서 그래디언트 폭주를 막기 위해 가중치 행렬을 직교 행렬로 초기화하는 기법입니다.

rnn = nn.RNN(input_size=10, hidden_size=20, num_layers=2)
for name, param in rnn.named_parameters():
    if 'weight' in name:
        # 순환 신경망의 은닉 상태 전이에 유리
        init.orthogonal_(param)

Example 5: 특정 레이어 그룹별 커스텀 초기화 루프 설계

모델 내의 레이어 타입에 따라 Xavier와 He를 혼합하여 적용하는 실무적인 해결 패턴입니다.

def custom_init(m):
    if isinstance(m, nn.Conv2d):
        init.kaiming_normal_(m.weight, nonlinearity='relu')
    elif isinstance(m, nn.Linear):
        if m.out_features == 10: # 최종 출력층
            init.xavier_normal_(m.weight)
        else:
            init.kaiming_normal_(m.weight)

model.apply(custom_init)

Example 6: 가중치 초기화 직후 레이어별 활성화 값 분산 모니터링

초기화가 정상적으로 이루어졌는지 확인하기 위해 첫 번째 순전파 후 텐서 통계량을 출력하는 해결책입니다.

input_data = torch.randn(1, 3, 224, 224)
x = input_data
for layer in model:
    x = layer(x)
    print(f"Layer: {layer.__class__.__name__}, Mean: {x.mean().item():.4f}, Std: {x.std().item():.4f}")
# Std가 0에 가깝거나 너무 크면 초기화 전략 수정 필요

Example 7: Batch Normalization 레이어의 초기값 해결

배치 정규화 층은 가중치 초기화와 상호작용하므로 감마(Scale)와 베타(Shift) 값을 적절히 설정해야 합니다.

bn = nn.BatchNorm2d(64)
# 감마는 1, 베타는 0으로 시작하는 것이 표준
init.ones_(bn.weight)
init.zeros_(bn.bias)

3. 초기 수렴 속도를 결정짓는 3가지 물리적 원칙

가중치 초기화가 성공적으로 작동하려면 다음의 3가지 메커니즘이 조화를 이루어야 합니다.

  • 분산 보존(Variance Preservation): 데이터가 층을 통과할 때 값이 너무 작아지거나 커지지 않도록 $Var(y) \approx Var(x)$를 유지해야 합니다.
  • 대칭 파괴(Symmetry Breaking): 모든 가중치가 동일한 값(예: 0)으로 시작하면 모든 뉴런이 동일한 그래디언트를 업데이트받아 하나의 뉴런처럼 동작하게 됩니다. 무작위성을 부여하여 이를 방지해야 합니다.
  • 활성화 함수와의 조화: ReLU는 출력의 절반을 0으로 만듭니다. 이를 보정하기 위해 He 초기화는 Xavier보다 분산을 2배 더 크게 설정합니다.

4. 결론: 왜 실무자는 He 초기화를 기본값으로 사용하는가?

현대 딥러닝 아키텍처(ResNet, EfficientNet 등)의 90% 이상은 ReLU 혹은 그 변형(Swish, GeLU)을 활성화 함수로 채택하고 있습니다. 따라서 He 초기화는 사실상 표준으로 자리 잡았습니다. 초기 수렴 속도에서 He 초기화는 Xavier 대비 깊은 망에서 최대 5~10배 이상의 빠른 손실(Loss) 감소를 보여줍니다. 여러분의 모델이 학습 초기에 정체되어 있다면, 가장 먼저 가중치 초기화 코드를 점검해 보시기 바랍니다.

 

전문 지식 출처 및 참조:

  • Glorot, X., & Bengio, Y. (2010). "Understanding the difficulty of training deep feedforward neural networks."
  • He, K., et al. (2015). "Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification."
  • PyTorch Official Documentation: "torch.nn.init" (2026 Edition)
  • CS231n: Convolutional Neural Networks for Visual Recognition - Lecture 6.
728x90