퍼셉트론이란?
퍼셉트론은 프랑크 로젠블라트(Frank Rosenblatt)가 1957년에 고안한 신경망(딥러닝)의 기원이 되는 알고리즘이다.
퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력한다.
>>> 다수의 신호를 입력받아 흐름을 만들고 정보("신호가 흐른다": 1 or "신호가 흐르지 않는다": 0)를 앞으로 전달한다.
\( x_{1} \)과 \( x_{2} \)는 입력 신호, \( y \)는 출력 신호, \( w_{1} \)과 \( w_{2} \)는 가중치(weight)를 뜻한다.
[그림 2-1]의 원은 뉴런 or 노드라고 부른다. 입력 신호가 뉴런에 보내질 때는 각각 고유한 가중치가 곱해진다. 뉴런에서 보내온 신호의 총합이 임계값( \(\theta\), 세타, 정해진 한계)을 넘어설 때만 1을 출력한다. >>> "뉴런이 활성화한다"라고 표현함
이러한 퍼셉트론의 동작원리를 수식으로 나타내면 아래와 같다.
퍼셉트론은 복수의 입력 신호 각각에 고유한 가중치를 부여한다. 가중치는 각 신호가 결과에 영향력을 조절하는 요소이다. 즉, 가중치가 클 수록 해당 신호가 그만큼 더 중요하다는 것이다.
2.2 단순한 논리 회로
2.2.1 AND 게이트
퍼셉트론을 활용한 간단한 문제, 논리 회로를 알아보는 첫걸음으로 AND 게이트를 보자.
AND 게이트는 입력 2개, 출력 1개이다. 아래 그림과 같이 입력 신호와 출력 신호의 대응 표를 진리표라고 한다. 이 진리표는 두 입력이 모두 1일 때만 1을 출력하고, 그 외에는 0 을 출력한다.
이 AND 게이트를 퍼셉트론으로 표현하고 싶다면, [그림 2-2]의 진리표대로 작동하도록 하는 \(w_{1}\), \(w_{2}\), \(\theta\)의 값을 정하는 것이다. ( \(w_{1} \), \(w_{2} \), \(\theta\) )가 (0.3, 0.3, 0.8)일 때, (1.0, 1.0, 1,0)일 때와 같이 [그림 2-2]를 만족하는 매개변수 조합은 무한히 많다. 매개변수를 이렇게 설정하면 \(x_{1}\)과 \(x_{2}\) 모두가 1일 때만 가중 신호의 총합이 주어진 임계값을 웃돌게 된다.
AND 게이트 >>> 모든 입력이 모두 1일 때만 1을 출력, 그 외에는 0을 출력
2.2.2 NAND 게이트와 OR 게이트
NAND는 Not AND이다. 그 동작은 AND 게이트의 출력을 뒤집은 것이 된다. 진리표로 나타내면 [그림 2-3]처럼 \(x_{1}\)과 \(x_{2}\)가 모두 1일 때만 0을 출력하고, 그 외에는 1을 출력한다.
NAND게이트를 표현하려면 예를 들어 ( \(w_{1} \), \(w_{2}\), \(\theta\) ) = (-0.5, -0.5, -0.7) 조합을 포함한 무한한 조합이 있다.
사실 AND 게이트를 구현하는 매개변수의 부호를 모두 반전하면 NAND 게이트가 된다.
NAND 게이트 >>> 모든 입력값이 모두 1일때만 0을 출력, 그 외에는 1을 출력 (AND와 반대)
OR 게이트는 입력 신호 중 하나 이상이 1이면 출력이 1이 되는 논리 회로이다. 이 OR 게이트의 매개변수는 어떻게 설정하면 될까?
OR 게이트 >>> 입력 신호 중 하나 이상이 1이면 출력이 1이 되는 논리 회로
여기서 퍼셉트론의 매개변수(가중치, 세타) 값을 정하는 것은 컴퓨터가 아니라 인간이다. 인간이 직접 진리표라는 '학습 데이터'를 보면서 매개변수의 값을 생각한다. 기계학습에서는 이 매개변수의 값을 정하는 작업을 컴퓨터가 자동으로 한다. 학습이란 적절한 매개변수를 정하는 작업이며, 사람은 퍼셉트론의 구조(모델)을 고민하고 컴퓨터에 학습할 데이터를 주는 일을 한다.
이를 통해 퍼셉트론으로 AND, NAND, OR 논리 회로를 표현할 수 있다는 것을 알았다. 여기서 중요한 점은 퍼셉트론의 구조는 AND, NAND, OR 게이트 모두 똑같다는 것이다. 세 가지 게이트에서 다른 것은 매개변수의 값뿐이다.
즉 똑같은 구조의 퍼셉트론이 매개변수의 값만 적절히 조정하여 AND, NAND, OR로 변신하는 것이다.
2.3 퍼셉트론 구현하기
2.3.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
매개변수 w1, w2, theta는 함수 안에서 초기화하고, 가중치를 곱한 입력의 총합이 임계값을 넘으면 1을 반환하고 넘지 않는다면 0을 반환한다.
결과는 다음과 같다.
AND(0, 0) # 0을 출력
AND(1, 0) # 0을 출력
AND(0, 1) # 0을 출력
AND(1, 1) # 1을 출력
2.3.2 가중치와 편향 도입
앞에서 구현한 AND 게이트는 직관적이고 쉽지만, 앞으로를 생각해 다른 방식으로 수정하고자 한다.
그 전에 [식 2.1]의 \(\theta\)를 \(-b\)로 치환하면 퍼셉트론의 동작이 [식 2.2]처럼 된다.
[식 2.1]과 [식 2.2]는 기호 표기만 바꼈을 뿐, 의미는 같다. 여기에서 \(-b\)를 편향(bias)이라 하며 \(w_{1}\)과 \(w_{2}\)는 그대로 가중치이다. [식 2.2] 관점에서 해석하면, 퍼셉트론은 신호에 가중치를 곱한 값과 편향( \(-b\))를 합하여, 그 값이 0을 넘으면 1을 출력, 그렇지 않으면 0을 출력한다.
그럼 [식 2.2]를 파이썬 인터프린터로 순서대로 결과를 확인해보겠다.
2.3.3 가중치와 편향 구현하기
'가중치와 편향을 도입'한 AND 게이트는 다음과 같이 구현할 수 있다.
def AND(x1, x2):
x = np.array([x1, x2]) # 입력값
w = np.array([0.5, 0.5]) # 가중치
b = -0.7 # 편향
temp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
여기에서 -\(\theta\)가 편향 \(b\)로 치환되었다. \(w_{1}\)과 \(w_{2}\)는 각 입력 신호가 결과에 주는 영향력(중요도)를 조절하는 매개변수고, 편향은 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력) 하느냐를 조정하는 매개변수이다. 예를 들어 \(b\)가 -0.1이면 각 입력 신호에 가중치를 곱한 값들의 합이 0.1을 초과할 때만 뉴런이 활성화한다. 이처럼 편향의 값은 뉴런이 얼마나 쉽게 활성화되는지를 결정한다.
NAND 게이트
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
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
AND, NAND, OR 모두 같은 구조의 퍼셉트론이고, 차이는 가중치 매개변수의 값뿐이다.
2.4 퍼센트론의 한계
2.4.1 도전! XOR 게이트
XOR 게이트는 배타적 논리합이라는 논리 회로이다. [그림 2-5]와 같이 \(x_{1}\)과 \(x_{2}\) 중 한쪽이 1일 때만 1을 출력한다. (배타적: 자기 외에는 거부한다.)
사실 지금까진 본 퍼셉트론으로는 이 XOR 게이트를 구현할 수 없다. 왜 AND, OR은 되고 XOR은 안 될까?
우선 OR 게이트의 동작을 시각적으로 생각해보면, 예를 들어 가중치 매개변수가 ( \(b\), \(w_{1}\), \(w_{2}\) = (-0.5, 1.0, 1.0)일 때 [그림 2-4]의 진리표를 만족한다. 이때의 퍼셉트론은 [식 2.3]으로 표현된다.
[식 2.3]의 퍼셉트론은 직선으로 나뉜 두 영역을 만든다. 직선으로 나뉜 한쪽 영역은 1을 출력하고 다른 한쪽은 0을 출력한다. 이는 [그림 2-6]과 같다.
OR 게이트는 여러개의 입력값 중 하나 이상이 1이면 1을 출력한다. 그림에서는 0을 원(○), 1을 삼각형(△)으로 표시했다. OR 게이트를 만들려면 [그림 2-6]의 ○과 △을 직선으로 나눠야 한다. 위 그림의 직선도 네 점을 제대로 나누고 있는 것을 볼 수 있다.
그럼 XOR 게이트는 어떨까?
XOR 게이트에서는 [그림 2-7]의 ○과 △을 직선 하나로 나누기는 불가능하다.
XOR 게이트 >>> 두 입력값 중 한 쪽이1일때만 1을 출력한다.
입력이 3개 이상이라면 어떻게 될까?
입력이 3개 이상일 때도 입력에서 1의 갯수가 홀수이면 출력이 1이고 짝수이면 출력이 0이다.
2.4.2 선형과 비선형
직선 하나로는 [그림 2-7]의 ○과 △을 나눌 수 없지만 곡선으로는 가능하다.
퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 있다. [그림 2-8] 같은 곡선은 표현할 수 없다는 것이다. [그림 2-8]과 같은 곡선의 영역을 비선형 영역, 직선의 영역을 선형 영역이라고 한다.
2.5 다층 퍼셉트론이 출동한다면
퍼셉트론으로는 XOR 게이트를 표현할 수 없었다. 하지만 층을 쌓아 만드는 다층 퍼셉트론(multi-layer-perception)으로 표현한다면 XOR 게이트를 표현 할 수 있다.
2.5.1 기존 게이트 조합하기
XOR 게이트를 만드는 방법은 다양하다. 그중 하나는 앞서 만든 AND, NAND, OR 게이트를 조합하는 방법이다. 여기에는 AND, NAND, OR 게이트를 [그림 2-9]\와 같은 기호로 표기한다. 참고로 NAND 게이트 출력부에 있는 ○ 기호는 출력을 반전한다는 뜻이다.
그럼 XOR 게이트를 만들려면 AND, NAND, OR을 어떻게 조합할까? [그림 2-10]의 '?'에 세 가지 게이트를 하나씩 대입하면 XOR을 완성할 수 있다.
CF) 앞에서 말한 퍼셉트론의 한계는 "단층 퍼셉트론(single-layer-perceptron)으로는 XOR 게이트를 표현할 수 없다" 또는 "단층 퍼셉트론으로는 비선형 영역을 분리할 수 없다"가 된다. 앞으로는 퍼셉트론을 조합해, 즉 층을 쌓아서 XOR 게이트를 구현한다.
[그림 2-11]과 같은 조합이라면 XOR 게이트를 구현할 수 있다. \(x_{1}\)과 \(x_{2}\)가 입력신호, \(y\)가 출력 신호이다. \(x_{1}\)과 \(x_{2}\)는 NAND와 OR 게이트의 입력이 되고, NAND와 OR 의 출력이 AND 게이트의 입력으로 이어진다.
그럼 [그림 2-11]의 조합이 정말 XOR을 구현하는지 보자. NAND의 출력을 \(s_{1}\), OR의 출력을 \(s_{2}\)로 해서 진리표를 만들면 [그림 2-12]처럼 된다. \(x_{1}\), \(x_{2}\), \(y\)에 주목하면 분명이 XOR의 출력과 같다.
2.5.2 XOR 게이트 구현하기
이어서 [그림 2-11]처럼 조합된 XOR 게이트를 파이썬으로 구현해보겠다. 지금까지 정의한 AND, NAND, OR을 사용하면 다음과 같이 쉽게 구현할 수있다.
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(x1, x2)
return y
이 XOR 함수는 기대한 대로의 결과를 출력한다.
XOR(0, 0) # 0을 출력
XOR(1, 0) # 1을 출력
XOR(0, 1) # 1을 출력
XOR(1, 1) # 0을 출력
AND, NAND, OR을 쌓아서 만든 지금 구현한 XOR을 뉴런을 이용한 퍼셉트론으로 표현하면 [그림 2-13]처럼 된다.
XOR는 [그림 2-13]과 같은 다층 구조 네트워크이다. 왼쪽부터 차례로 0층, 1층, 2층이라고 부르겠다.
AND, OR가 단층 퍼셉트론인데 반해 XOR은 2층으로 이루어진 다층 퍼셉트론이다.
cf) [그림 2-13]의 퍼셉트론은 모두 3층으로 구성되지만, 가중치를 갖는 층은 사실 2개뿐이니 '2층 퍼셉트론'이라고 부른다. 문헌에 따라서는 구성 층의 수를 기준으로 '3층 퍼셉트론'이라 하는 경우도 있다.
이처럼 단층 퍼셉트론으로는 표현하지 못한 것을 층을 하나 늘려 구현할 수 있다. 퍼셉트론은 층을 쌓아(깊게 하여) 더 다양한 것을 표현할 수 있다.
2.7 정리
- 퍼셉트론은 입출력을 갖춘 알고리즘이다. 입력을 주면 정해진 규칙에 따른 값을 출력한다
- 퍼셉트론에서는 '가중치(\(w\))'와 '편향(\(b\))'을 매개변수로 설정한다.
- 퍼셉트론으로 AND, OR 게이트 등의 논리 회로를 표현할 수 있다.
- XOR 게이트는 단층 퍼셉트론으로는 표현할 수 없다
- 2층 퍼셉트론을 이용하면 XOR 게이트를 표현할 수 있다.
- 단층 퍼셉트론은 직선형 영역만 표현할 수 있고, 다층 퍼셉트론은 비선형 영역도 표현할 수 있다.
- 다층 퍼셉트론은 (이론상) 컴퓨터를 표현할 수 있다.
'Data Science > 밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글
데이터에서 학습한다! (0) | 2023.07.15 |
---|---|
Chapter 3.4 3층 신경망 구현하기 (1) | 2023.05.25 |
Chapter 3.3 다차원 배열의 계산 (0) | 2023.05.24 |
Chapter 3.2 활성화 함수 (0) | 2023.05.24 |
Chapter 3.1 퍼셉트론에서 신경망으로 (0) | 2023.05.23 |