[ Deep Learning from Scratch ] #2 - 퍼셉트론(perceptron)

부리또의 댄스·2024년 3월 16일
post-thumbnail

" 퍼셉트론은 신경망(딥러닝)의 기원이 되는 알고리즘이다. "

퍼셉트론을 배우는 것은 신경망과 딥러닝으로 나아가는 데 중요한 아이디어를 배우는 것이다.


2.1 퍼셉트론이란?

퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력한다. 여기서 '신호'란, '흐름'과 유사하다.

퍼셉트론 신호는 '흐른다(1)' 혹은 '안 흐른다(0)'의 두 가지 값을 가질 수 있다.


위의 그림은 입력으로 3개의 신호를 받은 퍼셉트론의 예이다.
xx, yy, zz입력신호이고, w1w_1, w2w_2, w3w_3가중치를 뜻한다.

그림의 원을 뉴런 혹은 노드라고 부른다.

퍼셉트론은 복수의 입력 신호 각각에 고유한 가중치를 부여한다. 가중치가 클수록 해당 신호가 그만큼 더 중요한 것이다.
입력 신호가 뉴런에 보내질 때는 각각 고유한 가중치가 곱해진다.
그림에서는 x×w0x\times w_0, y×w1y\times w_1, z×w2z\times w_2가 되는 것이다.

뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력한다.(이를 '뉴런이 활성화한다'라고 표현하기도 한다.)

그 한계를 종종 임계값이라 하며, θ\theta(theta) 기호로 나타낸다.


퍼셉트론의 동작 원리는 이게 전부이다! 이상을 수식으로 나타내면 다음과 같다.
y={0(w1x1+w2x2θ)1(w1x1+w2x2>θ)y = \begin{cases} 0 (w_1x_1 + w_2x_2 \leq \theta)\\ 1 (w_1x_1 + w_2x_2 > \theta) \end{cases}

2.2 단순한 논리 회로

2.2.1 AND 게이트

논리회로를 알아보는 첫걸음으로 AND 게이트를 살펴보자.
AND 게이트는 입력이 둘이고 출력은 하나이다.

x1x_1x2x_2yy
000
100
010
111

위와 같은 입력 신호와 출력 신호의 대응 표를 진리표라고 한다.
위와 같은 경우에는 AND 게이트의 진리표로, 두 입력이 모두 1일 때만 1을 출력하고 그 외에는 0을 출력한다.

이 AND 게이트를 퍼셉트론으로 표현하려면, 진리표대로 작동하도록 하는 w1w_1, w2w_2, θ\theta의 값을 정해야 한다.

사실 위의 진리표를 만족하는 매개변수 조합은 무수히 많다. 가령 (0.5, 0.5, 0.7)일 때, 또 (1.0, 1.0, 1.0)일 때 모두 AND 게이트의 조건을 만족한다.


2.2.2 NAND 게이트와 OR 게이트

이어서 NAND 게이트를 살펴보자.

NAND는 Not AND를 의미하며, 그 동작은 AND 게이트의 출력을 뒤집은 것이 된다.

x1x_1x2x_2yy
001
101
011
110

위의 진리표처럼 NAND 게이트는 x1x_1x2x_2가 모두 1일 때만 0을 출력하고, 그 외에는 1을 출력한다.

NADN 게이트를 만족하는 매개변수 조합 또한 무수히 많다. 사실 AND 게이트를 구현하는 매개변수의 부호를 모두 반전하기만 하면 NAND 게이트가 된다.


같은 흐름에서 OR 게이트도 생각해보자.
OR 게이트는 입력 신호 중 하나 이상이 1이면 출력이 1이 되는 논리 회로이다.

x1x_1x2x_2yy
000
101
011
111

이처럼 여러가지 게이트의 퍼셉트론 구조는 모두 동일하다. 다양한 게이트에서 다른 것은 매개변수(가중치와 임계값)의 값뿐이다.

즉, 똑같은 구조의 퍼셉트론이 매개변수의 값만 적절히 조정한다면 여러가지의 게이트를 구현할 수 있는 것이다.


2.3 퍼셉트론 구현하기

2.3.1 간단한 구현부터

이제 논리 회로를 파이썬으로 구현해보자.
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

2.3.2 가중치와 편향 도입

위에서 구현한 AND 게이트는 정확히 작동하지만, 더 효율적으로 바꿔볼 수 있다.

y={0(w1x1+w2x2θ)1(w1x1+w2x2>θ)y = \begin{cases} 0 (w_1x_1 + w_2x_2 \leq \theta)\\ 1 (w_1x_1 + w_2x_2 > \theta) \end{cases}

위에서 한번 작성한 적 있는 이 AND 게이트 수식에서, θ\thetab-b로 치환하면 다음과 같다.

y={0(b+w1x1+w2x20)1(b+w1x1+w2x2>0)y = \begin{cases} 0 (b + w_1x_1 + w_2x_2 \leq 0)\\ 1 (b + w_1x_1 + w_2x_2 > 0) \end{cases}

여기에서 bb편향(bias)이라고 한다.

해당 식의 관점에서 해석해보면, 퍼셉트론은 입력 신호에 가중치를 곱한 값과 편향을 합하여, 그 값이 0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력한다.

2.3.3 가중치와 편향 구현하기

위에서 '가중치와 편향을 도입'한 AND 게이트는 파이썬으로 다음과 같이 구현할 수 있다.

# 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

편향은 가중치 w1w_1, w2w_2와 기능이 다르다는 사실에 주의해야 한다.

[ AND 게이트에서의 변수의 기능 ]
1. w1w_1, w2w_2 : 각 입력 신호가 결과에 주는 영향력(중요도)를 조절하는 매개변수
2. b(bias)b(bias) : 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력)하느냐를 조절하는 매개변수

예를 들어 bb가 -0.1이면, 각 입력 신호에 가중치 w1w_1, w2w_2를 곱한 값들의 합이 0.1을 초과할 때만 뉴런이 활성화한다.

이처럼 편향의 값은 뉴런이 얼마나 쉽게 활성화되는지를 결정한다.

이어서 NAND 게이트와 OR 게이트를 구현해보자.

# 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
# 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

앞 절에서 AND, NAND, OR 게이트는 모두 같은 구조의 퍼셉트론이고, 차이는 가중치 매개변수의 값뿐이라고 하였다. 실제로 위의 코드를 보면, 다른 곳은 가중치와 편향 값을 설정하는 부분뿐임을 볼 수 있다.


2.4 퍼셉트론의 한계

2.4.1 도전! XOR 게이트

계속해서 XOR 게이트도 생각해보자.

XOR 게이트는 배타적 논리합이라는 논리 회로이다.
x1x_1, x2x_2한쪽만 1일 때만 1을 출력한다. XOR 게이트의 진리표는 다음과 같다.

x1x_1x2x_2yy
000
101
011
110

사실 지금까지 본 퍼셉트론으로는 이 XOR 게이트를 구현할 수 없다. 하나의 수식으로 XOR 게이트의 논리를 구현할 수가 없기 때문이다.

이렇게 하나의 직선으로 표현될 수 있는 위의 게이트들과 달리, XOR 게이트는 하나의 직선으로 표현하는 것이 불가능하다.

선형과 비선형

퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 있다.

이렇게 곡선으로 표현해야만 한다.

OR 게이트, NAND 게이트와 같은 직선의 영역을 선형영역, XOR 게이트와 같은 곡선의 영역을 비선형영역이라고 한다.
선형, 비선형 이라는 말은 기계학습 분야에서 자주 쓰이는 용어로, 위의 그래프들과 같은 이미지를 떠올리면 된다.


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

퍼셉트론으로는 XOR 게이트를 표현할 수 없었다.

하지만 게이트의 층을 쌓아 다층 퍼셉트론으로 구현할 수 있다.

우선 XOR 게이트 문제를 다른 관점에서 생각해보자.

2.5.1 기존 게이트 조합하기

XOR 게이트를 만드는 방법은 다양하다.
그중 하나는 앞서 만든 AND, NAND, OR 게이트를 조합하는 방법이다.

세 개의 게이트를 다음과 같은 기호로 표기한다.

그리고 다음과 같이 게이트를 조합한다면, 마침내 XOR 게이트를 구현할 수 있다.

x1x_1x2x_2는 NAND와 OR 게이트의 입력이 되고, NAND와 OR의 출력이 AND 게이트의 입력으로 이어진다.


위 그림의 조합이 정말 XOR 게이트를 구현하는지 살펴보자. NAND의 출력을 $s_1$, OR의 출력을 $s_2$로 해서 진리표를 만들면 다음과 같다. XOR 게이트의 원리에 맞게 동작하는 것을 확인할 수 있다.
x1x_1x2x_2s1s_1s2s_2yy
00100
10111
01111
11010

2.5.2 XOR 게이트 구현하기

이어서 XOR 게이트를 파이썬으로 구현해보자.
지금까지 정의한 함수 AND, NAND, OR를 사용하면 다음과 같이 쉽게 구현할 수 있다.

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


XOR은 위와 같은 다층 구조의 네트워크이다. 왼쪽부터 차례로 0층, 1층, 2층이라고 부른다.

AND, OR가 단층 퍼셉트론인 데 반해, XOR는 2층 퍼셉트론(사실 위에 그림은 모두 3층이지만, 가중치를 갖는 층은 사실상 2개이므로 2층 퍼셉트론이라고 한다)이다.

이처럼 층이 여러 개인 퍼셉트론을 다층 퍼셉트론이라고 한다.


이처럼 2층 퍼셉트론에서는 0층에서 1층으로 신호가 전달되고, 이어서 1층에서 2층으로 신호가 전달된다. 이 동작을 더 자세히 서술하면 다음과 같다.

[ 2층 퍼셉트론의 작동 원리 ]
1. 0층의 두 뉴런이 입력 신호를 받아 1층의 뉴런으로 신호를 보낸다.
2. 1층의 뉴런이 2층의 뉴런으로 신호를 보내고, 2층의 뉴런은 y를 출력한다.

이처럼 퍼셉트론은 층을 쌓아(깊게 하여) 더 다양한 것을 표현할 수 있다!

profile
환영합니다!

0개의 댓글