딥러닝 성능을 좌우하는 가중치 초기화(Weight Initialization): Xavier vs He 방식의 차이점과 완벽 적용 가이드

썸네일

딥러닝 모델을 구축하고 학습시키는 과정은 마치 정교한 건축물을 짓는 것과 같습니다. 우리는 최신 아키텍처를 설계하고, 양질의 데이터를 수집하며, 최적의 하이퍼파라미터를 찾기 위해 수많은 시간을 쏟습니다. 하지만 이 모든 노력에도 불구하고 모델의 손실(Loss) 값이 줄어들지 않거나, 학습 속도가 터무니없이 느린 경우를 종종 마주하게 됩니다. 이때 많은 엔지니어가 간과하는 결정적인 요소가 하나 있습니다. 바로 가중치 초기화(Weight Initialization)입니다.

신경망 학습의 출발점이 되는 초기 가중치를 어떻게 설정하느냐는 단순히 '시작값'을 정하는 문제를 넘어, 학습의 성패를 가르는 핵심적인 역할을 합니다. 잘못된 초기화는 악명 높은 '기울기 소실(Vanishing Gradient)'이나 '기울기 폭주(Exploding Gradient)' 문제를 야기하여 모델을 망가뜨릴 수 있습니다. 반면, 적절한 가중치 초기화 기법의 적용은 학습 수렴 속도를 비약적으로 향상시키고 전역 최적점(Global Minimum)에 도달할 확률을 높여줍니다.

본 포스팅에서는 딥러닝 분야에서 가장 널리 사용되는 두 가지 표준 초기화 기법인 Xavier 초기화(Glorot Initialization)He 초기화(Kaiming Initialization)를 심층적으로 분석합니다. 각 기법의 탄생 배경과 수학적 원리, 그리고 실제 프로젝트에서 활성화 함수(Activation Function)에 따라 어떤 방식을 선택해야 하는지 명확한 가이드라인을 제시해 드리겠습니다.


1. 가중치 초기화, 왜 0이나 랜덤으로 하면 안 될까?

Xavier와 He 초기화를 논하기 전에, 왜 우리가 특별한 초기화 전략을 사용해야 하는지 그 근본적인 이유를 이해해야 합니다. 딥러닝 입문자들이 가장 흔하게 범하는 실수는 가중치를 0으로 초기화하거나, 아무런 규칙 없는 무작위 값으로 채우는 것입니다.

대칭성 파괴(Symmetry Breaking)의 실패: 0으로 초기화할 경우

만약 신경망의 모든 가중치를 0으로 설정한다면 어떤 일이 벌어질까요? 입력 데이터가 네트워크를 통과할 때, 은닉층의 모든 뉴런은 동일한 연산을 수행하게 됩니다. 결과적으로 역전파(Backpropagation) 과정에서 모든 뉴런이 동일한 기울기(Gradient) 값을 전달받게 되고, 모든 가중치가 똑같은 값으로 업데이트되는 현상이 발생합니다.

이는 아무리 많은 뉴런을 가진 층을 쌓더라도, 실제로는 단 하나의 뉴런이 있는 것과 다를 바 없는 상태가 됨을 의미합니다. 신경망이 다양한 특징(Feature)을 학습하기 위해서는 각 뉴런이 서로 다른 가중치를 가져야 하는데, 이를 '대칭성 파괴'라고 합니다. 0으로 초기화하는 것은 이 대칭성을 깨지 못해 모델의 표현력을 완전히 상실하게 만듭니다.

분산의 불안정성: 단순 무작위 초기화의 함정

그렇다면 가우시안 분포(Gaussian Distribution)를 따르는 임의의 작은 수로 초기화하면 해결될까요? 이 역시 완벽한 해결책은 아닙니다. 가중치가 너무 작게 설정되면 층을 거칠 때마다 신호가 약해져 출력층에 도달할 즈음에는 0에 수렴하게 됩니다(기울기 소실). 반대로 가중치가 너무 크면 신호가 증폭되어 값이 발산하게 됩니다(기울기 폭주).

딥러닝 학습이 안정적으로 이루어지기 위해서는 '입력 데이터의 분산(Variance)이 깊은 층을 통과한 후에도 일정하게 유지되어야 한다'는 조건이 필요합니다. Xavier와 He 초기화는 바로 이 조건을 수학적으로 만족시키기 위해 고안된 기법들입니다.


2. Xavier 초기화 (Glorot Initialization): Sigmoid와 Tanh를 위한 솔루션

2010년, 딥러닝의 대가인 Xavier Glorot과 Yoshua Bengio는 논문을 통해 당시 심층 신경망 학습이 어려웠던 주된 원인이 부적절한 초기화에 있음을 밝혔습니다. 그들은 각 층의 활성화 값(Activation value)들의 분산이 층을 지날 때마다 유지되도록 하는 Xavier 초기화를 제안했습니다.

Xavier 초기화의 핵심 원리

Xavier 초기화의 목표는 이전 층의 노드 수($n{in}$)와 다음 층의 노드 수($n{out}$)를 고려하여 가중치의 분포를 조정하는 것입니다. 이를 통해 전방향(Forward) 패스에서의 출력 분산과 역방향(Backward) 패스에서의 기울기 분산을 최대한 동일하게 유지하려 합니다.

수식적으로, 가중치 $W$는 평균이 0이고 분산이 다음과 같은 분포에서 샘플링됩니다: * 분산(Var): $\frac{2}{n{in} + n{out}}$

이 방식은 가중치가 너무 작아지거나 커지는 것을 방지하여, 정보가 네트워크의 깊은 곳까지 잘 전달되도록 돕습니다.

Xavier 방식의 적용 시점과 한계

Xavier 초기화는 선형적인(Linear) 특성을 가진 활성화 함수와 결합될 때 최적의 성능을 발휘합니다. S자 곡선을 그리며 0 근처에서 선형적인 구간을 가지는 함수들이 이에 해당합니다.

  • 권장 활성화 함수: Sigmoid, Tanh (Hyperbolic Tangent)
  • 특징: Xavier 초기화는 데이터가 Sigmoid나 Tanh의 양 끝단(Saturation region)이 아닌, 기울기가 살아있는 중앙의 선형 구간에 넓게 퍼지도록 유도합니다. 이는 학습 초기에 기울기 소실 문제를 효과적으로 완화해 줍니다.

하지만, Xavier 초기화는 ReLU(Rectified Linear Unit) 함수와 만나면 치명적인 약점을 드러냅니다. ReLU는 입력값이 0보다 작으면 출력을 0으로 만들어버립니다. 이 과정에서 신호의 분산이 절반으로 줄어들게 되는데, Xavier 초기화는 이를 고려하지 않았기 때문에 층이 깊어질수록 신호가 급격히 약해져 학습이 멈추는 현상이 발생합니다.


3. He 초기화 (Kaiming Initialization): ReLU 시대를 위한 표준

딥러닝의 트렌드가 Sigmoid에서 ReLU로 넘어가면서, Xavier 초기화의 한계를 극복할 새로운 방법이 필요했습니다. 2015년, Kaiming He(현 ResNet의 창시자) 등은 ReLU 계열 함수에 특화된 He 초기화를 제안하며 딥러닝의 성능을 한 단계 끌어올렸습니다.

He 초기화의 핵심 원리

He 초기화의 아이디어는 직관적입니다. ReLU 함수가 음수 영역의 값을 0으로 만들어 분산을 절반으로 떨어뜨린다면, 초기 가중치의 분산을 2배로 키워서 이를 보상하자는 것입니다. 즉, Xavier 초기화보다 더 넓게 퍼진 분포를 사용하여 신호의 강도를 유지합니다.

수식적으로, 가중치 $W$는 평균이 0이고 분산이 다음과 같은 분포에서 샘플링됩니다: * 분산(Var): $\frac{2}{n{in}}$ (Xavier와 달리 $n{out}$은 고려하지 않음)

He 방식의 적용 시점

현대 딥러닝 모델의 90% 이상이 사용하는 ReLU 및 그 변형 함수들을 사용할 때는 선택의 여지 없이 He 초기화를 사용해야 합니다.

  • 권장 활성화 함수: ReLU, Leaky ReLU, ELU, PReLU
  • 특징: He 초기화는 ReLU를 통과하면서 손실되는 분산을 수학적으로 완벽하게 보정합니다. 덕분에 수백 층에 달하는 초심층 신경망(Very Deep Neural Networks)에서도 기울기 소실 없이 안정적인 학습이 가능합니다. ResNet이나 VGGNet과 같은 CNN 모델들이 성공할 수 있었던 배경에는 바로 이 He 초기화가 있었습니다.

4. Xavier vs He: 차이점 요약 및 실전 적용 가이드

복잡한 수식보다 중요한 것은 "언제 무엇을 써야 하는가?"입니다. 모델의 성능 최적화를 위해 아래의 비교 분석과 가이드라인을 반드시 숙지하시기 바랍니다.

활성화 함수에 따른 절대적인 선택 기준

가장 중요한 규칙은 '활성화 함수에 맞춰 초기화 기법을 짝지어주는 것'입니다. 이 매칭이 잘못되면 학습 효율이 급격히 떨어집니다.

  1. Sigmoid / Tanh 사용 시 $\rightarrow$ Xavier (Glorot) 초기화

    • 이유: 선형 구간을 최대한 활용하여 기울기 소실을 방지하기 위함.
    • 주의: ReLU에 Xavier를 쓰면 학습이 진행될수록 신호가 죽어버립니다.
  2. ReLU / Leaky ReLU / ELU 사용 시 $\rightarrow$ He (Kaiming) 초기화

    • 이유: 0으로 수렴하는 분산을 2배로 증폭시켜 보정하기 위함.
    • 주의: Sigmoid에 He를 쓰면 가중치가 너무 커서 기울기 폭주가 발생하거나 값이 포화(Saturate)될 수 있습니다.

분포의 형태: Uniform vs Normal

두 초기화 기법 모두 값을 추출할 분포의 형태를 선택할 수 있습니다. * He-Normal / Xavier-Normal: 정규 분포(Truncated Normal Distribution)를 기반으로 합니다. 가장 일반적으로 사용되는 기본값입니다. * He-Uniform / Xavier-Uniform: 균등 분포(Uniform Distribution)를 기반으로 합니다. 특정 상황에서 더 빠른 수렴을 보이기도 합니다.

대부분의 경우 Normal 분포를 사용하는 것이 무난하며, 프레임워크의 기본 설정도 이를 따르는 경우가 많습니다.


5. 프레임워크에서의 실제 적용 (PyTorch & TensorFlow)

이론을 알았다면 실제 코드로 구현할 수 있어야 합니다. 최신 딥러닝 프레임워크들은 레이어 생성 시 자동으로 적절한 초기화를 수행해주기도 하지만, 커스텀 모델을 만들 때는 명시적으로 지정해야 할 때가 많습니다.

PyTorch 적용 예시

PyTorch의 torch.nn.init 모듈을 사용하여 가중치를 직접 초기화할 수 있습니다.

import torch import torch.nn as nn # 레이어 정의 linear_layer = nn.Linear(100, 50) # 1. Xavier 초기화 (Sigmoid/Tanh 사용 시) torch.nn.init.xavier_uniform_(linear_layer.weight) # 2. He 초기화 (ReLU 사용 시) - 가장 많이 사용됨 torch.nn.init.kaiming_normal_(linear_layer.weight, mode='fan_in', nonlinearity='relu')

특히 CNN 모델을 직접 구현할 때는 kaiming_normal_을 적용하는 것이 국룰(Rule of thumb)과도 같습니다.

TensorFlow (Keras) 적용 예시

Keras에서는 레이어를 정의할 때 kernel_initializer 인자를 통해 쉽게 설정할 수 있습니다.

from tensorflow.keras import layers, initializers # 1. Xavier 초기화 layers.Dense(64, activation='tanh', kernel_initializer='glorot_uniform') # 2. He 초기화 layers.Dense(64, activation='relu', kernel_initializer='he_normal')


6. 결론: 좋은 시작이 좋은 성능을 만든다

가중치 초기화는 딥러닝 모델링 과정에서 작지만 매우 강력한 영향을 미치는 요소입니다. 아무리 훌륭한 아키텍처라도 초기화가 잘못되면 학습 자체가 불가능할 수 있습니다. 반면, 올바른 초기화는 학습 시간을 단축시키고, 더 낮은 손실 값으로 수렴하게 만들어줍니다.

오늘 내용을 한 문장으로 요약하자면 다음과 같습니다. "여러분의 신경망이 ReLU 계열을 쓴다면 He 초기화를, Sigmoid나 Tanh를 쓴다면 Xavier 초기화를 선택하십시오."

이 간단한 원칙만 지켜도 여러분은 기울기 소실과 폭주라는 딥러닝의 고질적인 문제에서 상당 부분 자유로워질 수 있습니다. 모델의 성능이 기대에 미치지 못한다면, 복잡한 튜닝에 앞서 가중치 초기화 설정이 활성화 함수와 올바르게 매칭되었는지 가장 먼저 점검해 보시길 바랍니다.

신고하기