이 게시물은 밑바닥부터 시작하는 딥러닝 1권을 바탕으로 작성되었습니다.
2. 1 퍼셉트론이란?
퍼셉트론(perceptron)은 프랑크 로젠블라트(Frank Rosenblatt)가 1957년에 고안한 알고리즘입니다. 퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력합니다. 예를 들어 신호가 흐르면 1, 신호가 흐르지 않으면 0 으로 출력하는 경우입니다.
그림은 입력으로 2개의 신호를 받은 퍼셉트론의 예입니다. $x_1$, $x_2$ 는 입력 신호, $y$는 출력 신호, $w_1$, $w_2$는 가중치를 뜻합니다. 그림에서 원을 뉴런 혹은 노드 라고 부릅니다.
입력 신호가 뉴런에 보내질 때 각각 고유한 가중치가 곱해집니다. 뉴런에서 보내온 신호의 총 합이 정해진 한계를 넘어설 때만 1을 출력합니다. 이를 '뉴런이 활성화 한다'라 표현하기도 합니다. 이 책에서는 그 한계를 임계값이라 하며, $\theta$로 나타냅니다.
위 내용을 수식으로 나타내면 아래와 같습니다.(식1)
$$y=\begin{cases}0 & (w_1x_1 + w_2x_2 \leq \theta)\\1 & (w_1x_1 + w_2x_2> \theta)\end{cases}$$
위 식은 아래와 같은 방식으로도 표현 가능합니다.(식2)
$$y=\begin{cases}0 & (w_1x_1 + w_2x_2 + b \leq 0)\\1 & (w_1x_1 + w_2x_2 + b> 0)\end{cases}$$
두 식은 표기만 조금 바꿨을 뿐, 그 의미는 같습니다. 아래 식에서 $b$를 편향(bias)라 합니다.
2. 2 단순한 논리 회로와 간단한 구현
단순한 논리 회로의 진리표를 살펴보고 조건을 충족하는 퍼셉트론을 직접 코드로 구현 해보겠습니다.
2. 2. 1 AND 게이트
두 입력 모두 1일 때만 1을 출력하고, 그 외에는 0을 출력합니다.
AND 게이트 진리표
$x_1$ | $x_2$ | $y$ |
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
AND 게이트 구현
# 식 1
def and_gate(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7
tmp = w1*x1 + w2*x2
if tmp <= theta :
return 0
else:
return 1
# 식 2
def and_gate(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
2. 2. 2 NAND 게이트와 OR 게이트
NAND 게이트 진리표
두 입력 모두 1일 때만 0을 출력하고, 그 외에는 1을 출력합니다.
$x_1$ | $x_2$ | $y$ |
0 | 0 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
NAND 게이트 구현
# 식 1
def nand_gate(x1, x2):
w1, w2, theta = -0.5, -0.5, -0.7
tmp = w1*x1 + w2*x2
if temp <= theta:
return 0
else:
return 1
# 식 2
def nand_gate(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을 출력합니다.
$x_1$ | $x_2$ | $y$ |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
OR 게이트 구현
# 식 1
def or_gate(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.2
tmp = w1*x1 + w2*x2
if tmp <= theta:
return 0
else:
return 1
# 식 2
def or_gate(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
2. 3 퍼셉트론의 한계
만약 퍼셉트론으로 XOR 게이트를 구현한다고 생각해봅시다.
XOR 게이트 진리표
$x_1$ | $x_2$ | $y$ |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
지금까지의 퍼셉트론(and, or, nand)은 직선으로 두 출력값을 분류하는 문제였습니다. 하지만 위 그래프에서는 직선 하나로는 출력값을 분류할 수 없습니다.
하지만 직선이라는 제약을 없앤다면 분류 가능합니다.
위 그림과 같은 곡선의 영역을 비선형 영역이라 하고, 직선의 영역을 선형 영역이라고 합니다.
이러한 비선형 영역을 만들기 위해서 층 1개짜리 단층 퍼셉트론으로는 안된다는 것을 알았습니다. 따라서 이번에는 층을 쌓아 다층 퍼셉트론(multi-layer perceptron)을 만들어 XOR게이트를 구현해 보겠습니다.
우선 논리 게이트 기호에 대해 보겠습니다.
XOR 게이트는 위 3개의 게이트를 아래와 같이 조합하면 구현할 수 있습니다.
XOR 게이트의 진리표를 위 그림을 바탕으로 다시 작성 해보겠습니다.
$x_1$ | $x_2$ | $s_1$ | $s_2$ | $y$ |
0 | 0 | 1 | 0 | 0 |
1 | 0 | 1 | 1 | 1 |
0 | 1 | 1 | 1 | 1 |
1 | 1 | 0 | 1 | 0 |
XOR 게이트 구현
def xor_gate(x1, x2):
s1 = nand_gate(x1, x2)
s2 = or_gate(x1, x2)
y = and_gate(s1, s2)
return y
위 구현 내용을 그림으로 나타내면 다음과 같습니다.
XOR 게이트를 2층 퍼셉트론으로 구현한 것을 알 수 있습니다.
2장에서는 퍼셉트론의 개념과 간단한 논리 회로의 구현을 해봤습니다. 또한 하나의 퍼셉트론으로 구현할 수 없는 비선형 영역에 대해서는 층을 쌓는 다층 퍼셉트론을 이용하여 구현할 수 있었습니다.
'AI > 밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글
Chapter 7. 합성곱 신경망(CNN) (0) | 2022.09.16 |
---|---|
Chapter 5. 오차역전파법 (0) | 2022.09.16 |
Chapter 4. 신경망 학습 (1) | 2022.09.16 |
Chapter 3. 신경망 (0) | 2022.09.15 |