💡 오랜 시간이 흐름에 따라서 예전에 공부해서 명확히 이해했었던 딥러닝 기초 개념들이 예전만큼 명확하지 않음을 느낀다.
그래서 다시 그것들을 상기하고자 밑시딥 정독을 시작한다.
Chapter 1. 파이썬 부분은 생략한다.

퍼셉트론은 프랑크 로젠블라트 가 1957년에 고안했고, 신경망(딥러닝)의 기원이 되는 알고리즘이다.
퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력한다.

위 그림에서
과 는 입력 신호, 는 출력 신호, 과 는 가중치를 의미하고, 그림의 원을 뉴런 혹은 노드라고 부른다.
입력 신호가 뉴런에 보내질 때는 각각 고유한 가중치가 곱해진다. (, ).
뉴런이 활성화된다
- 뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력
- 이 책에서는 그 한계를 임계값이라고 하며, 기호로 표현
퍼셉트론의 동작 원리는 이게 끝. 수식을 나타내면 다음과 같다.

퍼셉트론은 복수의 입력 신호 각각에 고유한 가중치를 부여한다.
가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용하며, 가중치가 클수록 해당 신호가 그만큼 더 중요함을 의미한다.
AND 게이트는 입력이 둘이고 출력이 하나이다.
아래는 AND 게이트의 진리표(입력 신호와 출력 신호의 대응표)로,
두 입력이 모두 1일 때만 1을 출력하고, 그 외에는 0을 출력한다.
| 0 | 0 | 0 |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 1 | 1 |
위 AND 게이트 진리표를 퍼셉트론으로 표현하려면 진리표대로
작동하도록 하는 , , 의 값 (퍼셉트론의 매개변수)을 정하는 것이다.
e.g. (, , ) = (0.5, 0.5, 0.8)NAND는 Not AND를 의미하며, AND 게이트의 출력을 뒤집은 것으로 동작한다.
| 0 | 0 | 1 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 1 | 0 |
위 진리표를 보면, 과 가 모두 1일 때만 0을 출력하고, 나머지는 1을 출력한다.
NAND 게이트 진리표를 퍼셉트론으로 표현하기 위한 매개변수 조합
e.g. (, , ) = (-0.5, -0.5, -0.8)OR 게이트는 입력 신호 중 하나 이상이 1이면 출력이 1이 되는 논리 회로
| 0 | 0 | 0 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 1 | 1 |
💡 NOTE 💡
- 여기서 퍼셉트론의 매개변수 값을 정하는 것은 컴퓨터가 아니라 우리 인간
- 기계학습 문제는 이 매개변수의 값을 정하는 작업을 컴퓨터가 자동으로 하도록 함
- 학습이란 적절한 매개변수 값을 정하는 작업
- 사람은 퍼셉트론의 구조(모델)을 고민하고 컴퓨터에 학습할 데이터를 주는 일을 함.
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
AND(0,0) # 0을 출력
AND(1,0) # 0을 출력
AND(0,1) # 0을 출력
AND(1,1) # 0을 출력
위 퍼셉트론의 동작 원리 수식의 를 로 치환하면 다음과 같은 식이 완성된다.
위 식의 관점으로 해석해보면
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.19999999999996 # 대략 -0.2
가중치와 편향을 도입한 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 temp <= 0:
return 0
else:
return 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])
b = -0.2
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
XOR 게이트는 배타적 논리합이라는 논리 회로이다.
1일 때만 1을 출력한다.| 0 | 0 | 0 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 1 | 0 |
지금까지 본 퍼셉트론으로는 XOR 게이트를 구현할 수 없다.
AND와 OR 게이트를 살펴보면 아래 그림과 같이 직선으로 영역을 나눌 수 없다.

직선(선형) 하나로는 위 그림처럼 0과 1을 나눌 수 없다.

위 그림과 같은 곡선(비선형)으로 영역을 나눌 수 있다.
퍼셉트론으로는 XOR 게이트를 표현할 수 없었다.
하지만 퍼셉트론의 층을 쌓아 다층 퍼셉트론을 만들면 해결할 수 있다.
XOR 게이트를 만드는 방법은 다양한데, 그 중 하나는 AND, NAND, OR 게이트를 조합하는 방법이 있다.

AND, NAND, OR 게이트를 조합해 구현한 XOR 게이트 구조이다.
| y | ||||
|---|---|---|---|---|
| 0 | 0 | 1 | 0 | 0 |
| 1 | 0 | 1 | 1 | 1 |
| 0 | 1 | 1 | 1 | 1 |
| 1 | 1 | 0 | 1 | 0 |
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
XOR(0, 0) # 0을 출력
XOR(1, 0) # 1을 출력
XOR(0, 1) # 1을 출력
XOR(1, 1) # 0을 출력
아래 그림은 XOR의 퍼셉트론이다.

0층의 두 뉴런이 입력 신호를 받아 1층의 뉴런으로 신호를 보냄1층의 뉴런이 2층의 뉴런으로 신호를 보내고, 2층의 뉴런을은 y를 출력2층 구조를 사용해 퍼셉트론으로 XOR 게이트를 구현 가능
--
- 퍼셉트론은 입출력을 갖춘 알고리즘이다. 입력을 주면 정해진 규칙에 따른 값을 출력한다.
- 퍼셉트론에서는 '가중치'와 '편향'을 매개변수로 설정한다.
- 퍼셉트론으로 AND, OR 게이트 등의 논리 회로를 표현할 수 있다.
- XOR 게이트는 단층 퍼셉트론으로는 표현할 수 없다.
- 2층 퍼셉트론을 이용하면 XOR 게이트를 표현할 수 있다.
- 단층 퍼셉트론은
직선형영역만 표현할 수 있고, 다층 퍼셉트론은비선형영역도 표현할 수 있다.- 다층 퍼셉트론은 (이론상) 컴퓨터를 표현할 수 있다.