4 minute read

1. 퍼셉트론의 동작

  • 0: 신호가 흐르지 않는다
  • 1: 신호가 흐른다 퍼셉트론 신호는 위 두가지의 값을 가질 수 있다.

A perceptron that receives two inputs

이 퍼셉트론의 동작을 수식으로 표현하면 이렇게 표현할 수 있다.

\[y = \begin{cases} 0 \space (w_1x_1 + w_2x_2 \le \theta) \\ 1 \space (w_1x_1 + w_2x_2 \gt \theta) \end{cases}\]

위 수식을 설명하자면, 뉴런에서 보내온 신호의 총합이 정해진 한계(임계값인 세타)를 넘어설 때만 1을 출력한다. 이를 뉴런이 활성화한다라고 표현한다.

초기 퍼셉트론은 인간이 학습데이터를 보면서 적절한 매개변수의 값을 결정하지만, 그러나 기계학습은 매개변수의 값을 정하는 작업을 컴퓨터가 자동으로 하도록 한다.

퍼셉트론의 가중치는 값이 클수록 강한 신호를 흘려보낸다고 생각하면 된다.

학습(learning)이란

학습이란 적절한 매개변수 값을 정하는 작업이며, 사람은 퍼셉트론의 구조(모델)를 고민하고 컴퓨터에 학습할 데이터를 주는 일을 한다.

이 성질을 통해 퍼셉트론으로 AND, NAND, OR 논리 회로를 표현할 수 있다. 핵심은 퍼셉트론의 구조는 변하지 않으며 매개변수(가중치, 임계값)에 따라 AND, NAND, OR로 작동이 가능한 것이다.


2. 퍼셉트론을 활용한 논리회로 구현

진리표는 입력 신호와 출력 신호의 대응을 표로 그린 것이며, AND 게이트의 진리표는 이와 같다.

image

AND게이트 역할의 퍼셉트론 코드 구현

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
    
print(AND(0, 0))
print(AND(1, 0))
print(AND(0, 0))
print(AND(1, 1))

위 코드에서는 \(w_1\), \(w_2\), \(\theta\)를 (0.5, 0.5, 0.7)로 설정했지만, 이 외에도 (0.5, 0.5, 0.8), (1.0, 1.0, 1.0)로 설정해도 퍼셉트론이 AND게이트 역할을 하게끔 만들 수 있다.

출력결과는 0, 0, 0, 1로 AND게이트의 역할이 제대로 동작되고 있는 것을 확인할 수 있다.

가중치와 편향 도입

NAND와 OR게이트 역할을 하는 퍼셉트론 가중치를 설정하기 전에 퍼셉트론에 가중치와 편향을 적용시켜보자. (편향을 적용시키는 이유는 퍼셉트론 개념에서 추가 작성하여 링크 추가하도록 하자.)

앞에서 구현한 AND 게이트에서 \(\theta\)를 \(-b\)로 치환하여 식을 표현하면 다음과 같다.

\[y = \begin{cases} 0 \space (b + w_1x_1 + w_2x_2 \le 0) \\ 1 \space (b + w_1x_1 + w_2x_2 \gt 0) \end{cases}\]

식에 대한 설명을 해보자면 세타를 -b로 치환한 뒤, 위치를 옮겨주어 우측항에 0만 남기면 위와 같이 식이 된다.

  • 기호 표기만 바뀌었을 뿐 이전 식과 의미는 같다.
  • 퍼셉트론은 입력 신호에 가중치를 곱한 값과 편향을 합하여, 그 값이 0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력한다.

수식 정리

퍼셉트론 판별 기본식은 다음과 같다. \[w_1x_1 + w_2x_2 < \theta\]

이 퍼셉트론 식이 AND 게이트 역할을 하도록 w와 theta에 값을 대입하면 아래처럼 된다. \[0.5x_1 + 0.5x_2 <= 0.7\]

0.7을 좌변으로 넘겨 식을 정리하면 다음과 같다. \[-0.7 + 0.5x_1 + 0.5x_2 <= 0\] 이를 theta를 -b로 치환했다고 한다. 즉, theta를 좌변으로 넘겨 0.7이 -0.7이 되었다고 세타를 -b로 치환했다고 말하는 것 같다.

  • 그래서 theta를 임계값으로 사용할 때는 weighted sum값이 0.7을 넘는지 안넘는지로 판단한다.
  • 그러나, theta를 다른 항으로 넘겨 계산하여 식에 -0.7의 bias를 더하는 식으로 계산된다.

이를 넘파이를 이용해 위 식의 방식으로 구현해 보자.

numpy를 이용한 AND 퍼셉트론 구현

import numpy as np

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

print(AND(0, 0))
print(AND(1, 0))
print(AND(0, 0))
print(AND(1, 1))

NAND, OR 게이트 역할을 하는 퍼셉트론 구현하기

NAND 퍼셉트론

import numpy as np

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
    
print(NAND(0, 0))
print(NAND(1, 0))
print(NAND(0, 1))
print(NAND(1, 1))

OR 퍼셉트론

import numpy as np

def OR(x1, x2):
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5])
    b = -0.2
    tmp = np.sum(x*w) + b

    if (tmp <= 0):
        return 0
    else:
        return 1
    

print(OR(0, 0))
print(OR(1, 0))
print(OR(0, 1))
print(OR(1, 1))


3. 선 긋기

AND 퍼셉트론의 직선 그리기

image

AND 퍼셉트론에 대해 선을 그은 결과는 위 이미지와 같은데, 수식은 같은 것이지만 부호만 조금 다르게 사용했다. desmos에선 x와 y에 대해서만 그래프를 그릴 수 있기 때문에 부호 변경을 한 것이다.

부호의 값은 다음과 같다.

  • (desmos의 부호 = 기존 퍼셉트론의 식)
  • \(x = x1\),   \(y = x2\),   \(\theta = 0.7\),   \(b = -0.7\),   \(w1 = 0.5\),   \(w2 = 0.5\)
  • b는 단지 theta에 -가 붙은것인데, 이는 단순히 theta를 b라는 이름으로 바꾼 것이고 좌변으로 넘겨주며 -부호가 붙어서 그렇다.

기존 수식을 직선의 방정식에서 AND 게이트 퍼셉트론의 직선으로 변하는 과정을 표현하면 이와 같다. \[w_1x_1 + w_2x_2 = \theta \] \[0.5x + 0.5y = 0.7 \] \[-0.7 + 0.5x + 0.5y = 0 \] 여기서 -0.7을 \(\theta \)를 \(-b\)로 치환했다고 한다. \[-0.5y = 0.5x - 0.7 \] \[0.5y = -0.5x + 0.7 \]

NAND 퍼셉트론의 직선 그리기

image

  • \(w1 = -0.5\),   \(w2 = -0.5\),   \(b = 0.7\)

\[-0.5x - 0.5y + 0.7 = 0\] \[-0.5y = 0.5x - 0.7 \] \[0.5y = -0.5x + 0.7 \]


OR 퍼셉트론의 직선 그리기

image

  • \(w1 = 0.5\),   \(w2 = 0.5\),   \(b = -0.2\)

\[0.5x + 0.5y - 0.2 = 0 \] \[0.5y = -0.5x + 0.2 \]


Multi layer perceptron

다음은 Multi layer perceptron(MLP)를 알아보자. 단층 퍼셉트론은 linear하기에 non-linear한 문제를 풀 수 없다. non-linear한 대표적인 문제가 XOR문제이며, 이를 MLP를 통해 어떻게 해결했는지 알아보자.

참고자료

https://wikidocs.net/24958
https://89douner.tistory.com/22
https://ayoteralab.tistory.com/entry/ANN-01-Single-Layer-Perceptron
밑바닥부터 시작하는 딥러닝