Corgi Dog Bark

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [PyTorch] Xavier_init() & He_init() 에 관하여
    카테고리 없음 2021. 5. 14. 20:03
    반응형

     

    Weight Init( ) 의 중요성


    우리가 처음 딥러닝 모델을 정의 할 때, init( ) 값만 바꾸어 주어도, 굉장히 많은 성능 변화가 있을 수 있다. 이것을 보여주는 단편적인 예시가 다음과 같은데,

    http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf

    힌튼 교수님이 그동안의 Weight initializing 은 잘못되었고, 이것을 말하기 위해서 다음과 같은 그래프를 제시하였는데, 보게되면, N 이라고 표시된 부분이 weight _ init 을 한 부분인데,  초기화를 적절히 잘해주었을때, 더욱 성능이 개선된 모델을 얻을 수 있다.

     

     

     

     

     

    RBM 모델


    - 그래서 처음 힌튼 교수님이 제안한 모델은 Restricted_Boltzman_model 을 사용하여, 가중치값을 초기화시키는 건데, 지금은 조금 더 개선된 사비에르 초깃값 그리고 헤(He_initialization) 이 나왔기 때문에, 더이상 사용은 안하는 추세이다.

     

    - 조금 더 부연설명을 하자면 

    • Restricted 란 , 같은 layer 의 가중치들이 서로 영향을 안미친다는 뜻에서 붙은 것이고,
    • 이 같은 Layer weight 들을 제외한 Layer 에서는 서로 Fully connected 되어있다는 뜻이다.

    - 지금은 RBM 모델을 안쓴다고 하니, 다음으로 Xavier 초깃값 및 He 초깃값을 살펴보자.

     

     

     

     

    Xavier & He Initialization


    -  사비에르 init( ) 은 layer 의 가중치를 각 레이어에 맞게 초기화를 시키게 되는데, normal_distribution(정규 분포화) 와 unifrom_distribution(균일 분포화) 이 두가지를 이용해서 초기화 하는 방법이 존재한다.

     

    - 사비에르 정규분포 init 은 input layer의 가중치 개수와 output layer 의 가중치 를 나누어 분산값으로 weight 를 정해주고,

    - 사비에르 균일 분포 init 은 좀 더 복잡하지만, \(-\sqrt(6/n_{in}+n_{out}),+\sqrt(6/n_{in}+n_{out})\) 의 사이에서 균일한 분포를 가지도록 weight 값들을 초기화 시켜준다.

    - He 균일분포도 마찬가지인데 한가지 사비에르와 다른 점은 \(n_{out}\) 가 없다는 것이다. 다음 식을 보면 좀 더 쉽게 이해가 될 것이다.

     

     

    NUMPY 로 살펴보자.


    -파이토치 공홈에 나와있는 xavier_uniform_ 의 함수이다. 이를 구현해보면,

    우선 토치에서 Linear 를 구현하고 , 이를 xavier_uniform 시켜주었는데,

    - 그러면 이렇게 linear1 의 값이 xavier 초기화 되었다. 그렇다면, 궁금증이 정말로 uniform 하게 편성되었는가가 궁금한데, 이를 한번 확인해보자.

    - 먼저 수식을 이용해서 xavier_uniform 의 a 값을 계산해주면, 0.759 가 나오는데, 확인해보면 다음과 같다. fan_in 과 fan_out 이 각각 input 층과 output층의 개수이므로, 784, 256 대입, 그리구 gain = 1 로 default 값이다.

    - 마찬가지로, linear1 값의 최대 최소를 확인해보면 ?!? +0.759 , -0.759 가 나오는걸 확인할수 있다.

    - 그리고 , sort() 시켜주었을시, 대략 균등한것을 볼 수 있다.

     

     

    Torch 에서의 Xavier_( )


    - 정리하자면 ,Troch 에서는

    torch.nn.init.xavier_uniform_(linear.weight)

    의 식으로 가중치값을 초기화 가능하다.

     

     

     

     

     

    - 본 포스팅은 모두를 위한 딥러닝 2 를 참조하여 작성하였습니다.

    https://deeplearningzerotoall.github.io/season2/

     

    모두를 위한 딥러닝 시즌 2

    Deep Learning Zero To All - Season 2 page

    deeplearningzerotoall.github.io

     

    반응형

    댓글

Designed by Tistory.