퍼셉트론
퍼셉트론(인공 뉴런, 단순 퍼셉트론)은 다수의 신호를 입력으로 받아 하나의 신호를 출력하는 것이다.
흐른다 / 안 흐른다 (1, 0)의 두 가지 값을 가질 수 있다.
x는 입력 신호, y는 출력 신호, w는 가중치를 뜻함, 그림의 원을 뉴런이나 노드라고 부른다.
입력 신호가 뉴런에 보내질 때 각각 고유한 가중치가 곱해짐(w*x). 뉴런에서 보낸 신호의 총합이 정해진 한계를 넘어서면 1을 출력함('뉴런이 활성화한다'라고도 함). 한계를 임계값이라 하며, Θ 기호로 나타낸다.
이를 수식으로 나타내면 다음과 같다.
y = 0 (w1x1 + w2x2 <= Θ)
y = 1 (w1x1 + w2x2 > Θ)
논리 회로
퍼셉트론을 활용하여 논리 회로를 표현할 수 있다.
AND 게이트
x1 | x2 | y |
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
두 입력이 모두 1일 때만 1을 출력, 그 이외에는 0을 출력한다.
이를 퍼셉트론으로 표현하면, (w1, w2, Θ)를 (0.5, 0.5, 0.7), (0.5, 0.5, 0.8), (1.0, 1.0, 1.0) 등으로 AND 게이트를 만족하는 무한이 많은 조합을 만들 수 있다.
NAND 게이트와 OR 게이트
x1 | x2 | y |
0 | 0 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
이를 퍼셉트론으로 표현하면 (-0.5, -0.5, -0.7) 등의 조합이 있다. 간단한 방법으로는 AND 게이트 매개변수의 부호를 모두 반전하면 NAND 게이트가 된다.
x1 | x2 | y |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
퍼셉트론 구현하기
def Default_AND(x1, x2): #일반 AND 게이트
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(Default_AND(0, 0))
print(Default_AND(1, 0))
print(Default_AND(0, 1))
print(Default_AND(1, 1))
0
0
0
1
기본적인 AND 게이트
기본적인 AND 게이트이다. 가중치를 곱한 입력의 총합이 입계값을 넘으면 1을 반환하고 그 외에는 0을 반환한다.
가중치와 편향 도입
먼저 Θ를 -b로 치환하면 다음과 같은 식이 된다.
y = 0 (b + w1x1 + w2x2 <= 0)
y = 1 (b + w1x1 + w2x2 > 0)
이 b를 편향이라고 하며 가중치의 역할은 입력 신호가 주는 영향력(중요도)를 조절하는 매개변수이고 편향은 뉴런이 얼마나 쉽게 활성화(결과롤 1을 출력)하느냐를 조정하는 매개변수이다.
def AND(x1, x2): #가중치와 편향을 도입한 AND 게이트
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
가중치와 편향을 도입한 AND 게이트
def NAND(x1, x2): #가중치와 편향을 도입한 NAND 게이트
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
가중치와 편향을 도입한 NAND 게이트
def OR(x1, x2): #가중치와 편향을 도입한 OR 게이트
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
가중치와 편향을 도입한 OR 게이트
퍼셉트론의 한계
예를 들어, OR 게이트가 (b, w1, w2) = (-0.5, 1.0, 1.0) 일 때 퍼셉트론 식을 다음과 같이 표현할 수 있다.
y = 0 (-0.5 + x1 + x2 <= 0)
y = 1 (-0.5 + x1 + x2 > 0)
이를 시각화할 경우 다음과 같이 표현된다.
그림에서는 0을 원(o), 1을 삼각형(△)으로 표시하였는데, OR 게이트를 제작하기 위해서는 o와 △을 직선으로 나눠도 제작할 수 있다. 하지만 XOR의 경우는 그렇지 않다.
XOR의 경우, o와 △을 직선으로 나눌 수 없다. 그렇기에 직선이 아닌, 곡선을 사용하여 나누어야 한다.
이와 같은 곡선의 영역을 비선형 영역, 직선의 영역을 선형 영역이라고 한다.
다층 퍼셉트론
퍼셉트론만으로는 XOR 게이트를 표현할 수 없지만, 층을 쌓아 다층 퍼셉트론으로 표현하는 것은 가능하다. 기존 AND, NAND, OR 게이트를 사용하여 XOR 게이트를 구현하는 것이 가능하기 때문이다.
이를 통해 제작한 XOR 게이트의 진리표는 다음과 같다.
x1 | x2 | s1 | s2 | y |
0 | 0 | 1 | 0 | 0 |
1 | 0 | 1 | 1 | 1 |
0 | 1 | 1 | 1 | 1 |
1 | 1 | 0 | 1 | 0 |
이어서 XOR 게이트는 이전 제작한 AND, NAND, OR를 사용하여 쉽게 구현하는 것이 가능하다.
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
XOR(0, 0)
XOR(1, 0)
XOR(0, 1)
XOR(1, 1)
0
1
1
0
AND, NAND, OR을 사용한 XOR 게이트
XOR은 그림과 같은 다층 구조의 네트워크이다. 왼쪽부터 차례대로 0층, 1층 2층이라고 부른다.
이 퍼셉트론은 이전에 제작한 AND, OR과 같은 단층 퍼셉트론과는 형태가 다른 2층 퍼셉트론이다. 이러한 층이 여러 개인 퍼셉트론을 다층 퍼셉트론이라 한다.
이러한 다층 퍼셉트론처럼 층을 쌓아 다양한 것을 표현할 수 있으며, 단층 퍼셉트론으로는 표현하지 못한 것을 표현할 수 있다.
'프로그래밍 > 책' 카테고리의 다른 글
밑바닥부터 시작하는 딥러닝 1장 (0) | 2024.07.31 |
---|