안녕하세요. 문범우입니다.
이번에는 지난 포스팅에 이어서 딥러닝을 잘하는 방법 중 weight의 초기값을 설정하는 방법에 대해서 알아보도록 하겠습니다.
* 해당 포스트의 모든 내용은 김성훈 교수님의 '모두를 위한 딥러닝'을 바탕으로 제작되었습니다.
관련한 상세 내용은 아래 링크를 참고해주세요.
1. RBM(Restricted Belief Machine)
우리가 지난 포스팅에서 위의 그림과 같은 Vanishing gradient 문제에 대해서 알아보았습니다.
그리고 이 문제에 대해서는 Hilton 교수님께서는 4가지 이유를 꼬집었습니다.
위의 4가지 항목중 제일 아래에 있는 것은 우리가 지난 포스팅에서 sigmoid함수 대신, ReLU함수를 사용함으로써 해결할 수 있었습니다.
하지만 하이라이트 된 것과 같이 또 다른 문제도 있었습니다.
이전의 테스트에서도 아래와 같이, 같은 ReLU함수를 사용했음해도 불구하고 cost가 초반에 다르게 변화하는 것을 볼 수 있습니다.
이러한 현상이 발생하는 이유는 우리가 테스트를 할때, 초기값을 랜덤하게 지정해서 발생한 현상입니다.
그럼, 이런 초기값에 대해서 좀 더 자세히 살펴보도록 하겠습니다.
단적으로 초기값을 0으로 설정해보면 어떨까요?
그럼, 위와 같은 그림에서 W를 0으로 둔것이고, 이것이 chain rule에서 사용됩니다. 그럼 x = df/dg * W 이므로 x = 0이 되고, 그 앞에 있는 것들도 모두 0이되면서 gradient가 사라져 버립니다.
따라서, 절대로 초기값으로 0을 주면 안된다는 것을 알 수 있습니다.
그럼 초기값을 어떻게 주어져야 할까요?
이에 대해 2006년 Hilton교수님께서 논문을 쓰시면서 RBM(Restricted Boatman Machine)을 사용함으로써 해결하게 됩니다.
그리고 이러한 RBM을 사용한 네트워크를 DBN(Deep Belief Networks)라고 합니다.
어떻게 동작되는 것 일까요?
먼저, 입력을 재생산 해냅니다.
위의 그림과 같이, 입력값을 weight와 곱해서 b값을 얻어냅니다. 또한 b 유닛아래에 있는 것들에 대해서도 같은 방법을 통해서 값을 얻습니다. 이러한 과정을 Forward 라고 합니다.
그리고, Backward 방법으로, 우리가 얻은 값들과 weight를 통해 위의 그림에서의 b 값을 얻습니다.
그럼 우리가 처음에 입력한 값을 x라고 한다면, x와 b의 값의 차이가 존재할텐데 이 차이가 최소가 될 때까지 weight를 조절합니다.
이렇게 해서 weight를 구하는 것을 RBM이라고 합니다.
그리고 위와 같은 방법을 encoder/decoder라고도 합니다.
실제로 이것을 네트워크 상에서 적용시키기 위해서는 아래와 같은 과정을 가집니다.
여러개의 레이어가 있을때, 입력값 측의 레이어부터 시작하여 layer 1과 layer 2를 encoder/decoder를 수행하고, 이후에 layer2 와 layer3에 대해 수행하며 끝까지 나아가는 방법입니다.
이제 이러한 과정을 통해 각 weight를 구할 수 있고, 그것을 학습시킨다, training한다는 표현보다는 fine tunning 이라는 표현을 사용합니다.
학습하는 것보다 훨씬 더 빨리 진행되는 작업이기 때문이죠.
이러한 fine tunning이 끝나게 되면 이후 우리가 학습시키고자 하는 데이터들에 대해서 label을 붙여서 실제로 training을 진행합니다.
2. Xavier initalize
그런데 실제로 이것을 구현하는데 있어서는 복잡한 과정이 있을 수 있습니다.
하지만 좋은 소식은, 2010년에 발표된 논문에서 우리가 굳이 RBM을 쓰지 않아도, 좋은 초기값을 얻을 수 있다는 Xavier initialize라는 알고리즘이 나왔습니다.
이는 입력의 노드의 개수에 비례해서 초기값을 세팅하면 된다는 식의 알고리즘 입니다.
이를 식으로 간단히 살펴보면, 우리가 좋은 값, 좋은 weight를 얻기 위해서 입력값의 개수 fan_in 과 출력 값의 개수 fan_out을 이용하여 초기값을 주는 것입니다. 이러한 식을 통해 어쩌면 RBM보다 더 좋은 결과를 가질 수 있다고 합니다.
'AI & BigData > 모두를 위한 딥러닝(정리)' 카테고리의 다른 글
텐서플로우(Tensor Flow) #14_ Neural Network 총정리::MNIST 98%성공하기 (0) | 2018.04.21 |
---|---|
딥러닝(DeepLearning) #6_ Dropout and Ensemble (0) | 2018.04.20 |
딥러닝(DeepLearning) #4_ ReLU::Rectified Linear Unit (0) | 2018.04.19 |
텐서플로우(Tensor Flow) #13_ TensorBoard 사용하기 (0) | 2018.04.19 |
텐서플로우(Tensor Flow) #12_ Neural Network for XOR problem (0) | 2018.04.18 |