본문 바로가기

AI/밑바닥부터 시작하는 딥러닝

Chapter 2. 퍼셉트론

이 게시물은 밑바닥부터 시작하는 딥러닝 1권을 바탕으로 작성되었습니다.


2. 1 퍼셉트론이란?

퍼셉트론(perceptron)은 프랑크 로젠블라트(Frank Rosenblatt)가 1957년에 고안한 알고리즘입니다. 퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력합니다. 예를 들어 신호가 흐르면 1, 신호가 흐르지 않으면 0 으로 출력하는 경우입니다.

 

입력이 2개인 퍼셉트론

그림은 입력으로 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

XOR 게이트의 출력을 나타낸 그래프

지금까지의 퍼셉트론(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