프랭크 로젠블렛이 1957년에 고안한 알고리즘이다.
다수의 신호를 입력으로 받아 하나의 신호를 출력한다.
출력 신호는 0 또는 1의 값을 가진다.
아래는 2개의 입력을 받는 퍼셉트론 예시이다.

x는 입력신호, y는 출력신호, w는 가중치이다.
그림의 원을 뉴런 혹은 노드라고 부른다.
입력 노드가 출력 노드로 보내질 때는 각각 고유한 가중치가 곱해져 합산된다.
이때 정해진 한계점을 넘어 설 때만 1을 출력한다.
이 지점(임곗값)을 기호로 표현하면 다음 수식으로 나타낼 수 있다.
퍼셉트론은 복수의 입력 신호 각각에 고유한 가중치를 부여하며, 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용한다.
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
모든 입력이 1일 때, 를 초과하도록 가중치를 설정한다.
ex.(, , )
| 0 | 0 | 0 | false | 0 |
| 0 | 1 | 1 | false | 0 |
| 1 | 0 | 1 | false | 0 |
| 1 | 1 | 2 | true | 1 |
| 0 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
모든 입력이 1일 때, 를 초과하지 않도록 가중치를 설정한다.
사실상 AND 게이트를 구현하는 모든 매개변수의 부호를 반전하면 NAND 게이트가 된다.
ex.(, , )
| 0 | 0 | 0 | true | 1 |
| 0 | 1 | -1 | true | 1 |
| 1 | 0 | -1 | true | 1 |
| 1 | 1 | -2 | false | 0 |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
입력 신호 중 하나 이상이 1일 때, 를 초과하도록 가중치를 설정한다.
ex.(, , )
| 0 | 0 | 0 | false | 0 |
| 0 | 1 | 1 | true | 1 |
| 1 | 0 | 1 | true | 1 |
| 1 | 1 | 2 | true | 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

앞서 구현한 AND게이트는 직관적이고 알기 쉬우나, 이후를 생각하여 다른 방식으로 수정해보자.
를 좌변으로 이항하고, 기호 표기를 바꾸면 아래의 식으로 바뀐다.
원래는 신호와 가중치를 곱해서 모두 더한 값을 임곗값과 비교했다면, 지금은 편향으로 바꾸어 더한 다음 0과 비교하고 있다.
즉, 비교 기준점을 에서 0으로 바꾸겠다는 의미다.
한번 코드를 만들어보자
import numpy as np
def AND(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

입력과 가중치를 곱해서 모두 합한 것에 편향을 더한 다음 0과 비교를 하는 식으로 수정되었다.
그러나 지금까지의 퍼셉트론으로는 XOR 게이트를 구현하기에는 문제가 있다.
XOR 게이트는 배타적 논리합이라는 특징을 가지고 있다.
두 입력이 같다면 0, 다르다면 1을 출력한다.
이를 구현하기 위해서는 어떻게 가중치를 설정하면 될까?
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
사실 지금까지 본 퍼셉트론으로는 XOR을 구현할 수 없다. 어째설까?
집중력을 위해 여기서 한번 쉬고 다음 글에서 이어서 학습해보자
저서: 밑바닥부터 시작하는 딥러닝 1
LaTeX Markdown
LaTeX 기호 모음