독학 연구소
공부한 내용을 정리합니다.
perceptron (1)
퍼셉트론(Perceptron)

퍼셉트론(Perceptron)

1957년 Frank Rosenblatt 가 고안한 알고리즘으로 인공 신경망의 기원이 됩니다.

 

뇌의 신경 세포인 뉴런(neuron)의 구조에서 수상돌기(dendrites)는 다른 신경 세포로부터 받은 신호를 축삭돌기(axon)을 통해 다른 뉴런이나 세포에 전달합니다. 이와 비슷한 기능을 하는 퍼셉트론은 다수의 입력 신호로부터 하나의 신호(0 또는 1)를 출력합니다.

 

 

다음은 2개의 입력 신호 $x_1, x_2$ 를 받아 신호 $y$ 를 출력하는 퍼셉트론입니다. 

 

 

여기서 $w_1, w_2$ 는 가중치(weight)를 의미하는데 이는 출력에 대해 각 신호에 주는 영향을 조절하는 요소입니다.

 

 

계산은 다음과 같으며 임계값 $\theta$ 을 기준으로 0과 1을 출력하는데 이를 이진 분류(binary classification)라고 합니다.

 

$y=
\begin{cases}
0 \ ( \, w_1 x_1 + w_2 x_2 \le \theta \ ) \\\\
1 \ ( \, w_1 x_1 + w_2 x_2 > \theta \ )
\end{cases}
$

 

또한 1을 출력하는 것을 뉴런을 활성화(activation)한다고 합니다. 

 

 

이어서 편향 $b$ 를 도입하기 위해 $\theta$ 를 $-b$ 로 치환하고 이항하면 다음과 같습니다. 

 

$y= 
\begin{cases} 
0 \ ( \, b + w_1 x_1 + w_2 x_2 \le 0 \ ) \\\\
1 \ ( \, b + w_1 x_1 + w_2 x_2 > 0 \ )
\end{cases} 
$

 

편향은 뉴런의 활성화를 조절하는 요소입니다. 예를 들어 $b$ 가 -1인 경우, $w_1 x_1 + w_2 x_2$ 의 값이 1을 초과할 때 뉴런이 활성화하고 $b$ 가 -10인 경우, $w_1 x_1 + w_2 x_2$ 의 값이 10을 초과해야 뉴런이 활성화합니다. 즉 얼마나 쉽게 활성화를 하는지를 조절하는 것입니다.

 

 

구현

퍼셉트론으로 논리 회로를 구현합니다.

 

 

AND Gate

 

모든 입력이 참인 경우에만 참을 출력합니다.

 

AND 게이트에 대한 진리표를 참고하여 임의의 가중치와 편향을 설정합니다.

 

import numpy as np

def AND(x1, x2):
    # inputs
    x = np.array([x1, x2])
    
    # weights
    w = np.array([0.4, 0.4])
    
    # bias
    b = -0.5
    
    z = np.sum(x*w) + b
    
    if z <= 0:
        return 0
    else:
        return 1
print(AND(0, 0))
print(AND(0, 1))
print(AND(1, 0))
print(AND(1, 1))
0
0
0
1

 

 

NAND Gate

 

AND 게이트와 반대로 모든 입력이 참인 경우에만 거짓을 출력합니다.

 

NAND 게이트에 대한 진리표를 참고하여 임의의 가중치와 편향을 설정합니다.

 

import numpy as np

def NAND(x1, x2):
    # inputs
    x = np.array([x1, x2])
    
    # weights
    w = np.array([-0.4, -0.4])
    
    # bias
    b = 0.5
    
    z = np.sum(x*w) + b
    
    if z <= 0:
        return 0
    else:
        return 1
print(NAND(0, 0))
print(NAND(0, 1))
print(NAND(1, 0))
print(NAND(1, 1))
1
1
1
0

 

 

OR Gate

 

하나 이상의 입력이 참인 경우에 참을 출력합니다.

 

OR 게이트에 대한 진리표를 참고하여 임의의 가중치와 편향을 설정합니다.

 

import numpy as np

def OR(x1, x2):
    # inputs
    x = np.array([x1, x2])
    
    # weights
    w = np.array([0.4, 0.4])
    
    # bias
    b = -0.3
    
    z = np.sum(x*w) + b
    
    if z <= 0:
        return 0
    else:
        return 1
print(OR(0, 0))
print(OR(0, 1))
print(OR(1, 0))
print(OR(1, 1))
0
1
1
1

 

 

선형과 비선형

계속해서 퍼셉트론으로 XOR 게이트를 구현할 수 있을까요?

 

XOR 게이트는 다음과 같은 진리표를 가지며 두 입력 중 하나의 입력이 참일 경우에만 참을 출력합니다.

 

 

퍼셉트론은 분류하고자 하는 두 영역을 직선으로 나누는 것으로 AND, NAN, OR 의 진리표에 만족합니다.

 

 

하지만 XOR 에서는 선형(linear)적인 직선으로는 입력에 대해 참과 거짓을 분류하지 못하는데 이러한 문제를 비선형(nonlinear) 문제라고 합니다.

 

 

 

 

다층 퍼셉트론(Multilayer Perceptron, MLP)

앞서 다룬 하나의 입력층과 출력층을 갖는 단층의 구조로는 비선형 문제에 해당하는 XOR 게이트를 구현하지 못했습니다. 

 

 

이를 해결하는 것이 다층 퍼셉트론으로 입력층과 출력층 사이에 은닉층(hidden layer)을 갖는 구조입니다. 

 

 

이 같은 구조로 기본 논리 게이트를 조합하여 XOR 을 구현할 수 있게 됩니다.

 

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

 

 

'머신러닝 > 딥러닝' 카테고리의 다른 글

교차 검증(Cross Validation)  (0) 2020.11.09
로지스틱 회귀(Logistic Regression)  (0) 2020.11.06
선형 회귀(Linear Regression)  (0) 2020.11.06
순전파와 역전파  (0) 2020.11.06
신경망 학습  (0) 2020.11.04
  Comments,     Trackbacks