[복숭아 연구주제 09] 비전공자도 떠나는 데이터 사이언스 기행 [파이토치 09 화: Weight Initialization]
이번시간에는 Weight initialization에 대하여 알아보겠습니다.
MNIST 와 CIFAR10 테스트 에러 그래프를 확인하면 'N' 이 붙은 weight initialization 을 활용한 방법들이 현저하게 error가 낮게 나오는 것을 확인 할 수 있습니다.
그렇다면 어떻게 weight initialization 을 해주어야 할까요?
먼저 그라디언트가 0이 되는것을 방지하기 위해서 weight 가 0이 되는것을 방지하려면 RBM을 이용해서 학습을 하는것이 가장 좋은 방법이라고 머신러닝의 대가 Hinton 교수님은 말씀하십니다. 그럼 그 RBM이 무엇인가요!?
Ristricted, 한 레이어 안에 있는 노드끼리는 연결이 없지만 다음 레이어에 모든 노드에 fully connected 된 구조를 말하는 Restricted Boltzmann Machine의 줄인말입니다.
이 RBM을 pre-training 이라는 단계를 거쳐서 weight 를 initialize 한다고 Hinton 교수님은 말씀하십니다.
(a) 에서 보시는것과 같이 input x를 넣어 output h1 이 나오게 됩니다. 그러면 h1과 x의 파라미터 w 를 고정을 시키고 h1위에 h2라는 두번쨰 히든레이어를 추가해서 또 RBM을 활용하여 w 를 구해줍니다. 이 작업을 반복을 해 w들을 고정하고 쌓고 마지막 레이어까지 RBM으로 학습을 하면 Pre-training 이 끝나게 됩니다. 이렇게 pre-training이 끝나고 나면 저번에 배웠던 것 처럼 다시 back propagation을 통해서 w 들을 업데이트 해주게 되는데 이것을 fine-tuning 이라고 부릅니다.
허나 요즘에는 RBM을 활용한 Pre-training 방법을 잘 사용하지 않는다고 합니다. 왜냐하면 간단하게 w를 초기하는 방법인 Xavier 그리고 He initialization을 해주는 방법을 고안해 냈기 때문인데요, RBM의 이니셜라이제이션 전에는 무작위 수를 구해서 w 를 초기화를 했는데 Xavier 와 He 이니셜라이 제이션에서는 레이어의 구성에 따라서 W를 다르게 이니셜라이징 해주는 방법이라고 합니다.
이렇게 간단한 수식을 이용해서 Weight 를 이니셜라이제이션 해주게 됩니다. 아래는 위 수식을 코드화 한것 입니다. Fan_in 과 Fan_out 이 수식에서는 n_in 과 n_out으로 나왔다고 보시면 되겠습니다.
아래는 xavier 이니셜라이제이션을 활용해 MNIST data를 트레이닝한 결과값입니다.
뉴럴 네트워크를 더 넓고 깊게 형성하니 조금 더 성능이 좋아진 것을 확인 하실 수 있습니다.
하지만 MNIST가 너무 간단한 데이터셋인지, 넓고 깊은 뉴럴 네트워크에서도 크게 차이가 나지는 않는 것 또한 발견할 수 있습니다.