딥러닝독학! (1) 퍼셉트론 - 밑바닥부터시작하는딥러닝

 

시작하기 전에...

처음 공부할 책은 밑바닥부터 시작하는 딥러닝이다. 이 책은 외부 라이브러리를 최소화하고 개념 이해를 위주로 작성된 책인 것 같다. 텐서플로, 케라스 같은 프레임워크는 다루지 않는다.

처음부터 개념에 대한 이해없이 텐서플로우를 사용해 어떻게든 돌려보면서 하는 것은 별로 도움이 되지 않는 것 같다. 프로그래밍 언어를 공부할 때도 C를 하고 파이썬을 하면 쉬운데 파이썬을 먼저하고 C를 하는 것은 다들 추천하지 않는 이유가 아닐까. 개념에 대한 이해가 먼저 선행되어야 한다고 생각해서 급한 건 텐서플로지만 이 책을 선택했다.

그래도 시간이 없으니 공부한다기보다는 훑는다는 표현이 맞을 것 같다. 

블로그 포스팅은 공부하고 나서 정리용으로 작성하는 것이 아니라, 공부하면서 실시간으로 작성하는 중이다. 이제 시작이다.

 


1. 퍼셉트론이란?

퍼셉트론 신경망의 기원이 되는 알고리즘으로 다수의 신호( in(t):x1,x2... )를 입력으로 받아 하나의 신호( out(t))를 출력

etc-image-0

위 그림은 입력으로 2개의 신호를 받은 퍼셉트론의 예이다.


x1, x2 입력신호

y 출력신호

w1, w2 가중치 (입력 신호가 뉴런에 보내질 때 곱해짐, 이때 그림의 원이 뉴런)


etc-image-1
뉴런에서 보내온 신호의 총합(x1w1 + x2w2)이 정해진 한계(임계값)를 넘어설 때만 1을 출력

퍼셉트론은 복수의 입력 신호 각각에 고유한 가중치를 부여함. 가중치가 클수록 해당 신호가 중요하다는 뜻.

처음에는 뭘까 싶었는데 별 거 아니었다. 그냥 여러 입력 신호 각각에 가중치를 곱해서 임계값을 넘으면 1 아니면 0 인 것.

2. 퍼셉트론을 활용한 간단한 문제

AND 게이트를 퍼셉트론으로 구현해보자. AND게이트의 진리표는 다음과 같다.

etc-image-2
AND 게이트의 진리표

그러면 입력신호 x1, x2는 각각 0과 1의 값을 가질 수 있다. 이때 가중치 w1, w2에 의해 신호의 총합은 x1w1+x2w2가 되는데, AND 게이트를 구현하기 위핸 매개변수의 조합은 굉장히 많다. 

(w1, w2, θ) = (0.5, 0.5, 0.8), (0.5, 0.5, 0.7), (1.0, 1.0, 1.0) ....

위 경우 모두 x1와 x2가 모두 1일때만 임계값을 넘게 된다.

ex) (w1, w2, θ) = (0.5, 0.5, 0.8), (x1, x2) = (1, 0)에서 0.5*1 + 0.5*0 = 0.5인데 임계값 0.8을 넘지 않아 y는 0이다.

이와같이 NAND, OR에도 적용할 수 있다.

 

3. 퍼셉트론 구현하기

간단한 구현

def AND(x1,x2):
  w1, w2, theta = 0.5, 0.5, 0.7 #가중치와 임계값 초기화
  tmp = x1*w1 + x2*w2 #신호의 총합
  if tmp <= theta: #임계값과 비교하여 출력 결정
    return 0
  else:
    return 1

etc-image-3etc-image-4etc-image-5

가중치와 편향 도입

-θ를 b로 치환하여 위 output식을 다음과 같이 변형한다. 이때 b는 편향(bias)이라 할 수 있다.

etc-image-6

이때 가중치는 위와 같이, 각 입력 신호가 결과에 주는 영향력을 조절하고, 임계값에 따라 출력신호가 결정되므로, 편향은 뉴런이 얼마나 쉽게 활성화되는지(출력신호가 1이 되는지)를 결저한다. 문맥에 따라 편향도 '가중치'라고 할 때가 있음.

def AND(x1, x2) :
  x = np.array([x1, x2])
  w = np.array([0.5, 0.5])
  b = -0.7
  tmp = np.sum(w*x)+b #넘파이 배열 곱셈은 원소수가 같다면 각 원소끼리 곱함
  if tmp<=0 :
    return 0
  else:
    return 1

 

4. 퍼셉트론의 한계

XOR 게이트

XOR 게이트의 출력값은 x1, x2 중 한쪽이 (서로 다를 때만) 1일때만 1을 출력한다.

퍼셉트론으로는 이 XOR 게이트를 구현할 수 없다. 왜냐면 직선으로 영역을 나눌 수가 없기 때문

y = x1w1 + x2w2의 선형식인데 영역이 비선형적이라면, 선형식을 통해 영역을 분할할 수 없다.

퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 있다. 

 

5. 다층 퍼셉트론

다행히도 완전 불가능 한것은 아니다. 퍼셉트론은 층을 쌓아 다층 퍼셉트론을 만들 수 있기 때문.

XOR을 AND, NAND, OR을 조합해서 구현할 수 있듯이 퍼셉트론에 층을 쌓아서 XOR을 구현한다.

etc-image-7
AND, NAND, OR 게이트를 조합한 XOR 게이트


S1 x1 NAND x2

S2 x1 OR x2

S3 x1 AND x2


이렇게 조합된 XOR 게이트를 퍼셉트론으로 표현하면 다음과 같다.

etc-image-8
XOR의 퍼셉트론

이렇게 층이 여러개인 퍼셉트론을 다층 퍼셉트론이라 한다.

위 그림은 3층으로 구성되지만, 가중치를 갖는 층은 2개이므로 '2층 퍼셉트론'이라 부른다. 

0층의 두 뉴런(원)이 입력 신호를 받아 1층의 뉴런으로 신호를 보내면

2층의 뉴런이 2층의 뉴런으로 신호를 보내고, 2층의 뉴런은 이 입력신호를 바탕으로 y를 출력한다.

이렇게 단층 퍼셉트론으로는 표현하지 못한 것을 층을 쌓아 (깊게하여) 표현할 수 있다.

 

정리


1. 퍼셉트론은 여러 입력을 받아 하나의 신호를 출력한다.

2. 단층 퍼셉트론은 선형영역만 나눌 수 있다.

3. 다층 퍼셉트론을 이용하면 비선형적인 것부터 굉장히 복잡한 것 까지 표현할 수 있다.

4. 퍼셉트론은 가중치와 편향에 좌우된다.