Adventure Time - Finn 3
본문 바로가기
AI/ML

Weight Initialization : 웨이트 초기화의 중요성

by hyun9_9 2026. 3. 25.

Neural Network를 학습시킬 때 W(가중치)의 초기값을 어떻게 설정하느냐에 따라 학습 성능이 크게 달라집니다.


왜 Weight 초기화가 중요할까?

경사 하강법으로 학습할 때 W는 Loss가 가장 낮은 지점을 향해 이동합니다.
이때 어디서 출발하느냐(초기 W값) 에 따라 도달하는 지점이 달라집니다.

Loss
  ↑
  │    Local     Global
  │   Minima     Minima
  │     ↓          ↓
  │  ╲    ╱╲      ╱
  │   ╲  ╱  ╲   ╱
  │    ╲╱    ╲ ╱
  │           ╲╱
  └──────────────────→ W
  • Global Minima : Loss가 가장 낮은 진짜 최솟값 → 목표 지점
  • Local Minima : 주변보다는 낮지만 전체 최솟값은 아닌 지점 → 여기 빠지면 학습이 잘 안됨
  • Saddle Point : 어떤 방향에서는 최솟값, 다른 방향에서는 최댓값인 지점 → 학습이 멈춰버림

초기 W값을 잘 설정하면 Global Minima에 빠르게 도달할 수 있고,
잘못 설정하면 Local Minima나 Saddle Point에 빠져 학습이 제대로 되지 않습니다.


기존 방법 : Random Normal

weight_init = tf.keras.initializers.RandomNormal()

평균 0, 분산 1인 가우시안 분포에서 랜덤하게 W를 초기화합니다.
단순하지만 네트워크가 깊어질수록 불안정해질 수 있습니다.


Xavier (자비어) 초기화

variance = 2 / (fan_in + fan_out)
  • fan_in : 입력 노드 수
  • fan_out : 출력 노드 수

입력과 출력 노드 수에 기반해 분산을 설정하는 방법입니다.
랜덤 초기화보다 안정적인 출발점을 제공합니다.

# Xavier 사용
kernel_initializer='glorot_normal'   # 정규분포 기반
kernel_initializer='glorot_uniform'  # 균등분포 기반

Sigmoid나 tanh 활성화 함수와 함께 사용할 때 효과적입니다.


He (히) 초기화

variance = 4 / (fan_in + fan_out)

ReLU 활성화 함수에 특화된 방법으로, Xavier 초기화보다 분산을 2배 크게 설정합니다.
ReLU는 음수 구간에서 0을 출력하기 때문에 분산이 절반으로 줄어드는 특성이 있어, 이를 보완하기 위해 2배로 설정합니다.

# He 사용
kernel_initializer='he_normal'    # 정규분포 기반
kernel_initializer='he_uniform'   # 균등분포 기반

ReLU 활성화 함수와 함께 사용할 때 효과적입니다.


코드에 적용하기

기존 코드에서 dense 함수의 kernel_initializer 만 바꿔주면 됩니다.

기존 (Random Normal)

def dense(channel, weight_init):
    return tf.keras.layers.Dense(units=channel, use_bias=True, kernel_initializer=weight_init)

weight_init = tf.keras.initializers.RandomNormal()

Xavier 적용

def dense(channel, weight_init):
    return tf.keras.layers.Dense(units=channel, use_bias=True, kernel_initializer=weight_init)

weight_init = 'glorot_normal'

He 적용 (ReLU와 함께 사용 시 추천)

def dense(channel, weight_init):
    return tf.keras.layers.Dense(units=channel, use_bias=True, kernel_initializer=weight_init)

weight_init = 'he_normal'

활성화 함수별 추천 초기화 방법

활성화 함수 추천 초기화

Sigmoid / tanh Xavier (glorot_normal / glorot_uniform)
ReLU He (he_normal / he_uniform)
없음 Xavier

성능 차이

단순히 Weight 초기화 방법만 바꾸어도 약 10%의 성능 향상을 기대할 수 있습니다.
코드 한 줄만 바꿔서 이 정도 성능을 얻을 수 있다는 점에서 Weight 초기화는 매우 중요합니다.


정리

방법 수식 특징 추천 상황

Random Normal 평균 0, 분산 1 단순하지만 불안정 간단한 테스트
Xavier 2 / (fan_in + fan_out) 안정적인 출발점 Sigmoid / tanh
He 4 / (fan_in + fan_out) Xavier보다 분산 2배 ReLU

좋은 모델을 만들기 위해 알고리즘 구조만큼 Weight 초기화 방법도 신경 써야 합니다. 🚀