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 초기화 방법도 신경 써야 합니다. 🚀
'AI > ML' 카테고리의 다른 글
| CNN : Convolutional Neural Network (0) | 2026.03.29 |
|---|---|
| Dropout : 과적합을 막는 정규화 기법 (0) | 2026.03.25 |
| ReLU로 MNIST 손글씨 분류하기 (TensorFlow) (0) | 2026.03.23 |
| ReLU : Vanishing Gradient 문제와 해결책 (0) | 2026.03.22 |
| XOR 문제 Neural Network로 구현하기 (TensorFlow) (0) | 2026.03.21 |