본문 바로가기
머신러닝

머신러닝 실습 with Tensorflow 5장 - training-test data set & learning rate & normalization -

by ChocoPeanut 2017. 6. 8.

머신러닝 실습 with Tensorflow 5

- training-test data set & learning rate & normalization -

 

머신러닝 모델을 설계할 때 학습시킬 데이터만 존재하는 것이 아니다. 학습을 시킬 데이터를 통해 학습을 시키고 나면 이를 테스트할 test data set도 존재한다. 대부분 총 데이터 중에서 70% 정도는 training data set으로 이용하게 되고 나머지 30% 정도로는 test data set으로 활용하게 된다.


training data set의 경우에는 학습을 시키는 모델이므로 x_data 값과 y_data 값을 동시에 train 과정에 넣어주게 된다. 하지만 test data setx_test에 대한 data 값만을 넣어서 우리가 세운 모델의 가설을 통해 예측 값을 얻고 이를 우리가 아는 y_test data 와 비교하는 과정을 통해 test를 하게 된다.



test data set을 활용하기 위해서 prediction이라는 변수를 사용하게 된다. 모델의 가설을 통해 예측한 값 중 가장 큰 값을 1로 지정하는 함수인 arg_max라는 함수를 가지고 있다. 그 다음으로 is_correct라는 변수가 있는데 이는 prediction으로 나온 값과 Y를 통해 나온 값을 비교하여 맞으면 True를 아니면 False에 대한 값을 가지게 된다. accuracy 변수는 is_correct로 나온 결과를 통해 is_correctTrue이면 1False0을 나타내는 cast 함수를 사용하게 된다. 또한 cast 함수를 통해 나온 값들의 평균을 계산하여 모든 test에 대해서 정확성이 얼마나 되는지를 나타내는 값이 된다.



이는 sess.run을 통해 학습을 시킨 후 predictionaccuracy에 대한 결과를 출력하여 학습이 잘 되었는지를 파악할 수 있게 된다. 이 때 test data set을 만드는 predictionx_test에 대한 data set만을 입력해준다.



앞선 장에서는 Learning rate 값을 임의로 주었다. 하지만 Learning rate은 머신러닝 모델을 학습할 때 매우 중요한 역할을 한다. Learning rateGradient descent algorithm을 학습시킬 때 어느 정도의 step으로 기울기의 변화를 주는 것에 대한 척도이다. 만약 Learning rate이 크다면 cost function이 최솟값을 가지도록 가는 것이 아니라 발산하게 될 것이다. Tensorflow로 학습하게 되면 NaN 이라는 값을 출력하게 된다. 반대로 Learning rate 크기가 작다면 cost function이 최솟값으로 가는 step의 크기가 작아서 train을 학습하는 수를 매우 늘리더라도 최솟값에 도달하지 못하고 학습이 종료되어 원하는 예측 모델을 얻을 수 없게 된다. Tensorflow에서 cost function이 매우 작게 감소하는 것을 관측할 수 있을 것이다. 따라서 Learning rate을 잘 조절하는 것이 모델에 있어서는 매우 중요하다고 할 수 있다.



tensorflow에서는 learning rate을 지정할 때 처음에는 0.01 정도의 값을 사용하여 설정한 후 결과 값에 따라 조정해가면서 최적의 Learning rate을 찾아서 학습을 시켜야한다.


하지만 위의 과정을 잘 거치더라도 문제가 발생할 수 있다. 그건 바로 데이터의 크기의 차이에서 나타난다. x_datafeature로 다양한 값들을 받을 수 있다. 만약 중간, 퀴즈1, 퀴즈2의 결과 값을 통해 기말 시험을 예측한다고 가정해보자. 이 때 중간고사의 점수 범위는 0~100인데 퀴즈의 점수 범위는 0~10이라고 한다. 이렇게 되면 feature들 사이에 값의 차이가 매우 크게 나타난다. 이는 이론에서도 배웠지만 데이터 그래프가 한 축으로 몰리는 현상에 의해서 learning rate을 작게 주더라도 발산하는 경우가 발생할 수 있다. 따라서 데이터에 대해서 하나의 범위 안에 모든 값들이 들어오도록 만들어 주어야한다. 이런 과정이 바로 normalization이다. 이를 사용하기 위한 방법은 tensorflowMinMaxScaler라는 함수를 사용하면 된다. 이 함수를 사용하게 되면 행렬 안에 존재하는 값들을 모두 10사이의 값들로 바꾸어 normalization을 만족하도록 해준다.