01. 퍼셉트론

서유리·2022년 10월 28일
0

AI_Study

목록 보기
15/25
post-thumbnail

🔴 퍼셉트론이란?

  • 퍼셉트론은 신경망(딥러닝)의 기원이 되는 알고리즘
  • 퍼셉트론은 '인공뉴런' or '단순 퍼셉트론'으로 불린다
  • 다수의 신호(전류나 강물처럼 흐름이 있는 것)를 입력으로 받아 하나의 신호를 출력한다
  • 단, 흐른다/안 흐른다(1이나 0)의 2가지 값을 가질 수 있다
  • 가중치가 클수록 해당 신호가 중요하다는 의미이다
  • 퍼셉트론은 복수의 입력 신호 각각에 고유한 가중치를 부여한다
  • 가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용한다
  • 즉, 가중치가 클수록 해당 신호가 그만큼 중요하다는 것을 의미한다

🔴 AND 게이트

  • AND 게이트는 입력은 2개이고, 출력은 1개이다
  • 두 입력이 모두 1일때만 1을 출력하고, 그 외에는 0을 출력한다

🔴 NAND 게이트와 OR 게이트

  • NAND는 Not AND를 의미하며, 그 동작은 AND 게이트의 출력을 뒤집은 것이 된다
  • 퍼셉트론으로 AND, NAND, OR 논리 회로를 표현할 수 있다
  • 중요한 점은 퍼셉트론의 구조는 AND, NAND, OR 게이트에서 모두 똑같다
  • 세 가지 게이트에서 다른 것은 매개변수(가중치와 임계값)의 값뿐이다

🔴 퍼셉트론 구현하기

def AND(x1, x2): # x1, x2를 인수로 받는 AND라는 함수이다
    w1, w2, theta = 0.5, 0.5, 0.7 # 매개변수 w1, w2, theta는 함수 안에서 초기화하고
    tmp = x1*w1 + x2*w2  # 가중치를 곱함
    if tmp <= theta: # 가중치를 곱한 입력의 총합이 임계값을 넘으면 
        return 0 # 1을 반환하고 그 외는 0을 반환
    elif tmp > theta:
        return 1 
AND(0, 0) # 0을 출력
AND(1, 0) # 0을 출력
AND(0, 1) # 0을 출력
AND(1, 1) # 1을 출력

🔴 가중치와 편향 도입

# b는 편향(bias)
# 퍼셉트론은 입력신호에 가중치를 곱한 값과 편향을 합하여, 그 값이 0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력한다
import numpy as np
x = np.array([0, 1]) # 입력
w = np.array([0.5, 0.5]) # 가중치
b = -0.7 # 편향
print(w*x) # w*x 인덱스가 같은 것끼리 곱하다 ([0, 1] * [0.5, 0.5] => [0, 0.5])
print(np.sum(w*x)) # np.sum() 메서드는 입력한 배열에 담긴 모든 원소의 총합을 계산한다
print(np.sum(w*x) + b)

🔴 가중치와 편향 구현하기

# 가중치와 편향을 도입한 AND 게이트 구현
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
# w1, w2는 각 입력 신호가 결과에 주는 영향력(중요도)를 조절하는 매개변수
# 편향은 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력)하느냐를 조정하는 매개변수
# 편향 : 한쪽으로 치우쳐 균형을 깬다
# NAND 게이트 & OR 게이트
def NAND(x1, x2):
    x = np.array([x1, x2])
    w = np.array([-0.5, -0.5]) # AND와는 가중치(w와 b)만 다르다
    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]) # AND와는 가중치(W,B)만 다르다
    b = - 0.2
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1

🔴 퍼셉트론의 한계

🔴 도전! XOR 게이트

  • XOR 게이트는 '베타적 논리합'이라는 논리 회로임
  • 베타적이란, 자기 외에는 거부한다는 의미

🔴 선형과 비선형

  • 퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 있음
  • 즉, 곡선은 표현할 수 없음

🔴 다중 퍼셉트론이 출동한다면

  • 퍼셉트론은 XOR 게이트를 표현할 수 없음
  • 층을 쌓는 '다층퍼셉트론'을 만들 수 있음

🔴 기존 게이트 조합하기

  • 퍼셉트론의 한계는 '단층 퍼셉트론'으로, 이는 XOR 게이트를 표현할 수 없음
  • 또는 '단층 퍼셉트론'으로는 비선형 영역을 분리 할 수 없음
  • 퍼셉트론을 조합하여 층을 쌓아서 XOR 게이트를 구현할 수 있음

🔴 XOR 게이트 구현하기

import numpy as np
def XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y
print(XOR(0, 0)) # 0을 출력
print(XOR(1, 0)) # 1을 출력
print(XOR(0, 1)) # 1을 출력
print(XOR(1, 1)) # 0을 출력

🔴 퍼셉트론

  • 퍼셉트론은 모두 3층으로 구성되지만, 가중치를 갖는 층은 사실 2개 (0층과 1층 사이, 1층과 2층 사이) 뿐이니 '2층 퍼셉트론'이라고 부름
  • 0층의 두 뉴런이 입력 신호를 받아 1층의 뉴런으로 신호를 보냄
  • 1층의 뉴런이 2층의 뉴런으로 신호를 보내고, 2층의 뉴런은 y를 출력함
  • XOR 게이트 퍼셉트론에서 작업자들 사이에서 부품을 전달하는 일이 이루어짐
  • 단층 퍼셉트론으로는 표현하지 못한 것을 층을 하나 늘려 구현할 수 있음

🔴 퍼셉트론 (정리)

  • 퍼셉트론은 입출력을 갖춘 알고리즘으로, 입력을 주면 정해진 규칙에 따른 값을 출력함
  • 퍼셉트론에서 '가중치'와 '편향'을 매개변수로 설정함
  • 퍼셉트론으로 AND, OR 게이트 등의 논리 회로를 표현할 수 있음
  • XOR 게이트는 단층 퍼셉트론으로는 표현할 수 없음
  • 2층 퍼셉트론을 이용하면, XOR 게이트를 표현할 수 있음
  • 단층 퍼셉트론은 직선형 영역만 표현할 수 있고, 다층 퍼셉트론은 비선형 영역도 표현할 수 있음
  • 다층 퍼셉트론은 (이론상) 컴퓨터를 표현할 수 있음
profile
best of best

0개의 댓글