퍼셉트론은 신경망(딥러닝)의 기원이 되는 알고리즘
퍼셉트론의 구조를 배우는 것은 신경망과 딥러닝으로 나아가는 데 중요한 아이디어를 배우는 일
퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력
퍼셉트론 신호는 실제 전류와 달리 '흐른다/안 흐른다(1이나 0)'의 두 가지 값을 사용
입력으로 2개의 신호를 받은 퍼셉트론의 예
과 는 입력 신호
y는 출력 신호
과 는 가중치
입력 신호가 뉴런에 보내질 때 각각 고유한 가중치를 곱하여 전송
뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력(1이 출력되는 것을 뉴런이 활성화한다라고 표현)
정해진 한계를 임계값이라 하며, 기호로 표시
두 입력이 모두 1일 때만 1을 출력하고, 그 외에는 0을 출력
AND 게이트를 퍼셉트론으로 표현하기 위해서, , , 값을 정해야 함
(, , )를
(0.5, 0.5, 0.7)
(0.5, 0.5, 0.8)일 때 모두 AND 게이트 조건을 만족
NAND는 AND 게이트의 출력을 뒤집은 것
NAND 게이트를 표현하려면, 예를 들어
(, , ) = (-0.5, -0.5, -0.7) 조합 사용
OR 게이트는 입력 신호 중 하나 이상이 1이면 출력이 1이 되는 논리 회로
퍼셉트론의 구조는 AND, NAND, OR 게이트 모두에서 동일
세 가지 게이트에서 다른 것은 매개변수(가중치와 임계값)의 값 뿐
x1과 x2를 인수로 받는 AND 함수 구현
매개변수 , , 는 함수 안에서 초기화
가중치를 곱한 입력의 총합이 임계값을 넘으면 1을 반환하고, 그 외에는 0을 반환
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))
0
0
0
1
기존 식에서 를 -b로 치환하면 퍼셉트론의 동작이 다음 식처럼 변경
여기서 b를 편향
퍼셉트론은 입력 신호에 가중치를 곱한 값과 편향을 합하여, 그 값이 0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력
import numpy as np
x = np.array([0, 1])
w = np.array([0.5, 0.5])
b = -0.7
w * x
array([0. , 0.5])
np.sum(w * x)
0.5
np.sum(w * x) + b
-0.19999999999999996
-를 편향 b로 치환
편향은 가중치 , 와 기능이 다르다는 사실에 주의
, 는 각 입력 신호가 결과에 주는 영향력을 조절하는 매개변수
편향은 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력)하느냐를 조정하는 매개변수
예를 들어, b가 -0.1이면 각 입력 신호에 가중치를 곱한 값들의 합이 0.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
elif:
return 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(w * x) + b
if tmp <= 0:
return 0
elif:
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
elif:
return 1
XOR 게이트는 배타적 논리합
과 중 한쪽이 1일 때만 1을 출력
AND와 OR 게이트는 퍼셉트론으로 구현이 되지만 XOR 게이트는 구현 불가
예를 들어, OR 게이트는 (b, , ) = (-0.5, 1.0, 1.0)일 때 진리표를 만족하는데 이 때 퍼셉트론은 아래 식으로 표현
퍼셉트론은 직선으로 나뉜 두 영역을 생성
직선으로 나뉜 한쪽 영역은 1을 출력, 다른 한쪽은 0을 출력
아래 그림의 직선은 네 점을 제대로 나누고 있음
XOR 게이트의 경우 직선 하나로 네 점을 나눌 수 없음
하지만 '직선'이라는 제약을 없앤다면 가능
퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계
퍼셉트론으로는 XOR 게이트를 표현할 수 없지만, 다층 퍼셉트론을 이용하여 XOR 표현 가능
단층 퍼셉트론으로는 XOR 게이트를 표현할 수 없다
단층 퍼셉트론으로는 비선형 영역을 분리할 수 없다
는 NAND와 OR 게이트의 입력
NAND와 OR의 출력이 AND 게이트의 입력
AND, NAND, OR를 사용하여 XOR 게이트를 파이썬으로 구현
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x, x2)
y = AND(s1, s2)
return y
print(XOR(0,0))
print(XOR(1,0))
print(XOR(0,1))
print(XOR(1,1))