본문 바로가기
머신러닝

머신러닝 실습 with Tensorflow 8장 - ReLu & Dropout & Xavier -

by ChocoPeanut 2017. 6. 12.

머신러닝 실습 with Tensorflow 8

- ReLu & Dropout & Xavier -

 

6장에서 Softmax를 사용하여 MNIST test data를 학습시킨 모델을 하였다. 이번에는 같은 데이터를 사용하여 Accuracy를 높이는 방법을 찾기 위한 실습을 진행할 것이다. 6장의 코드를 참고한 후 어떻게 변하는지를 체크하면 좋을 것 같다.


먼저 NN에 대한 학습 방법을 사용할 것이다. 6장에서 사용한 예시에서는 layer라는 것이 존재하지 않았다. 하나의 데이터를 넣어 바로 결과가 나오는 과정을 거쳤는데 Neural Network의 방법을 사용하여 여러 개의 layer를 만들어 학습시킬 수 있다. layer를 만들 때에는 shape에 대한 값이 매우 중요하다. Weight의 경우 들어오는 input값과 output 값을 잘 고려하여 shape을 지정해야한다. 하나의 layeroutput이 다른 layerinput으로 들어가므로 이에 대한 shape의 크기를 잘 맞춰주어야 하는 것이다. 중간의 layer에 대한 크기는 지정해주는 것에 따라 다르게 나타날 수 있다. 하지만 처음 input과 최종 output에 대해서는 실제 데이터의 inputoutput의 수에 맞게 해주어야 한다.



ReLU라는 activation function을 사용한다. 지금까지는 sigmoid라는 activation function을 사용하여 학습을 시켰는데 원래 sigmoid 함수는 Neural Network 환경에서 학습시키기 좋지 않은 함수이다. 실제로 데이터가 01사이로 나타나기 때문에 이는 Backpropagation을 통해 학습시킬 때 미분한 값이 계속해서 작아져서 영향을 어떻게 끼치는지를 잘 파악하기 힘들다. 따라서 ReLU라는 function을 사용하는데 ReLU는 기준 이상의 값에서는 직선의 함수를 가지기 때문에 계속 값이 증가하여 높게 측정될 수 있다. 따라서 미분한 값이 작아질 위험이 없게 된다. 자세한 내용은 이론 설명 장들을 참고하면 좋을 것 같다.(머신러닝 13)


최적화를 시키기에 좋은 방법 중 하나가 초기화를 잘 하는 것이다. 초기화를 시키는 방법으로 Xavier initialization을 사용할 것이다. weight에 대한 인자로 초기화를 주어 xavier 초기화를 할 수 있는 함수를 넣어주게 된다. 이렇게 되면 Accuracy가 더 높아지게 된다. 또한 처음에 cost 값부터 다른 결과에 비해 매우 낮게 나타나는 것을 확인할 수 있다.



이제 Dropout 방법을 사용할 것이다. Dropoutoverfitting이 일어나지 않도록 중간 중간 layer의 연결을 끊어서 학습을 시키는 방법이다. tensorflow에서 구현할 때는 dropout이라는 layer를 한 번만 넣어주면 쉽게 구현할 수 있다. dropout의 값으로 몇 %를 유지시킬 것인가에 대한 값을 지정해주어야 한다. 실제로 train을 할 때에는 0.5~0.7 정도의 비율로 유지를 시킨다. 하지만 test를 할 때에는 1의 값으로 주어 모든 layer를 거쳐서 test를 할 수 있게 해주어야 한다.