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

 

시작하기 전에...

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

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

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

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

 


1. 퍼셉트론이란?

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

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


x1, x2 입력신호

y 출력신호

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


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

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

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

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

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

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

가중치와 편향 도입

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

이때 가중치는 위와 같이, 각 입력 신호가 결과에 주는 영향력을 조절하고, 임계값에 따라 출력신호가 결정되므로, 편향은 뉴런이 얼마나 쉽게 활성화되는지(출력신호가 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을 구현한다.

AND, NAND, OR 게이트를 조합한 XOR 게이트


S1 x1 NAND x2

S2 x1 OR x2

S3 x1 AND x2


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

XOR의 퍼셉트론

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

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

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

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

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

 

정리


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

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

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

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