이제라도 기록하기

[밑시딥1] Chapter2 퍼셉트론 본문

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

[밑시딥1] Chapter2 퍼셉트론

sssky00 2023. 8. 3. 18:00

해당 포스팅은 <밑바닥부터 시작하는 딥러닝1> 책을 기준으로 하며, 공부 기록 목적으로 작성되었습니다.

 

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


퍼셉트론

퍼셉트론은 프랑크 로젠블라트가 1957년에 고안한 알고리즘으로 신경망(딥러닝)의 기운이 되는 알고리즘이다.

퍼셉트론이란?

퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력하는 방식으로 구성되며 아래의 그림은 입력으로 2개의 신호를 받은 퍼셉트론의 예시이다. x는 입력 신호, y는 출력 신호, w(weight)는 가충치를 뜻하고, 원은 뉴런 혹은 노드라고 부른다.

그림 2-1

 

수식으로 나타내면 다음과 같다. 출력 신호가 정해진 합계를 넘어설 때에만 1을 출력한다. 식에서는 임계값이 곧 theta이다.

식 2.1

 

 

단순한 논리회로

AND 게이트

AND 게이트의 진리표를 작성하면 다음과 같다. AND 게이트는 두 입력이 모두 1일 때만 1을 출력하고, 그 외에는 0을 출력한다. 

그림 2-2

NAND 게이트

NAND는 Not AND를 의미하며, AND 게이트의 출력을 뒤집은 것과 동일하다. 모두 1일 때만 0을 출력하고 나머지는 1을 출력한다.

그림 2-3

OR 게이트

OR 게이트는 입력 신호 중 하나 이상이 1이면 출력이 1이 된다.

그림 2-4

퍼셉트론 구현하기

간단한 구현부터 - AND

매겨변수 w1, w2, theta는 함수 안에서 초기화하고, 가중치를 곱한 입력의 총합이 임계값을 넘으면 1을 반환하고 그 외에는 0을 반환한다.

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

가중치와 편향 도입

식 2.1의 θ를 -b로 치환하면 퍼셉트론의 동작이 식 2.2처럼 되며, 여기서 b를 편향(bias)라고 한다. 따라서, 입력 신호에 가중치를 곱한 값과 편향을 합하여, 그 값이 0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력한다. 

다시 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로 치환된 거 이외에는 같은 모양을 띄고 있다.

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

AND와는 가중치(w와 b)만 다르다.

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

퍼셉트론의 한계

XOR 게이트는 배타적 논리합이라는 논리 회로로 x1과 x2 중 한족이 1일 때만 1을 출력한다.

그림 2-5

지금까지 본 퍼셉트론으로는 이 XOR 게이트를 구현할 수 없다. 그 이유는 그림으로 설명할 수 있다.

 

XOR 퍼셉트론을 시각화하면 아래 그림과 같다. 앞서 봤던 AND, NAND, OR은 0을 출력하는 영역과 1을 출력하는 영역을 직선으로 나눌 수 있었던 반면, XOR는 직선으로 나누는 것이 불가능하고 곡선으로만 가능하다. 

앞서 본 퍼센트론으로 구현이 가능하려면 직선으로 나눌 수 있어야 하기 때문에 XOR는 퍼셉트론으로 구현이 불가능하다.

그림 2-8

 

다층 퍼셉트론이 출동한다면

층이 여러 개인 퍼셉트론을 다층 퍼셉트론이라고 한다. 퍼셉트론으로 층을 쌓아 다층 퍼셉트론을 만든다면  XOR도 구현이 가능하다.

기존 게이트 조합하기

앞서 만든 AND, NAND, OR 게이트를 아래와 같이 조합하면  XOR 게이트 구현이 가능하다. 

그림 2-9
그림 2-11

x1과 x2는 NAND와 OR 게이트의 입력이 되고 그 출력이 AND 게이트의 입력으로 이어진다.

그림 2-12

 

XOR 게이트 구현하기

지금까지 정의한 함수들로 XOR을 구현할 수 있다.

def XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y

 

XOR은 그림 2-13과 같은 다층 구조의 네트워크이다. AND, OR은 단층 퍼셉트론인 데 반해, XOR은 2층 퍼셉트론이다. 

그림 2-13

동작은 다음과 같다. 

1. 0층의 두 뉴런이 입력 신호를 받아 1층의 뉴런으로 신호를 보낸다.
2. 1층의 뉴런이 2층의 뉴런으로 신호를 보내고, 2층의 뉴런은 y를 출력한다.

 

정리

  • 퍼셉트론은 입출력을 갖춘 알고리즘으로 입력을 주면 정해진 규칠에 따른 값을 출력한다.
  • 퍼셉트론에서는 '가중치'와 '편향'을 매개변수로 설정한다.
  • 단층 퍼셉트론은 직선형 영역만 표현할 수 있고, 다층 퍼셉트론은 비선형 영역도 표현할 수 있다.
  • 단층 퍼셉트론으로 표현할 수 없는 부분을 다층 퍼셉트론으로 표현 가능한 경우도 있다.