본문 바로가기
딥러닝

딥러닝 가중치 초기화: Xavier, He 왜 하는걸까?

by 데이널 2024. 2. 3.

딥러닝에서는 모델 코드에서 초기에 가중치 초기화를 해 줍니다. 이 가중치 초기화의 어떤 의미가 있을까요? 이 글에서는 가중치 초기화의 의미와 가중치 초가화 기법들에 대해 살펴보겠습니다. 가중치 초기화 기법은 '밑바닥부터 시작하는 딥러닝' 저서를 참고하였습니다. 

 

 

왜 가중치 초기화를 할까?

딥러닝에서 각 뉴런(neuron)의 가중치를 기반으로 손실(error)를 결정하게 됩니다. 결국 가중치는 손실(error)을 계산하는데 영향을 준다는 이야기가 됩니다. 예를 들어, 가중치를 어떻게 설정에 따라 기울기 소실 문제(Gradient 폭발 및 소멸 문제)를 해결할 수 있습니다. 


가중치 초기화는 Overfitting-Underfitting 문제가 발생해 제대로 학습이 되지 않는 경우에도 도움이 되고요.  또 지역 최적화(Local Optimization)하는 데도 이점이 있습니다. 즉, 같은 모델을 훈련시키더라도 가중치가 어떤 초기 값을 갖느냐에 따라서 모델 훈련 결과가 달라지게 된다는 이야기입니다. 그러면 가중치 초기화 기법들에 대해 알아보겠습니다. 

 

Zero initialization

가장 단순하게 생각해 보면 가중치를 0으로 놓는 방법이 있습니다. 이 방법은 순전파의 모든 가중치 0이 됩니다. 파라미터의 값이 모두 같다면 역전파(Back propagation)로 갱신하더라도 모두 같은 가중치(weight)를 가지고 모두 똑같이 변하게 됩니다. 결론은 가중치 초깃값은 모두 무작위로 설정해야 한다는 교훈을 얻게 됩니다. 

 

Random initialization

다음으로 생각해 볼 수 있는 것은 가중치(weight)에 무작위(random) 값을 주는 방법입니다. 이는 초기값 0보다는 낫지만 가중치가 매우 높거나 매우 낮은 값을 가질 수 있다는 약점이 있습니다.   

분포 N(0,1) 평균이 0이고 표준편차가 1인 정규분포

  • 표준편차가 크기 때문에 학습을 반복할수록 가중치 값들이 0과 1로 치우치게 됩니다. 이는 활성화 함수 Sigmoid 문제점이었던 Gradient Vanishing 발생하게 되니다. 
  • ReLU 활성화 함수를 사용하면서 해결할 수도 있지만, 가중치 초기화를 올바르게 설정해서 해결하는 방법이 더 좋은 방법입니다. 

분포 N(0,0.01)호 랜덤하게 초기화

  • 기울기 소실(gradient vanishing) 문제는 발생하지 않지만 표현력이 제한되는 문제가 발생합니다.
  • Zero initialization과 동일한 문제가 발생한다는 것을 알 수 있습니다. 

분포 N(0, 1)분포 N(0, 0.01)
분포 N(0, 1) - 왼쪽, 분포 N(0, 0.01) - 오른쪽

 

 

결론은 기울기 문제(vanishing, exploding) 방지를 위해서 activation의 평균은 0이어야 합니다. 그리고 activation의 variance는 모든 layer에서 동일하게 유지해야 합니다. 

 

Xavier Initialization

 

드디어 딥러닝에서 많이 사용하는 초기화 방법이 나왔습니다. Xavier의 아이디어는 각 layer의 활성화값을 더 광범위하게 분포시킬 목적으로 가중치(weight)의 적절한 분포를 찾자는 것이었습니다. 또한, tanh 또는 sigmoid로 활성화 되는 초깃값을 위해 이 방법을 주로 사용합니다.

 

이전 layer의 누런(neuron)의 개수가 n이라면 표준편차가 1/(√𝑛)  인 분포를 사용하는 개념이죠. 너무 크지도 않고 작지도 않은 가중치(weight)을 사용하여 기울기(gradient)가 vanishing하거나 exploding하는 문제를 예방하자는 것입니다. Xavier를 사용하면 뉴런의 개수가 많을수록 초기값으로 설정하는 가중치(weight)가 더 좁게 퍼짐을 알수 있습니다. 아래 그림에서 알 수 있듯이 고르게 퍼져있음을 알 수 있습니다. 

 

Xavier Initalization
Xavier Initalization

He Initialization

He Initialization는 ReLU를 위해 만들어진 초기화 방법입니다. 이 특화된 초깃값은 Kaiming He의 이름을 따서 He Initialization라고 부릅니다. He Initialization는 앞 layer의 neuron이 n개일 때, 표준편차가 2/(√𝑛)  인 정규분포를 사용합니다. Xavier 초기화 방식의 수식을 조금 개선했다고 생각하면 됩니다. Xavier를 사용하면 층이 깊어질 수록 모든 값이 0에 까꿔워져 기울기 소실이 발생할 수 있습니다. He를 사용하면 층이 늘어나도 균등한 분포를 유지하죠. 활성화 함수로 ReLU를 사용하면 He 초깃값을 쓰는 것이 더 좋다는 것을 알 수 있습니다.  

 

ReLU에서 XavierReLU에서 He
ReLU에서 Xavier(왼쪽), ReLU에서 He(오른쪽)

결론

가중치 초기값은 분포를 균일하게 넓게 퍼트리는 것이 Random으로 하는 것보다는 더 좋은 성능을 나타냅니다. 활성화 함수에 따라 적절한 초기화 방법이 달라진다는 것을 아셨을 겁니다. Sigmoid 또는 Tanh 활성화 함수를 사용하는 노드에 Xavier 를 사용하는 것이 좋고요. ReLU 활성화 함수를 사용하는 노드에 He 사용하는 것이 좋습니다.