ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 가중치 초기화
    논문&부가지식 2021. 6. 21. 12:18

    https://reniew.github.io/13/ 참고

    1. LeCun Initialization

    LeCun은 지난번 소개한 LeNet의 창시자이며, CNN을 세상에 도입한 사람이라 할 수 있다. 1998년 LeCun은 효과적인 역전파를 위한 논문에서 초기화 방법에 대해서 소개했는데 정규분포를 따르는 방법과 균등분포를 따르는 두가지 방법에 대해서 소개하였다.(LeCun 98, Efficient Backprop)

    2. Xavier Initialization

    Xavier Initialization 혹은 Glorot Initialization라고도 불리는 초기화 방법은 이전 노드와 다음 노드의 개수에 의존하는 방법이다. Uniform 분포를 따르는 방법과 Normal분포를 따르는 두가지 방법이 사용된다.(Glorot & Bengio, AISTATS 2010)

    구조는 LeCun의 초기화 방법과 유사하지만 다음 층의 노드 수도 사용하고, 많은 연구를 통해 가장 최적화된 상수값 또한 찾아냈다.

    Xaiver함수는 비선형함수(ex. sigmoid, tanh)에서 효과적인 결과를 보여준다. 하지만 ReLU함수에서 사용 시 출력 값이 0으로 수렴하게 되는 현상을 확인 할 수 있다. 따라서 ReLU함수에는 또 다른 초기화 방법을 사용해야 한다.

    3.He Initialization

    ReLU를 활성화 함수로 사용 시 Xavier 초기값 설정이 비효율적인 결과를 보이는 것을 확인했는데, 이런 경우 사용하는 초기화 방법을 He initialization이라고 한다. 이 방법 또한 정규분포와 균등분포 두가지 방법이 사용된다.(He et al. ,2015)

    Bias 초기화

    가중치 초기화 뿐만 아니라 편향(bias) 초기값 또한 초기값 설정 또한 중요하다.
    보통의 경우에는 Bias는 0으로 초기화 하는 것이 일반적이다. ReLU의 경우 0.01과 같은 작은 값으로 b를 초기화 하는 것이 좋다는 보고도 있지만 모든 경우는 아니라 일반적으로는 0으로 초기화 하는 것이 효율적이다.

    Conclusion

    다양한 종류의 초기화 방법에 대해서 알아 보았다. 초기값 설정이 학습과정에 매우 큰 영향을 끼칠 수 있기 때문에 초기화 방법 또한 신중히 선택해야 한다.

    Sigmoid, tanh 경우 Xavier 초기화 방법이 효율적이다.
    ReLU계의 활성화 함수 사용 시 He 초기화 방법이 효율적이다.
    최근의 대부분의 모델에서는 He초기화를 주로 선택한다.
    마지막으로, 대부분의 초기화 방법이 Normal Distribution과 Uniform Distribution을 따르는 두가지 방법이 있는데 이에대한 선택 기준에 대해서는 명확한 것이 없다. 하지만 He의 논문의 말을 인용하면,

    최근의 Deep CNN 모델들은 주로 Gaussian Distribution을 따르는 가중치 초기화 방법을 사용한다.

    따라서 Deep CNN의 경우 보통의 Gaussian 초기화 방법을 사용해 볼 수 있다.하지만 여러 초기화 방법들을 테스트하며 사용하는 것이 가장 좋은 방법일 것이다.

    코드

    def he_initialize(layer):
        name = layer.__class__.__name__
        if name.find("Conv") != -1:
            torch.nn.init.kaiming_normal_(layer.weight.data, nonlinearity="relu")
            if layer.bias is not None:
                torch.nn.init.constant_(layer.bias.data, 0)
        elif name.find("Linear") != -1:
            torch.nn.init.xavier_normal_(layer.weight.data)
            if layer.bias is not None:
                torch.nn.init.constant(_layer.bias.data, 0)

    댓글

Designed by Tistory.