Pytorch Weight initialization에 대하여
모두를 위한 딥러닝 - 파이토치 강의 참고
모델을 학습하기 이전에 weight의 초기값을 설정하는 문제는 모델의 학습에 굉장히 중요한 문제였습니다.
초기에 이 문제를 해결하기 위해서 사용했던 방법은 RBM(restricted boltzmann machine)이었습니다.
RBM은 layer1과 다음 레이어 layer2를 통해 weight1을 학습한 후 w1을 고정한 상태에서 layer2와 layer3를 통해 weight2를 학습하는 과정을 반복하는 방법입니다.
하지만, 요즘에는 새로운 initialization 방법들이 제안되면서 RBM을 많이 사용하지 않고 있습니다.
대표적으로 간단히 initialization할 수 있는 두 가지 방법인 Xavier / He initialization 에 대해 알아보겠습니다.
-
Xavier / He initialization 모두 Normal initialization 방법과 Uniform initialization 방법을 가지고 있으며 모두 간단한 수식을 통해 이루어집니다.
Xavier Normal initialization
nin은 layer의 input수, nout은 layer의 output수를 뜻합니다.
Xavier Uniform initialization
nin은 layer의 input수, nout은 layer의 output수를 뜻합니다.
-
He Normal initialization
nin은 layer의 input수를 뜻합니다.
He Uniform initialization
nin은 layer의 input수를 뜻합니다.
Pytorch에서는
torch.nn.init
패키지를 통해서 사용할 수 있습니다.ReLU에 관해서 작성한 포스트에서 작성한 코드와 달라진 점은 weight를 초기화해주는 부분뿐입니다.
먼저 linear layer를 만들고,
1 | linear1 = torch.nn.Linear(784, 256, bias=True) |
- 다음과 같이 xavier_uniform으로 초기화 할 수 있습니다.
1 | torch.nn.init.xavier_uniform_(linear1.weight) |
- ReLU 포스트의 코드와 다른점은 weight initialization뿐이지만 Accuracy가 상승된것을 확인할 수 있습니다.