Weight Initialization
딥러닝 모델은 기본적으로, 랜덤으로 생성된 Weight 값으로 시작해서 점차 Loss를 줄여나가는 방식으로 학습을 진행하게 된다. 이 때, 처음 Weight를 초기화 하는 방법에 대한 다양한 연구가 진행되어있는데, 그 이유는 Weight Initialization방식에 따라 실제 성능에서도 유의미한 차이를 가지기 때문이다.
위 그림을 보자, 시작하는 Initial 값이 달랐던 것 뿐인데, 최종적으로 계산된 Cost Function의 값이 차이가 난다는 것을 확인할 수 있다. 그리고 만약 initialization이 오른쪽 봉우리의 최상단에서 시작되거나 할 경우엔, 두개의 봉우리 사이의 Local Optima에 갇히게 될 수도 있다.
이처럼 Weight를 초기화하는 방법은 꽤 유의미한 차이를 지니며, 다양한 방법이 연구되어있다.
Simple Initialization
먼저 가장 단순하게 생각해 볼 수 있는 방법은, 모든 weight를 0이나 1과 같은 숫자로 시작하는 것이다.
하지만 이는, 학습 과정에서 Back Propagation의 값을 동일하게 만들고, 어떤 Feature가 중요한지 효과적으로 학습을 하지 못하게 되는 결과를 낳는다.
따라서 초기화는 반드시 서로 다른 다양한 값으로 넣어주어야 한다.
Random Initialization
말 그대로 임의의 수를 넣는 방식이다. 실제로 대부분의 효과적인 Initialization은 다 일종의 Random Initialization이라고 볼 수 있다. 다만 임의 값의 분포를 어떻게 처리할지, 각각의 값에 대한 가중치는 어떻게 처리할지에 따라 다양한 방법이 존재한다.
Xavier Initialization
임의로 값을 생성하되, 임의 값의 표준 편차를 직전 Hidden Layer의 개수 n, 현재 Hidden Layer의 개수 m을 기준으로 하여 2 / root(n+m) 을 표준편차로 하는 정규분포를 따르게끔 초기화한다.
이는 데이터의 Activation Function 값을 더욱 고르게 퍼지게 할 수 있고, 레이어가 깊고 클 수록 그에 맞게 표준편차가 조정되는 적응형 방식이기 때문에 보다 Robust한 결과값을 얻을 수 있다.
해당 이름은, 연구의 발표자 Xavier Glorot의 이름을 따서 만들어진 초기화 방법으로, Glorot Initialization이라고도 한다.
일반적으로, Activation이 Sigmoid일 때 Xavier를 사용하며, pytorch에서는 아래 명령어를 통해 사용한다.
torch.nn.init.xavier_normal_()
torch.nn.init.xavier_uniform_()
He Initialization
He Initialization은 ResNet으로 유명한 Kaiming He의 이름을 따서 만들어졌으며, 마찬가지로 Kaiming Intialization이라고도 한다. Xavier와 달리 ReLU Activation Function과 함께 사용되는데, 표준편차를 root(2 / n)으로 초기화한다.
Xavier Initialization의 경우, ReLU와 함께 사용하면 다음과 같이 값이 점점 분포가 치우치고, 깊은 Layer 구조에서 Gradient Vanishing을 발생시킬 수 있다.
하지만, He Initialization의 경우, 아래와 같이 분포를 유지하면서 Gradient Vanishing을 막을 수 있다는 장점이 있다.
마찬가지로 torch에 구현이 되어 있으며, 아래와 같은 명령어로 사용할 수 있다.
torch.nn.init.kaiming_uniform_()
torch.nn.init.kaiming_normal_()