Deep learning/모델 구현

1. 퍼셉트론

jwjwvison 2021. 4. 17. 20:17

이 포스팅은 밑바닥부터 시작하는 딥러닝을 공부하고 정리한것 입니다.


 퍼셉트론은 프랑크 로젠블라트가 1957년에 고안한 알고리즘으로 신경망(딥러닝)의 기원이 되는 알고리즘이다.

 

퍼셉트론이란?

 퍼셉트론은 다수의 신호를 받아 하나의 신호를 출력한다.

x1,x2는 입력 신호, y는 출력 신호, w1과 w2는 가중치를 뜻한다. 그림의 원을 뉴런 혹은 노드라고 부른다. 입력 신호가 뉴런에 보내질 때는 각각 고유한 가중치가 곱해진다. 뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력한다. 그 한계를 입계값이라 하며 기호 세타로 나타낸다.

 

 

퍼셉트론 구현하기

def AND(x1,x2):
  w1,w2,theta= 0.5,0.5,0.7
  tmp=x1* w1 + x2 * w2
  if tmp<=theta:
    return 0

  elif tmp>theta:
    return 1
    
    
print(AND(0,0))
print(AND(1,0))
print(AND(0,1))
print(AND(1,1))

 

 앞의 세타를 -b로 치환하면 퍼셉트론 동작이 다음처럼 된다.

 여기서 b를 편향(bias)라 한다.

import numpy as np
x=np.array([0,1])
w=np.array([0.5,0.5])
b=-0.7
w*x

np.sum(w*x)

np.sum(w*x)+b

 

 가중치와 편향 구현하기

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
  
  
  

 여기에서 -세타가 편향 b로 치환되었다. 그리고 편향은 가중치 w1,w2와 기능이 다르다는 사실에 주의해야 한다. 구체적으로 w1과 w2는 각 입력 신호가 결과에 주는 영향력(중요도)을 조절하는 매개변수고, 평향은 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력) 하느냐를 조정하는 매개변수이다.

 

 이어서 NAND 게이트와 OR 게이트를 구현해보자

def NAND(x1,x2):
  x=np.array([x1,x2])
  w=np.array([-0.5,-0.5])
  b=0.7
  tmp=np.sum(x*w) +b
  if tmp<=0:
    return 0
  else:
    return 1
    
    
def OR(x1,x2):
  x=np.array([x1,x2])
  w=np.array([0.5,0.5])
  b=-0.2
  tmp=np.sum(w*x) +b
  if tmp<=0:
    return 0
  else:
    return 1

 AND,NAND,OR는 모두 같은 구조의 퍼셉트론이고, 차이는 가중치 매개변수의 값뿐이다.

 

 

 

퍼셉트론의 한계

 XOR 게이트는 베타적 논리합이라는 논리회로이다.

 사실 지금까지 본 퍼셉트론으로는 이 XOR 게이트를 구현할 수 없다. 

 그이유는 우선 OR 게이트의 동작을 시각적으로 생각해보자. 예를들어 가중치 매개변수가 (b,w1,w2)=(-0.5,1.0,1.0) 일때 이때의 퍼셉트론은 다음 식으로 표현된다.

 OR 게이트를 만들려면 위와같이 직선으로 나눠야 한다. 그럼 XOR게이트의 경우 어떨까? 불가능하다. 직선 하나로는 나눌 수 없다. 하지만 '직선'이라는 제약을 없앤다면 가능하다.

 퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 있다. 위 그림과 같은 곡선은 표현할 수 없다는 것이다.

 

 

 

다층 퍼셉트론이 출동한다면

 안타깝게도 퍼셉트론으로는 XOR 게이트를 표현할 수 없었다. 그러나 퍼셉트론의 아름다움은 층을 쌓아 다층 퍼셉트론을 만들 수 있다는데 있다. 이번에는 층을 하나 더 쌓아서 XOR를 표현해 볼 것이다.

 XOR 게이트를 만드는 방법은 다양하다. 그중 하나는 앞서 만든 AND,NAND,OR 게이트를 조합하는 방법이다.

 

 그림 2-11처럼 조합된 XOR 게이트를 구현해보자.

def XOR(x1,x2):
  s1=NAND(x1,x2)
  s2=OR(x1,x2)
  y=AND(s1,s2)
  return y
  
print(XOR(0,0))
print(XOR(0,1))
print(XOR(1,0))
print(XOR(1,1))

 이로써 XOR 게이트를 완성했다. 지금 구현한 XOR를 뉴런을 이용한 퍼셉트론으로 표현하면 다음과 같다.

 XOR는 위 그림과 같은 다층 구조의 네트워크이다. XOR는 2층 퍼셉트론이다. 이처럼 층이 여러개인 퍼셉트론을 다층 퍼셉트론 이라 한다.

 

정리


 1. 퍼셉트론은 입출력을 갖춘 알고리즘이다. 입력을 주면 정해진 규칙에 따른 값을 출력한다.

 2. 퍼셉트론에서는 '가중치'와 '편향'을 매개변수로 설정한다.

 3. 퍼셉트론으로 AND, OR 게이트 등의 논리 회로를 표현할 수 있다.

 4. XOR 게이트는 단층 퍼셉트론으로는 표현할 수 없다.

 5. 2층 퍼셉트론을 이용하면 XOR 게이트를 표현할 수 있다.

 6. 단층 퍼셉트론은 직선형 영역만 표현할 수 있고, 다층 퍼셉트론은 비선형 영역도 표현할 수 있다.