DIY Data Science/MLDL

[Deep Learning][Deep Learning for Scratch] 퍼셉트론(Perceptron)

LydiaRyu 2021. 7. 26. 15:46
반응형
사이토 고키, 「밑바닥부터 시작하는 딥러닝」, 개앞맵시, 한빛미디어, Chapter 2의 내용을 정리하고 공부한 페이지입니다.

  

  • 퍼셉트론(Perceptron)

- 다수의 신호를 받아 하나의 신호를 출력한다.

- 흐른다 / 흐르지 않는다 두 가지 값을 가질 수 있다. (1 또는 0)

- 신경망의 기원이 되는 알고리즘이다.  

입력이 2개인 퍼셉트론 

 

왼쪽: 퍼셉트론 수식 / 오른쪽: 편향 수식 

입력 신호가 뉴런에 보내질 때 각각 고유한 가중치가 곱해진다. 뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력하고, 그 한계를 임계값(θ)라고 한다. 

 

→ 가중치가 클수록 해당 신호가 더 중요하다는 뜻이다.

 

θ를 -b로 치환하여 식을 작성하면, 오른쪽 수식과 같다. 이때, b는 편향이라고 하고 가중치를 곱한 값과 편향을 합하여 0을 넘으면 1을 출력하고 그렇지 않으면  0을 출력한다.

 

→ 가중치(w)는 각 입력 신호가 결과에 주는 영향력을 조절하는 매개변수이고, 편향(b)은 얼마나 쉽게 활성화하느냐를 조정하는 매개변수이다. 

 

  • AND 게이트

AND 게이트 진리표

입력이 모두 1일 때만 1을 출력하고, 그 외에는 0을 출력한다. 

 

# AND GATE

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

AND 게이트 출력 값

위의 코드는 편향으로 치환한 수식을 구현한 것이다. 출력 결과 진리표와 동일하게 산출된다. 

 

  • NAND 게이트

NAND 게이트 진리표

 Not AND의 의미로, AND 게이트의 출력을 뒤집은 상태와 같다. x1과 x 2가 1일 때만 0을 출력하고, 이외의 경우에는 1을 출력한다.

 

# NAND GATE

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

NAND 게이트 출력 값

NAND 게이트는 AND 게이트의 가중치와 편향의 부호만 다르게 작성한다. 산출 결과, AND 게이트의 출력 값과 반대로 출력되는 것을 확인할 수 있다.

 

  • OR 게이트

OR 게이트 진리표

모두 0일 때만 0이 출력되고, 하나 이상이 1이면 1을 출력한다. 

 

# OR GATE

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

OR 게이트 출력값

세 가지 게이트 모두 퍼셉트론은 같다. 매개변수(가중치, 임계값)에 따라서 게이트가 나뉘는 것이다! 작성된 코드를 보면 코드의 구조는 모두 같지만, 가중치와 편향 값만 달라지고 있다.

 

→ 따라서 우리는, 컴퓨터가 학습을 통해서 퍼셉트론의 매개변수의 값을 정하도록 퍼셉트론의 구조를 고민하고 컴퓨터에 데이터를 주는 일을 해야 한다. 

 

  • 퍼셉트론의 한계
  • XOR 게이트

XOR 진리표

XOR 게이트는 x1과 x2 중 한쪽이 1일 때만 1을 출력한다. (배타적 논리합) 지금까지의 퍼셉트론으로는 XOR게이트를 구현할 수 없다.

 

OR 퍼셉트론 시각화

OR 퍼셉트론의 경우 모두 0인 경우만 0을 출력하고, 나머지 경우에는 1을 출력하기 때문에 위의 그래프와 같이 출력 값이 0일 때와 1일 때를 직선으로 나눌 수 있다. (선형 영역)

XOR 퍼셉트론 시각화

 

그러나, XOR 퍼셉트론의 경우는 (0, 0), (1, 1) 일 때 0의 값을 가지고, (1, 0), (0, 1) 일 때 1의 값을 가지기 때문에 대각선으로 마주 본 형태이다. 직선으로 나눌 수 없는 형태이고, 곡선을 이용해서 나눠야 한다. (비선형 영역)

 

XOR 퍼셉트론은 단층 퍼셉트론으로는 만들 수 없고, 다층 퍼셉트론으로 만들 수 있다.

 

  • AND, NAND, OR 조합하여 XOR 퍼셉트론 만들기
    왼쪽: XOR 퍼셉트론 조합 / 오른쪽: 뉴런을 이용한 구현(다층 퍼셉트론)

NAND에서 출력한 결과인 s1과 OR에서 출력한 결과인 s2를 AND 퍼셉트론으로 구현하면 XOR의 결괏값이 나온다. 또한, 뉴런을 이용하여 구현한 그림에서 볼 수 있듯이 XOR은 다층 퍼셉트론이다. 

 

XOR 진리표

 

# XOR GATE

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

코드를 통해 NAND, OR, AND를 조합하여 작성한 결과도 진리표와 일치하게 출력되는 것을 확인할 수 있다. 

 

이처럼, 다층 퍼셉트론으로 복잡하고 다양한 회로들을 만들 수 있다. 심지어, 책 속에 NAND 게이트의 조합만으로 컴퓨터를 만들 수 있다는 이야기도 있다. 결론적으로, 퍼셉트론은 층을 거듭 쌓으면 비선형적인 표현도 가능하고 이론상으로는 컴퓨터가 수행하는 처리도 모두 표현할 수 있다.

728x90