본문 바로가기
Deep Learning/밑바닥부터 시작하는 딥러닝

퍼셉트론

by 대소기 2021. 11. 17.

 

기본 퍼셉트론 구현하기

기본 퍼셉트론 수식

$y = \begin{cases} 0 & {(w_1 x_1 + w_2 x_2 \leq \theta)}\\ 1 & {(w_1 x_1 + w_2 x_2 > \theta)}\end{cases}$

 

 

AND gate 구현

def AND(x1, x2):
  # theta is threshold
  # threshold must be bigger than weight
  w1, w2, theta=0.5, 0.5, 0.7 
  tmp=x1*w1 + x2*w2
  if tmp <= theta:
    return 0
  else:
    return 1

print(AND(0,0)) #0
print(AND(0,1)) #0
print(AND(1,0)) #0
print(AND(1,1)) #1

*theta는 가중치 값보다 크게 설정해야 한다. theta가 가중치 값보다 작으면 (0,0)이 아닌 상황에서는 무조건 1이 출력될 것이다.

 

 

 

가중치와 편향을 도입한 퍼셉트론

 

$y = \begin{cases} 0 & {(b + w_1 x_1 + w_2 x_2 \leq 0)}\\ 1 & {(b + w_1 x_1 + w_2 x_2 > 0)}\end{cases}$

* 편향을 뜻하는 b를 추가하였다. 편향은 뉴런이 얼마나 쉽게 활성화 될지를 조정하는 매개변수이다. 예를 들어 편향이 0.1이라면 input에 가중치를 곱한 값이 0.1을 초과해야지 뉴런이 활성화 되어 1을 출력하게 된다.

 

AND gate 구현

import numpy as np

def AND2(x1, x2):
  # theta is threshold
  # threshold must be bigger than weight
  x=np.array([[x1],
              [x2]])
  w=np.array([[0.5],
              [0.5]])
  b=-0.7
  tmp=np.sum(w*x)+b #elementwise하게 곱한 후 sum + b
  if tmp <= 0:
    return 0
  else:
    return 1

print(AND2(0,0)) #0
print(AND2(0,1)) #0
print(AND2(1,0)) #0
print(AND2(1,1)) #1

 

NAND gate와 OR gate 구현

def NAND(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


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

print('NAND 연산')
print(NAND(0,0)) 
print(NAND(0,1)) 
print(NAND(1,0)) 
print(NAND(1,1))
print('OR 연산')
print(OR(0,0)) 
print(OR(0,1)) 
print(OR(1,0)) 
print(OR(1,1))

#NAND 연산
# 1
# 1
# 1
# 0
# OR 연산
# 0
# 1
# 1
# 1

* 가중치와 편향, return 값만 조금 바꿔주면 다른 논리 gate들도 쉽게 구현할 수 있다.

 

퍼셉트론의 한계

 

XOR gate 구현의 불가능

* XOR gate는 단일 퍼셉트론으로 구현할 수 없다. 

* OR gate에서는 다음과 같은 진리표를 통해 두 영역을 나눌 수 있었다. 진리표에서 영역을 구분하는 기준선은 선형 함수($y = w_1 x_1 + w_2 x_2 + b$)로,  직선을 통해 영역을 구분하는 것을 확인할 수 있다.

$y = \begin{cases} 0 & {(-0.5 + x_1 +  x_2 \leq 0)}\\ 1 & {(-0.5 +  x_1 +  x_2 > 0)}\end{cases}$

 

https://velog.io/@jakeseo_me/%EB%B0%91%EB%B0%94%EB%8B%A5%EB%B6%80%ED%84%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-%EB%94%A5%EB%9F%AC%EB%8B%9D-%EC%A0%95%EB%A6%AC-1-%ED%8D%BC%EC%85%89%ED%8A%B8%EB%A1%A0

* 하지만 XOR의 경우 다음 점들을 직선 하나로 구분할 수가 없다. 이럴 경우엔 다층 퍼셉트론을 활용한 비선형구분이 필요할 것이다.

https://velog.io/@jakeseo_me/%EB%B0%91%EB%B0%94%EB%8B%A5%EB%B6%80%ED%84%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-%EB%94%A5%EB%9F%AC%EB%8B%9D-%EC%A0%95%EB%A6%AC-1-%ED%8D%BC%EC%85%89%ED%8A%B8%EB%A1%A0

 

다층퍼셉트론으로 XOR gate 구현

* XOR gate는 NAND gate와 OR gate, AND gate를 조합해 구현하는 것이 가능하다.

* 이를 퍼셉트론으로 나타내면 다음과 같다.  

 

* 즉, input neuron 2개였던 단층 perceptron과는 달리 층이 2개로 이뤄진 다층 perceptron을 사용하면 비선형 문제인 XOR gate 구현 문제도 해결이 가능하다.

def XOR(x1, x2):
  s1 = NAND(x1, x2)
  s2 = OR(x1, x2)
  y = AND2(s1, s2)
  return y

print(XOR(0,0)) 
print(XOR(0,1)) 
print(XOR(1,0)) 
print(XOR(1,1))
# 0
# 1
# 1
# 0

참고자료 :

https://book.naver.com/bookdb/book_detail.nhn?bid=11492334

 

밑바닥부터 시작하는 딥러닝

직접 구현하고 움직여보며 익히는 가장 쉬운 딥러닝 입문서!『밑바닥부터 시작하는 딥러닝』은 라이브러리나 프레임워크에 의존하지 않고, 딥러닝의 핵심을 ‘밑바닥부터’ 직접 만들어보며

book.naver.com

 

'Deep Learning > 밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글

Backpropagation  (0) 2022.01.27
경사하강법(Gradient Descent method)  (0) 2022.01.25
수치 미분  (0) 2022.01.25
손실 함수  (0) 2022.01.25
신경망  (0) 2021.11.23