A simple network to classify handwritten digits

2016. 1. 21. 10:30machine learning

http://neuralnetworksanddeeplearning.com/ 의 e-book을 의역함.


이제 실제로 이미지를 인식해 보자. 이미지를 인식하는데 두가지 문제가 있다. 첫번째로 연속된 이미지의 형태를 각각의 단일 숫자 이미지로 나누어야 한다. 예를 들어 아래와 같은 연속된 이미지가 있다고 할때,



위의 이미지를 아래의 6개의 이미지로 나누어야 한다.



사람은 위의 문제를 쉽게 풀 수 있지만, 컴퓨터 프로그램으로 이를 정확하게 나누기가 어렵다. 일단 이미지가 잘 나뉘어졌다고 치면, 그 다음으로 각각의 숫자를 분류를 해야하는 문제를 가지고 있다. 만약 분류를 정확히 할 수 있다면 이미지 분할 문제는 그렇게 어렵지가 않다. 한가지 접근법으로 많은 유형의 분할된 이미지를 만들고 이 각각의 분할 이미지를 분류기를 통과 시킨다. 분류가 잘 되었다면 높은 점수를 받았을 것이고, 낮은 점수를 받았다면 분류가 잘못된 것이다. 이 아이디어의 핵심은 분류기에 있으며, 그래서 분류기에 더 집중해서 시스템을 만들 필요가 있다.


분류기를 만들기 위해 3개의 layer를 가진 neural network를 사용할 것이다.



input layer는 input 픽셀의 값은 적절하게 encoding한 값이다. 28 x 28 = 784 개의 input neuron이 존재하고 있는 것이다. input 픽셀은 grey이며 0은 흰색, 1은 검은색을 나타내게 된다. 0과 1사이의 값은 회색의 어두움 정도를 나타내게 될 것이다.


두 번째 레이어는 hidden layer이며 15개의 neuron을 포함하고 있다.


마지막 output layer는 10개의 neuron을 포함하고 있다. 만약에 첫 번째 neuron의 output이 1에 가깝다면 시스템은 해당 input data를 0이라고 인식한 것이며 만약 두 번째 neuron output이 1에 가깝다면 시스템은 해당 input data를 1이라고 인식한 것이 된다. 

왜 output neuron이 10개인지 궁금할 것이다. 결국 이 시스템의 목표는 input으로 들어온 이미지가 0~9 중 어떤 숫자인지를 알려주는 것이다. 4개의 neuron을 사용해도 충분히 10개 이상의 결과 값을 나타낼 수가 있을 것이다. (2의 4제곱은 16이기 때문에) 하지만 왜 10개의 뉴런을 사용한 것일까? 답은 간단하다. 10개의 뉴런을 가지고 학습한 것이 4개보다 더 인식률이 좋았기 때문이다. 


과연 왜그럴까??

output neuron의 첫번째 요소를 잘 살펴보자. 숫자가 0인지 아닌지 여부를 알려주고 있다. 이것은 hidden layer의 weight 에 따라 그 여부가 결정이 난다. 그렇다면 hidden layer는 무엇을 할까? hidden layer의 첫번째 neuron에서는 아래의 이미지와 같은지 아닌지를 판가름하는 역할을 한다고 가정을 해보자.



해당 이미지와 비슷하다면 weight 값이 클 것이고 그것이 아니라면 weight 값이 작을 것이다. 이와 유사한 방법으로 hidden layer에 있는 2,3,4번째 neuron에서 각각 아래의 이미지들을 찾는다고 생각해보자.



4개의 이미지를 합치면 결국 아래와 같은 0 이미지가 나올 것이다.



그래서 만약 hidden layer안에 이 4개의 neuron이 1을 나타내게 된다면, 결국 우리는 이 이미지가 0인 것을 알아낼 수가 있다.

이와 같은 방식으로 output neuron이 4개인 네트워크 상에 적용해보자. 첫 번째 output neuron은 가장 중요한 숫자의 비트가 무엇인지를 찾아내야 하며, 위의 모양을 찾기 위한 중요한 비트를 찾는다는 것은 쉽지가 않다.