[Weight Initialization] 가중치 초기화

Meosun·2024년 8월 20일

가중치 초기화란

AI Model을 작성할때 biasweight를 초기화 해야한다.
해당 초기화 값 기준으로 서서히 model에 맞게 fitting 되는데, 초기화 값을 잘못 설정할 경우

  • 수렴 실패
  • 수렴 속도 느림

등의 문제를 겪을 수 있다.
따라서 가중치 초기화 하는 방법에 대해 알아 보겠다.
Weight initialization(가중치 초기화) 방법 중 오늘은 3가지를 소개하겠다.
1. Small Gausssian Random
2. Large Gaussian Random
3. Xavier Initialization

1. Small Gaussian Random

Small Gaussian RandomN(Normal.Dist)N(Normal.Dist)~[d_in,d_out][d\_in,d\_out]에서 데이터를 Sampling 하여
작은 값(0.01)을 곱해 초기화 하는 방법이다.
하지만 x=0x=0일때, 기울기 소실 우려가 있다.

d(Tanh(wx+b))dw=Tanh(wx+b)x\frac {d(Tanh(wx+b))} {dw} = {Tanh(wx+b)^\prime}x

이므로 x=0x=0일때 Vanishing Gradient(기울기 소실)이 일어날 수 있다.

2. Large Gaussian Random

Large Gaussian Random 또한 Small Gaussian Random과 같이 N(Normal.Dist)N(Normal.Dist)~[d_in,d_out][d\_in,d\_out]에서 데이터를 Sampling한다.
하지만 해당 방법에도 문제가 있는데
1. 극단적으로 값이 11-1 || 1로 수렴한다는 것
2. Output이 커질수록 Gradient Expording(기울기 폭발)이 된다는 것
3. Tanh2(wx+b)1Tanh^2(wx+b) \approx 1 일때, Vaninshing Gradient(기울기 소실)이 된다는 것

위와 같은 문제로 해당 방법론도 잘 쓰지 않게 되었다.
그렇다면 어떠한 방법을 많이 쓸까?

3. Xavier Initialization

Xavier Initialization을 제일 많이 쓰는데
해당 방법도 위의 방법들과 같이 N(Normal.Dist)N(Normal.Dist)~[din,dout][d_in,d_out] 에서 Sampling 하지만
Sampling된 값에다 d_in\sqrt{d\_in}을 곱하여 처리한다.

이렇게 처리하게 되면 위에서 발생한 문제인
Gradient Expording(기울기 폭발)Vanishing Gradient(기울기 소실)이 이루어지지 않게 되어
적절하게 가중치 초기화를 할 수 있다.

기타 이야기

위의 방법론들을 직접 구현 하려면 꽤나 귀찮은 일이다.
그래서 PyTorch에서는 자동 Implement되어 가중치 초기화 하는 함수만 호출해주면 자동으로 생성된다.

profile
데이터와 AI를 잘 활용하는 Backend Developer가 되자

0개의 댓글