Study/ML, AL

[퍼셉트론] 퍼셉트론이란 무엇일까

🥭맹2 2021. 4. 15. 09:33

퍼셉트론

프랑크 로젠블라트가 1957년에 고안한 알고리즘 ^^

퍼셉트론은 신경망(딥러닝)의 기원이 되는 알고리즘임.

1. 퍼셉트론이란?

다수의 신호를 입력으로 받아 하나의 신호를 출력함

이 사진이 퍼셉트론

  • x1, x2는 입력신호, y는 출력신호, w1, w2는 가중치(weight)를 의미함
  • 하나의 원을 뉴런 혹은 노드라고 부름.
  • 입력신호(x1, x2)가 뉴런에 보내질 때는 각각 고유한 가중치(w1, w2)가 곱해짐 => (w1x1, w2x2)
  • 뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력함 == 뉴런이 활성화한다
    • 한계 == 임계값 == theta로 표현

임계깞 theta가 넘어가면 1, 그렇지 않다면 0

  • 퍼셉트론은 복수의 입력 신호 각각에 고유한 가중치를 부여
  • 가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용
  • 가중치가 클수록 해당 신호가 그만큼 더 중요함을 뜻함

2. 퍼셉트론 구현

2-1. 간단한 구현

x1과 x2를 인수로 받는 AND라는 함수

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)) # 0
print(AND(1, 0)) # 0
print(AND(0, 1)) # 0
print(AND(1, 1)) # 1
  • 가중치를 곱한 입력의 총합이 임계값을 넘으면 1을 반환하고 그 외에는 0을 반환함

2-2. 가중치와 편향 도입

가중치와 편향이 들어간 식

  • b는 편향(bias)
  • w1, w1는 가중치(weight)
  • 퍼셉트론은 입력 신호에 가중치를 곱한 값과 편향을 합하여, 그 값이 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) 
# array([0., 0.5])
print(np.sum(w*x))
# 0.5
print(np.sum(w*x)+b)
# -0.1999999999 (대략 -0.2이지만 부동소수점 수에 의한 연산 오차)
  • numpy의 배열 곱셈의 경우, 두 배열의 원소 수가 같다면 각 원소끼리 곱함
  • np.sum(): 입력한 배열에 담긴 모든 원소의 총합을 계산하는 메소드

2-3. 가중치와 편향 구현하기

AND게이트와 NAND게이트와 OR게이트는 가중치 w와 편향 b만 다르다.

1) 가중치와 편향을 도입한 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는 각 입력 신호가 결과에 주는 영향력(중요도)을 조절하는 매개변수
  • 편향(b)은 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력)하느냐를 조정하는 매개변수
    • ex1. b=-0.1인 경우, 각 입력 신호에 가중치를 곱한 값들의 합이 0.1을 초과할 때만 뉴런이 활성화됨
    • ex2. b=-20.0이면 각 입력 신호에 가중치를 곱한 값들의 합이 20.0을 넘지 않으면 뉴런은 활성화하지 않음

2) 가중치와 편향을 도입한 NAND게이트

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

3) 가중치와 편향을 도입한 OR게이트

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

'Study > ML, AL' 카테고리의 다른 글

[퍼셉트론] 퍼셉트론의 한계  (0) 2021.04.15
matplotlib을 사용해봅시다  (0) 2021.04.14
numpy를 사용해봅시다  (0) 2021.04.14