brunch

You can make anything
by writing

C.S.Lewis

by 이민우 Nov 14. 2018

숫자 맞추는 뉴럴넷

지난 글에서 MNIST 데이터를 열어보았고.

이번 글에서는 아주 간단한 모델 구성으로 숫자를 맞춰보려고 합니다. 


만들려는 것은

Feature(숫자 모양의 이미지)를 입력해주고 Label(숫자)이 무엇인지 예측하는 모델입니다.

Feature는 길이 784, 0 to 255 값을 가지는 배열이고 

Label은 0 to 9, 숫자의 Categorical Scale입니다. 

데이터셋을 train set, test set으로 나눠주고 모델에 전달해주면

모델은 train set으로 학습을 진행하며 cost와 accuracy를 반환함과 동시에 test set에 대한 accuracy도 구해 출력하도록 하고,

학습을 완료한 뒤에는 예시 이미지를 입력받으면 예측값을 반환하는 기능까지 구현합니다. 




Parameters, Settings


Linear vs Logistic

예측 대상의 생김새가 숫자인 것과는 무관하게 예측의 결과는 [0-9], 10개 분류 각각의 확률 분포로 표현되어야 합니다.

즉, Label이 Categorical Scale 혹은 Nomial Scale(한쿸어로는 명목 척도) 임을 알 수 있으며 

Ordinal, Interval, Ratio Scale과 달리 이 문제의 답은 순서나 간격을 가지지 않습니다. 

때문에 Label이 특정 범위로 제한되며, 답의 분포가 정규분포가 아닌 다항 분포를 가지게 됩니다. 

이러한 Classification 문제를 푸는 방법을 Logistic Regression 모델이라 합니다. 

좀 더 정확히는 두 개 이상의 범주를 가지는 문제기 때문에 Multinomial Logistic Regression입니다. 


Proper Cost Function

우선 학습을 위한 적절한 Cost가 무엇인지 정해야 합니다.

정답의 분포 - p- 와 예측값의 분포 - q - 의 차이를 구해 Cost 값으로 사용하는 것이 적절해 보입니다.

하여 두 분포의 비교를 위해 KL Divergence를 사용합니다. 

위 식의 두 번째 항은 q와 관련된 정보가 없습니다. 예측 결과를 확인하고 분포 차이를 확인하는 데에 쓸모가 없는 상수가 됩니다. 따라서 두 번째 항을 제외하고서 식을 줄여보면 아래와 같습니다.

이는 Cross-entropy를 구하는 식과 동일합니다. 

식의 의도를 조금 더 살펴보자면, p의 값이 [0, 1]을 가지는 것을 생각해볼 때 정답이 0인 경우 q의 값이 무엇이든 상관없이 식의 결과가 0이 되는 것을 알 수 있습니다. 말하자면 정답의 구간에 속하지 않는 예측값은 보지 않는 것이 식의 의도라고 할 수 있습니다. 

두 확률 분포에서 관심이 있는 부분의 차이를 확인한다, 요 정도면 적절한 Cost Function으로 사용해도 될 것 같습니다. 


Squared Error vs Cross Entropy Error

확률 분포의 차이를 확인하는 방법으로 Cross-entropy가 적절해 보이는 것과 무관하게 두 분포의 거리를 재는 방법으로 Squared Error를 사용할 수도 있는 것처럼 보입니다. 

하지만 Cross-entropy를 써야 하는 이유가 있습니다. 

Squared Error는 정답 구간 밖의 값에 영향을 받습니다. 답과 무관한 정보에 더 많은 가중치를 주는 경우가 생깁니다. 

Squared Error의 계산 과정에서 Activation Function을 지나온 가중치가 점점 작아지게 됩니다. 따라서 학습이 더뎌지거나 멈추는 경우가 생깁니다. 


Optimizer, Learning Rate, Batch Size, ..., ..., ..

이것은 쓰는 사람의 능력이고 인생의 좋은 경험이라고 생각해야지, 방법이 없습니다. 

더 좋은 성능을 내야 할 때 나머지 주제들(Regularization, Optimization)에 대해서 이어 써보려고 합니다.

이 글의 모델에서는 다루지 않습니다. 




Model


Notebook

텐서플로우 예시 데이터 세트 - MNIST를 사용하는 뉴럴넷 모델의 예시 코드입니다.

아주 빠르게 결과를 얻을 수 있도록 하나의 레이어 구성 + 작은 epoch으로 설정 + test set accuracy도 가끔 한 번씩 세도록 했습니다. 구성한 모델은 91% 정확도 수준의 결과를 얻었습니다.


Difference from cross-entropy to squared error

left: cross-entropy / right: squared error

Cost Function을 Cross-entropy로 설정했을 때와 Squared Error로 설정했을 때 각각 0.917, 0.871의 Accuracy를 얻었습니다. Squared Error로 Cost Function을 구성했을 때 Cost의 크기가 더 작고 학습이 더딘 것을 확인할 수 있었습니다. 


Prediction

예측한 결과를 확인해보기 위해 짧게 예시 코드를 작성했습니다.

대부분 좋은 결과를 보여줍니다. 

prediction = sess.run(actv, feed_dict={ x : mnist.test.images })
randidx = np.random.randint(mnist.test.images.shape[0], size=3)
for i in randidx:
    curr_img   = np.reshape(mnist.test.images[i, :], (28, 28)) 
    curr_label = np.argmax(mnist.test.labels디[i, :] ) 
    plt.matshow(curr_img, cmap=plt.get_cmap('gray'))
    plt.title('y:' + str(curr_label) + ' / prediction: ' + str(np.argmax(prediction[i])))




+ 덧.


BigqueryML

빅쿼리에 MNIST 데이터를 업로드해두었고

아주 간단한 쿼리를 사용해 모델을 제작했습니다.

제작된 모델에 테스트 이미지의 라벨을 예측해보았고 90% Accuracy를 얻었습니다. 

높은 성능이 필요한 대신 빠른 실행과 적정 수준의 성능을 필요로 하는 Task에 적합하리라 기대됩니다.




끝.


+ 이 글 묶음은 숫자 분류 외의 주제들과 성능을 높이는 방법들 얘기로 이어집니다.

감사합니다!




References

Lecture

KL Divergence & Cross-entropy

Cross Entropy의 정확한 확률적 의미

Entropy, Cross-entropy, KL Divergence | 알기 쉬운 산업수학 | 산업수학혁신센터

#4.0. 정보량을 나타내는 엔트로피 (Entropy)

#4.1. Cross entropy와 KL divergence

#4.2. KL Divergence, 순서가 중요할까요?

A Beginner's Guide to Variational Methods: Mean-Field Approximation

Cross Entropy is better than squared error

Why You Should Use Cross-Entropy Error Instead Of Classification Error Or Mean Squared Error For Neural Network Classifier Training(+한글 번역본)

Why is the Cross Entropy method preferred over Mean Squared Error? In what cases does this doesn't hold up?

Is cross-entropy loss always better than squared-error loss for deep learning tasks?


매거진의 이전글 MNIST 알아보기
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari