본문 바로가기
machine learning

perceptron

by 유주원 2016. 1. 14.

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


Using neural nets to recognize handwritten digits


아래의 handwritten된 숫자가 있다고 고려하자



어떤 숫자가 써있느냐고 묻는다면, 대부분의 사람들은 504192라고 인식할 것이며, 엄청 쉬운 질문이라고 착각할 것이다. 

하지만 사실은 그렇지가 않다. 사람이 가지고 있는 뇌에서는 V1으로 잘알려진 시각피질, 1억 4천개의 뉴런, 그리고 그들 사이의 수백억개의 연결 고리들을 가지고 있다. 또한 사람의 시각은 V1만 포함하고 있는게 아니라 V2,V3,V4,V5 전체를 포함하고 있으며 더 복잡한 이미치 처리를 수행한다. 우리는 시각적 세상을 이해하기 위해 최적으로 적용되고, 수억년 동안 진화함으로서 조정된 슈퍼 컴퓨터인 우리의 두뇌를 가지고 있는 것이다. 

handwritten된 숫자를 인식하는 것은 쉽지가 않다. 우리의 눈이 우리에게 무언가를 보여준다는 것은 엄청나게 놀랍지만, 이러한 모든 일들은 대부분 무의식적으로 행해진다. 그래서 우리는 우리의 시각 시스템이 문제를 해결해 나가는 것에 대한 진가를 알아보지 못하는 것이다.


위의 숫자를 컴퓨터 프로그램을 이용해서 인식하고자 한다면 우리는 시각 패턴 인식이 얼마나 어려운지 알게 될 것이다. 우리가 모양을 인식하는 단순한 직관력이 (예를 들어 9는 상단이 고리로 되어 있고 오른쪽 아래에 직선이 있다.) 알고리즘적으로 표현할때에는 그렇게 단순하지 않다는 것이다. 당신이 위와같은 정확한 법칙을 만들려고 시도한다면, 당신은 예외, 특수 경우 등에 대한 늪에 빠지게 될 것이며, 이것은 희망이 없어보인다.


뉴럴 네트워크는 다른 방법으로 문제에 접근한다. 아이디어는 트레이닝 샘플로 쓰일 많은 양의 handwritten 숫자를 가진 다음에, 이런 트레이닝 샘플로부터 학습할 수 있는 시스템을 개발하는 것이다. 다른 말로 하자면 뉴럴 네트워크는 인식되는 handwritten 숫자를 위해 자동적으로 법칙을 추론한다.

게다가 트레이닝 샘플을 증가시킴으로써, 네트워크는 좀 더 많은 handwriting 숫자를 학습할 수 있고, 정확성도 향상될 수 있다.


이번 챕터에서는 우리는 handwritten 숫자를 인식하기 위한 뉴럴 네트워크를 컴퓨터 프로그래밍으로 구현할 것이다. 프로그램은 74라인 밖에 되지 않으며, 특별한 뉴럴 네트워크 라이브러리도 쓰고 있지 않다. 그러나 이러한 짧은 프로그램이 handwritten 숫자 인식에 있어서 96% 이상의 정확도를 나타낸다. 게다가 마지막 챕터에서는 99% 이상의 정확도로 향상시킬 수 있는 아이디어를 개발할 것이다. 사실 최고의 상업적 뉴럴 네트워크는 지금 은행에서 수표를 처리하거나 우체국에서 주소를 인식하는 등 좋은 성능을 나타내고 있다.


우리는 handwriting 인식에 초점을 맞출 것이다. 왜냐하면 handwriting 인식이 일반적으로 뉴럴 네트워크에 대한 가장 훌률한 프로토타입 문제이기 때문이다.  


Perceptrons


뉴럴 네트워크는 무엇인가? 뉴럴 네트워크를 시작하기 위해서는 우선 perceptron이라고 불리는 인공 뉴런의 타입을 설명할 것이다. perceptron은 1950년과 1960년에 Frank Rosenblatt 과학자가 Warrent McCulloch와 Walter Pitts의 작업물에 영향을 받아 개발되었다. 오늘날 perceptron은 인공 뉴런의 다른 모델들에서 사용하고 있는 일반적인 방법이 되고 있다. 이 책에서는 그리고 대부분의 현대 뉴럴 네트워크 작업에서는 주요 뉴런 모델로 sigmoid 뉴런이라고 불리는 방법을 사용하고 있다. 우리는 sigmoid 뉴런을 짧게 살펴볼 것이다.


어떻게 perceptron이 동작하는가?? perceptron은 많은 바이너리 input을 가진다. x1,x2,... 그리고 하나의 바이너리 output을 생성한다.



위의 그림을 보면 3개의 input, x1,x2,x3를 가진다. 일반적으로 더 많거나 적게 input을 가질 수가 있다. Rosenblatt는 output을 계산하기 위해 간단한 법칙을 제안했는데, 그는 weights, w1,w2...라는 새로운 변수를 소개했는데 이 변수는 각각의 inputs이 output으로 변할때 중요도를 표현할 수 있는 숫자이다. weight의 합계가 임계치보다 작거나 큰거에 따라 뉴런의 output이 0 또는 1로 결정 된다. 임계치는 뉴런 파라미터이며 수학적으로 아래와 같이 쓸 수가 있다.


이것이 perceptron이 동작하는 방법이다. 


예제를 통해 살펴보자. 매우 현실적인 예제는 아니지만 매우 이해하기가 쉽게 예를 들겠다. 주말이 다가오고 있고, 당신의 도시에서 치즈 페스티벌이 열린다는 것을 들었다고 가정하자. 당신은 치즈를 좋아하며, 페스티벌에 갈 것인지 말 것인지를 결정해야 한다. 당신은 당신의 결정을 위해 아래의 3개의 요소에 무게를 줌으로써 결정을 내려야 한다.


1. 날씨는 좋은가?

2. 남자 친구 혹은 여자 친구가 같이 가기를 원하는가?

3. 교통이 편리한가?


우리는 3개의 요소를 바이너리 변수 x1,x2와 x3로 나타낼 수가 있다. 예를 들어 만약 날씨가 좋다면 x1 = 1이 되고 날씨가 나쁘다면 x1 = 0이 된다. 유사하게 친구가 같이 가기를 원한다면 x2 = 1이 되고 그렇지 않다면 x2 = 0 이 된다. 교통도 마찬가지로 설정할 수 있다.


이제 당신이 치즈를 너무나도 좋아해서, 친구가 동참하지 않고, 교통이 불편하더라도 페스티벌에 가야 행복하다고 가정하자. 그러나 아마도 당신은 나쁜 날씨를 무척이나 싫어하기 때문에, 날씨가 나빠진다면 페스티벌에 가려고 하지 않을 것이다. 당신은 의사 결정의 한 종류로 perceptron 모델을 사용할 수 있다. 이것을 하기 위한 방법 중 하나가 바로 날씨를 위한 weight w1 = 6으로 설정하고, 나머지 조건들을 w2 = 2, w3 = 2로 설정하는 것이다. w1의 큰 값은 당신이 날씨에 얼마나 영향을 받는지를 나타내준다. 마지막으로 perceptron을 위한 임계치를 5라고 설정하자. 이러한 설정과 함께 이제 perceptron은 요청된 decision-making model을 구현하였으며, 날씨가 좋을 경우에는 output 1을, 날씨가 나쁠때에는 output 0을 출력한다. 당신의 친구가 같이 가기를 원한다든지, 교통의 편리성 여부는 output에 영향을 끼치지 못한다.


weight와 임계치를 변화시킴으로써 다른 decision-making 모델을 얻을 수 있다. 예를들어 3의 임계치를 선택했다고 가정하자. 그러면 perceptron은 날씨가 좋은때마다 혹은 친구가 당신과 같이 축제에 가고 싶어하고 교통이 편리할때마다 축제를 가야할지를 결정해야 한다. 다시 말하면, decision-making의 다른 모델이 된 것이다. 임계치를 떨어뜨린다는 것은 당신은 축제에 가기를 원한다는 뜻이 된다.


명백하게, perceptron은 human decesion-model에 있어 완벽한 모델은 아니다. 그러나 예제에서는 어떻게 perceptron이 의사 결정을 하기 위해 다른 종류의 evidence weight를 조정하는지를 보여주고 있다. 그리고 이것은 perceptron들의 복잡한 네트워크가 꽤 그럴싸한 dicision을 내린다는 것을 보여주고 있다.



이러한 네트워크에서 perceptron의 첫번째 column은(perceptron의 첫번째 레이어라고 부름) input evidence의 weighting에 의해 3개의 비교적 단순한 decision을 내린다. 두번째 레이어에서는 무엇이 일어나는가? 각각의 perceptron은 첫번째 레이어의 결과들을 다시 weighting 함으로써 decision을 내린다. 이 과정에서 두번째 레이어에 있는 perceptron은 첫번째 레이어의 perceptron보다 더 복잡하고 더 추상적인 레벨로 decision을 내릴 수가 있다. 그리고 좀더 복잡한 decision은 세번째 레이어의 perceptron에서 발생한다. 이러한 방법으로 perceptron의 많은 레이어 네트워크들은 복잡한 decision making에 참여할 수가 있다.


처음에 perceptron은 하나의 output만을 가진다고 언급했었다. 하지만 위에 있는 그림을 보면 많은 output을 가지고 있는 것을 볼 수가 있다. 사실 그들은 여전히 하나의 output 만을 가진다. perceptron의 출력은 다른 여러 perceptron의 input이 될 수가 있는데 다중의 output 화살표들은 이러한 perceptron의 출력을 가리키는 유용한 방법이다. 이것은 하나의 output 라인을 그린 후 분할하는 것보다 덜 불편한 방법이다.


이제 perceptron에 대해 설명하는 것을 좀 더 간단히 해보자. weight의 합이 임계치보다 크면 복잡해지므로, 이것을 단순하게 하기위해 두 가지 표기법을 변경할 수 있다. 첫 번째 변경은 weight의 합 시그마를 dot로 바꾸는 것이다. 두 번째 변경은 임계치를 perceptron의 bias로 바꿈으로써 공식을 좀더 간결하기 표현할 수 있다. bias, b = -threshold와 유사하기 때문에 아래와 같이 공식을 표현할 수가 있다.


우리는 decision을 내리기 위해 evidence를 weighting 하는 방법으로써 perceptrion을 설명해 왔다. perceptron이 사용될 수 있는 또 다른 방법으로 AND,OR 그리고 NAND 등과 같은 논리적 함수를 계산하는 데에 사용될 수가 있다. 예를 들어 두개의 input을 가진 perceptron이 있다고 치자. 각각의 weight는 -2이고 전체 bias는 3이다.



우리는 00을 input으로 넣으면 output 1을 출력하는 것을 볼 수가 있다.


(-2) * 0 + (-2) * 0 + 3 = 3


3은 양수이기 때문에 output 1을 출력한다. 00이면 output 1을 출력하고, 01과 10도 output 1을 출력한다. 하지만 11은 output 0을 출력한다. 


(-2) * 1 + (-2) * 1 + 3 = -1


-1은 음수이기 때문에 output 0이 된다. 이로써 NAND gate가 완성된 것이다. 


NAND 예제는 우리가 단순한 로직 함수를 계산하기 위해 perceptron을 사용할 수 있음을 보여준다. 사실 우리는 어떠한 논리적 함수도 perceptron 네트워크를 이용해서 계산할 수가 있다. 예를 들어 우리는 NAND 게이트를 이용해서 두 개의 bit x1과 x2를 계산하는 회로도를 만들 수가 있다. 이 회로도에는 bit OR를 계산하기 위한 sum이 필요하고 bit AND를 계산하기 위한 carry bit가 필요하다.



해당 로직을 perceptron으로 바꾸기 위해서는 우선 모든 NAND 게이트를 2개의 input을 가지는 perceptron으로 바꿀 필요가 있다. 또한 각각의 weight는 -2이고 전체 bias는 3으로 설정한다. 


이 perceptron 네트워크의 주목할만한 측면은 가장 최좌측의 perceptron으로부터 나오는 output은 가장 최하단 perceptron의 input으로 두번 사용될 수가 있다. 처음 perceptron model에 대한 정의를 할때 이렇게 output이 중복으로 동일한 장소로 가는 것을 허락하는지에 대해 설명하지 않았다. 하지만 실제로 이는 아무 문제가 없다. 만약 이게 싫다면 두개의 라인을 하나로 합친 후 weight 값을 -4로 주면 된다. 아래의 그림과 같이 표현될 것이다.


지금까지 input으로 x1과 x2를 floating 변수로 나타냈는데 사실 perceptron의 extra layer로써 나타내야 한다.(input layer)



x1과 x2를 보면 output은 있지만 input은 존재하지 않는다. 하지만 실제로 perceptron이 input이 없는 것을 의미하는 것은 아니다. 이것을 확인하기 위해 input이 존재하지 않는 perceptron을 가지고 있다고 가정하자. 그런 다음 weight의 합계를 구하면 항상 0이 되고, 만약 b >0 이면 output은 1, b <= 0 이면 output은 0이 된다. 즉, perceptron은 항상 고정된 결과 값 만을 가지게 된다.