// 아래 내용은 [밑바닥부터 시작하는 딥러닝]으로 학습한 내용을 정리하였다.
퍼셉트론이란?
퍼셉트론: 다수의 신호를 입력 받아 하나의 신호를 출력하는 것으로, 퍼셉트론 신호는 0과 1의 두 가지 값을 가진다
# 입력으로 2개의 신호를 받은 퍼셉트론의 예시

입력 신호가 뉴런에 보내질 때는 각각 고유한 가중치가 곱해지며, 뉴런에서 보내온 신호의 총합이 정해진 한계(임계값
θ)를 넘어설 때만 1을 출력한다
=> 이를 '뉴런이 활성화한다' 라고 표현
퍼셉트론의 동작 원리를 수식으로 표현하면 다음과 같다.

퍼셉트론은 복수의 입력 신호 각각에 고유한 가중치를 부여하는데 , 여기서 가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용한다. 즉, 가중치가 클 수록 강한 신호를 흘려보내기 때문에 해당 신호가 그만큼 더 중요하다고 볼 수 있다.
퍼셉트론의 구조는 아래에서 설명할 AND, NAND, OR 게이트 모두에서 동일하다. 즉, 똑같은 구조에서 퍼셉트론이 매개변수의 값만 조정해 이 세가지 논리 회로로 변신하는 것이다.
논리 회로: AND 게이트
입력이 둘이고 출력은 하나로, 두 입력이 모두 1일 때만 1을 출력하고 그외에는 0을 출력하는 논리 회로이다.
아래는 AND 게이트의 진리표(= 입력 신호와 출력 신호의 대응표)이다.

AND 게이트를 퍼셉트론으로 표현 하려면 진리표대로 작동하도록 하는 w1, w2, θ의 값을 정해야 한다.
진리표를 만록 매개변수를 설정하면 x1과 x2 모두가 1일 때만 가중 신호의 총합이 주어진 임계값을 웃돌게 된다.
# 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
가중치와 편향
위의 퍼셉트론 동작 원리 수식에서 θ를 -b로 치환하면 퍼셉트론의 동작이 아래 처럼 된다. (기호만 바꿨을 뿐 의미는 동일)

여기서 b를 편향(bias)라 하며 w1과 w2는 그대로 가중치이다. 위 식의 관점에서 해석해보면, 퍼셉트론은 입력 신호에 가중치를 곱한 값과 편향을 합해, 그 값이 0을 넘으면 1을 출력, 그렇지 않으면 0을 출력한다.
아래는 numpy를 사용해 위 식의 방식으로 구현한 코드이다.
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 (대략 -0.2, 부동소수점 수에 의한 연산 오차)
넘파이 배열끼리의 곱셈은 두 배열의 원소 수가 같다면 각 원소끼리 곱한다. 그래서 이 예의 w*x에서는 인덱스가 같은 원소끼리 곱한다. np.sum() 메서드는 입력한 배열에 담긴 모든 원소의 총합을 계산한다.
다음은 '가중치와 편향'을 도입한 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
여기에서 -θ가 편향 b로 치환되었다. 여기서 편향은 가중치와 기능이 다르다는 사실에 주의하자. 구체적으로 w1과 w2는 각 입력 신호가 결과에 주는 영향력을 조절하는 매개변수, 편향은 뉴런이 얼마나 쉽게 활성화 하느냐를 조정하는 매개변수이다.
논리 회로: NAND 게이트
Not AND를 의미하며, AND 게이트의 출력을 뒤집은 동작, 즉 모두가 1일 때만 0을 출력하는 논리 회로이다.
아래는 NAND 게이트의 진리표이다. AND 게이트를 구현하는 매개변수의 부호를 모두 반전하면 NAND 게이트를 표현할 수 있다.

위에서 이야기한 가중치와 편향을 참고해서 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
논리 회로: OR 게이트
입력 신호 중 하나 이상이 1이면 출력이 1이 되는 논리 회로이다. 아래는 OR 게이트의 진리표이다.

위에서 이야기한 가중치와 편향을 참고해서 NAND 게이트를 구현하면 다음과 같다.
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 게이트(배타적 논리합): x1과 x2 중 한쪽이 1일 때만 1 출력하는 논리 회로이다.
아래는 XOR 게이트의 진리표이다.

사실 XOR 게이트는 위에서 본 퍼셉트론으로는 구현이 불가능하다.
Why? 먼저 OR 게이트의 동작을 시각적으로 생각해보면, OR 게이트는 가중치 매개변수가 (b, w1, w2) = (-0.5, 1.0, 1.0)일 때 위의 OR 게이트 진리표를 만족한다. 이때의 퍼셉트론은 아래의 식과 같이 표현된다.

이 퍼셉트론은 직선으로 나뉜 두 영역을 만들며, 직선으로 나뉜 한 쪽은 1을, 다른 한 쪽은 0을 출력한다. 아래의 그림은 이를 그래프로 표현한 것이다.

OR 게이트는 (x1, x2) = (0, 0)일 때 0을, (0, 1), (1, 0), (1, 1)일 때는 1을 출력한다. OR 게이트를 만들려면 위 그래프에서 ●과 ▲을 직선으로 나눠야 하며, 위의 그래프는 실제로 제대로 나누고 있음을 알 수 있다.
하지만 XOR 게이트를 OR 게이트 처럼 직선으로 표현하기엔 무리가 있다.
선형 & 비선형
위의 한계를 풀어내려면 직선이라는 제약을 풀어내야 한다.

퍼셉트론은 직선 하나로 나눈 영역(선형 영역)만 표현할 수 있다는 한계가 있다. 참고로 위의 그래프처럼 곡선의 영역은 비선형 영역이라고 한다.
다층 퍼셉트론(multi-layer perceptron)의 충돌
1) 기존 게이트 조합하기
XOR 게이트를 만드는 방법은 다양한데, 그 중 하나는 AND, NAND, OR 게이트를 조합하는 방법이다.
아래 그림은 AND, NAND, OR 게이트를 각각 기호로 표기한 것이다.

아래와 같이 조합하면 XOR 게이트를 구현할 수 있으며, 여기서 x1, x2는 입력 신호, y는 출력 신호이다. x1과 x2는 NAND 와 OR 게이트의 입력이 되고 이 두 게이트의 출력이 AND 게이트의 입력으로 이어진다.

아래는 NAND의 출력을 s1, OR 의 출력을 s2로 해서 만든 진리표이며, x1, x2,y에 주목하면 XOR의 출력과 같음을 알 수 있다.

2) XOR 게이트 구현하기
XOR 게이트를 구현하면 다음과 같다.
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 처럼 층이 여러 개인 퍼셉트론을 다층 퍼셉트론이라고 하며, 위와 같은 2층 퍼셉트론에서는 0층에서 1층으로, 1층에서 2층으로 신호가 전달된다.
단층 퍼셉트론으로는 표현하지 못한 XOR 게이트를 층을 하나 늘려 구현할 수 있었던 것 처럼, 퍼셉트론은 층을 쌓아 더 다양한 것을 표현할 수 있다.
'AI > Deep Learning' 카테고리의 다른 글
| [Deep Learning for Scratch] 오차역전파법 (0) | 2021.06.06 |
|---|---|
| [Deep Learning for Scratch] 신경망 학습 (0) | 2021.05.25 |
| [Deep Learning for Scratch] 신경망 (0) | 2021.05.23 |