[딥러닝(DL)]퍼셉트론(Perceptron)(1) - 불 논리 함수, 단층 퍼셉트론의 한계, 퍼셉트론 구현, 퍼셉트론 동작의 기하학적 의미

Jihwan Jung·2022년 8월 5일
1

🧠딥러닝

목록 보기
1/9
post-thumbnail

💡오늘 배울 내용


오늘은 프랑크 로젠블라크가 1957년에 고안한 알고리즘인 퍼셉트론에 대해 공부합니다. 퍼셉트론은 딥러닝(신경망)의 기원이 되는 알고리즘으로 딥러닝을 공부하는 중요한 아이디어가 될 것입니다. 앞으로의 포스팅은 도쿄 대학 대학원을 졸업하신 사이토 고키(齋藤康毅) 작가님과 타리크 라시드(Tariq Rashid) 개발자님의 저서들을 참고하여 공부하고, 복습 차원에서 작성함을 밝힙니다.

🔎퍼셉트론


<퍼셉트론(Perceptron)>
다수의 신호(입력) ➡ 하나의 신호(출력)

퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력합니다. 퍼셉트론의 신호는 흐른다, 안 흐른다와 같이 두개의 값을 가질 수 있습니다. 흐른다는 1에 대응되고, 안 흐른다는 0에 대응됩니다.

입력이 2개인 퍼셉트론을 살펴봅시다. 그림의 원을 뉴런 혹은 노드라고 부릅니다.

앞서 퍼셉트론의 알고리즘을 '다수의 신호를 받아 하나의 신호를 출력'한다고 정의했던 것 처럼, 해당 그림에서도 두개의 입력(x1, x2)을 통해 하나의 출력값(y)을 만들어내는 것을 확인할 수 있습니다. 그렇다면, 해당 출력값 y는 어떻게 도출되는 것일까요?

y값의 도출을 위해, 퍼셉트론의 매개변수를 도입해야합니다. 바로 w1, w2와 θ가 그것입니다.
각각은 x1에 대응되는 가중치, x2에 대응되는 가중치, 그리고 임계값입니다.

<퍼셉트론의 구성>
x1 : 입력값
x2 : 입력값
y : 출력값
w1 : x1에 대응되는 가중치
w2 : x2에 대응되는 가중치
θ : 임계값

가중치(w)는 신호의 세기를 조절하는 것으로, 출력값에 미치는 입력값의 영향력을 조절하는 값입니다. 전류에서 저항은 전류의 흐름을 억제하는 매개변수인 것 처럼, 퍼셉트론에서 가중치는 신호의 세기를 조절하는 역할을 합니다. 상식적으로, 가중치가 큰 값을 가질수록 해당 뉴런의 영향력이 커진다고 할 수 있을 것입니다.

다시 y값의 도출로 돌아가서, y값 또한 신호임으로 0과 1중 하나의 값을 갖게됩니다. 그렇다면 0과 1은 어떻게 결정되는 것일까요? 바로, 입력 신호가 뉴런에 보내질 때는 각각 고유한 가중치가 곱해지는데, 뉴런에서 보내온 이러한 값들(신호)의 총합이 임계값을 넘을때 1을 출력합니다. 1을 출력되는 것을 뉴런이 활성화 된다고 표현하기도 합니다.

퍼셉트론의 동작원리와 구성에 대한 설명은 이쯤으로 하고, 퍼셉트론을 수식으로 나타낸 결과를 확인해보겠습니다.

🔎불 논리 함수


불 논리(Boolean logic)는 디지털 회로 설계에 사용되는 논리적 산법에 대수체계입니다.

<결론> 퍼셉트론으로 AND, NAND, OR게이트를 표현할 수 있다. 그 방법은 퍼셉트론의 매개변수인 w1, w2, θ을 조정하여 이루어진다. 퍼셉트론으로 불 논리 함수를 표현할 수 있는 것은 퍼셉트론도 해당 불 논리함수와 같이 두개의 입력과 하나의 결과를 갖기 때문이다.

🔔AND 게이트


먼저 AND 게이트를 살펴보겠습니다. AND 게이트는 입력이 둘이고 출력이 하나입니다. 그래서 퍼셉트론을 가져와 AND 게이트를 표현해볼 수 있는 것입니다.

AND 게이트는 두개의 입력이 모두 1일때만 1이라는 결과가 출력되고, 나머지 경우에는 0이 출력됩니다. 그렇다면 퍼셉트론으로 AND 게이트의 동작과 정확히 같은 동작을 하도록 만들려면(퍼셉트론의 입력값으로 1과 1이 들어왔을때만 1이 출력되고, 0과 0, 0과 1, 1과 0이 입력값으로 들어오면 0이 출력되도록)어떻게 해야할까요?

자 우선 퍼셉트론에서 우리가 조정할 수 있는 매개변수들을 다시 살펴봅시다. 퍼셉트론을 구성하는 요소들은 입력(x1, x2, x..., )과 출력(y), 그리고 가중치(w), 임계값(θ)이 있습니다. 이중 우리가 조정할 수 있는 매개변수는 가중치와 임계값인데, 이 세 값(w1, w2, θ)을 어떻게 하느냐에 따라 퍼셉트론이 어떤 수를 출력할지 결정된다고 할 수 있습니다.

가령, (w1, w2, θ)가 (0.5, 0.5, 0.8)로 설정되면, AND 게이트의 동작과 같은 동작을 퍼셉트론이 수행하도록 만들 수 있습니다. 이렇게 하면 x1과 x2가 1일때만 가중 신호의 총합이 주어진 임계값을 넘게 됩니다. 이러한 조합은 무수히 많이 찾을 수 있습니다.

어래처럼 파이썬으로 AND 게이트를 구현할 수도 있습니다.

def AND(x1, x2):
	w1, w2, theta = 0.5, 0.5, 0.8
    tmp = x1*w1 + x2*w2 #입력값과 가중치를 곱해 신호의 총합을 계산
    if tmp <= theta: #신호의 총합이 임계값을 넘지 못하면
    	return 0
    elif tmp > theta: #신호의 총합이 임계값을 넘으면
    	return 1

제가 이 부분 개념을 공부하며 해당 매개변수가 퍼셉트론에 어떠한 규칙성을 제공하는지, 해당 게이트를 표현할때 어떻게 매개변수를 결정할 수 있는지에 대해 궁금해 했었는데, 이러한 의문은 조금 더 가야 해결할 수 있습니다. 결론을 미리 말하자면, 퍼셉트론의 매개변수는 1차 방정식을 작성하는 매개변수가 될 수 있고, 퍼셉트론은 선형분류자(직선)으로써 작용하는 것입니다.

🔔NAND 게이트 / OR게이트


(x1, x2, θ)을 적절히 조절하면, NAND 게이트와 OR 게이트 또한 표현할 수 있습니다. 즉, x1과 x2가 들어왔을때 1이 출력되는 영역과 0이 출력되는 영역을 퍼셉트론(=선형분류자 =직선)이 나눠 줄 수 있다는 것입니다.

🔎가중치와 편향 도입


퍼셉트론의 매개변수로 가중치와 임계값을 썼다면, 이제 임계값 θ를 -b로 치환하여 사용하겠습니다. b를 편향(bias)이라고 하며 퍼셉트론은 신호에 가중치를 곱한 값과 편향을 합하여 그 값이 0을 넘으면 1을 출력하고, 그렇지 않으면 0을 출력합니다.

또한 앞으로는 파이썬 라이브러리 넘파이를 사용하여 퍼셉트론을 구현할 것입니다.

import numpy as np
x = np.array([0, 1])
w = np.array([0.5, 0.5])
b = -0.8 #θ = 0.8
w*x
>> array([0, 0.5])
np.sum(w*x)
>> 0.5
np.sum(w*x) + b
>> -0.19999999999999996 #대략 -0.2

그렇다면, 가중치와 임계값을 이용해 나타냈던 퍼셉트론과 가중치와 편향을 이용해 나타냈던 퍼셉트론은 무엇이 다를까요? 그 전과 완전히 같은 원리로 작동하지만, 단순히 임계값을 다른 문자로 치환하여 이항하였다는 차이만 있습니다. 구체적으로 가중치는 각 입력 신호가 결과에 주는 영향력(중요도)을 조절하는 매개변수고, 편향은 뉴런이 얼마나 쉽게 활성화하느냐를 조정하는 매개변수입니다. 편향이 높다는 말은 임계값이 낮다는 말인데(b = -θ) 편향이 높을수록 쉽게 활성화된다는 뜻입니다.

🔔AND 게이트


넘파이를 이용하여 AND 게이트를 구현해봅니다. 퍼셉트론을 구성하는 매개변수는 앞서서 도입한 가중치와 편향을 사용했습니다.

def AND(x1, x2):
	x = np.array([x1, x2]) #입력값을 묶어놓은 1차원 배열
    w = np.array([0.5, 0.5]) #가중치를 묶어놓은 1차원 배열
    b = -0.7
    tmp = np.sum(w*x) + b #np.sum(w*x) == x1*w1 + x2*w2
    if tmp <= 0:
    	return 0
    else: #tmp>0
    	return 1

🔔NAND 게이트


AND 게이트와 NAND 게이트는 가중치와 편향만 다르다는 것을 알 수 있습니다. 정확히는 값들이 -1배 차이가 나는데요, 이는 AND 게이트에 결과값을 반대로 하면 NAND 게이트 결과값이 나온다는 것과 관련이 있습니다.

def NAND(x1, x2):
	x = np.array([x1, x2]) #입력값을 묶어놓은 1차원 배열
    w = np.array([-0.5, -0.5]) #가중치를 묶어놓은 1차원 배열
    b = 0.7
    tmp = np.sum(w*x) + b #np.sum(w*x) == x1*w1 + x2*w2
    if tmp <= 0:
    	return 0
    else: #tmp>0
    	return 1

🔔OR게이트


def OR(x1, x2):
	x = np.array([x1, x2]) #입력값을 묶어놓은 1차원 배열
    w = np.array([0.5, 0.5]) #가중치를 묶어놓은 1차원 배열
    b = -0.2
    tmp = np.sum(w*x) + b #np.sum(w*x) == x1*w1 + x2*w2
    if tmp <= 0:
    	return 0
    else: #tmp>0
    	return 1

<결론> 파이썬 코드로 작성된 게이트의 구현에서도 알 수 있는 것 처럼 AND, NAND, OR은 모두 같은 구조의 퍼셉으론이고 차이는 가중치 매개변수 w, b의 차이만 있습니다.

🔎퍼셉트론의 한계


퍼셉트론이 기하학적으로 어떻게 동작하는지 이해하면, 왜 퍼셉트론이 XOR 문제를 해결할 수 없는지(왜 단층 퍼셉트론으로 XOR의 결과값을 분류할 수 없는지) 알 수 있게 됩니다.

🔔퍼셉트론의 기하학적 의미


앞에서 AND, OR, NAND 게이트를 구현했던 것 처럼, 이번에는 XOR 게이트를 구현해보자. 결론적으로 XOR 게이트는 단층 퍼셉트론으로 절대 구현할 수 없다. AND, OR, NAND 게이트와 XOR 게이트는 어떤 차이점이 있어서, 구현할 수 있고 없는 것일까?

XOR 게이트를 구현할 수 없는 이유를 설명하기 위해, 퍼셉트론이 어떤 구조로 동작하는 건지 시각적으로 확인해봅시다.

우리는 퍼셉트론의 작동 구조를 수식으로 나타낼 수 있었습니다.

OR 게이트를 표현하는데 사용되었던 매개변수들을 대입하여 수식을 다시 작성하면, 아래처럼 쓸 수 있습니다. 아래의 수식에서 (b, w1, w2)는 (-0.5, 1, 1)입니다.

수학에서 부등식의 영역이라는 개념을 가져오면 이 수식을 그래프로 바꿀 수 있게 됩니다. 가로축을 x1, 세로축을 x2로 하여 그린 그래프를 살펴봅시다.

다음 그래프를 보면 가로축을 x1, 세로축을 x2로 했을때, OR 게이트 처럼 (0, 0)인 부분은 0으로 (0, 1), (1, 1), (1, 0)인 부분은 1로 구분해주는 하나의 직선이 존재함을 알 수 있습니다. 여기서 시사할 수 있는 점은 '퍼셉트론의 동작 원리'를 기하적으로 이해할 수 있다는 것입니다. 퍼셉트론은 매개변수에 맞는 선형 분류자를 이용하여 0또는 1로 분류해주는 동작 원리를 갖는 것 입니다. 그래서 단층 퍼셉트론은 1차 직선의 방정식을 이용하여 분류를 함(0 또는 1로)을 알 수 있고, 여기서 직선은 선형분류자가 되는 것입니다.

<결론> 단층 퍼셉트론의 매개변수(b, w1, w2) => 1차 직선의 방정식의 매개변수(기울기, y절편)를 결정. 즉, 단층 퍼셉트론 = 선형 분류자(직선)로 동작함.

🔔단층 퍼셉트론과 XOR



XOR 게이트의 결과값을 위 그래프에 나타내보면 알 수 있지만, 결코 단층 퍼셉트론(=직선 =선형분류자)을 가져와 XOR 게이트의 결과값을 분류해낼 수 없습니다.

<결론> 단층 퍼셉트론의 동작 원리상, 직선(=선형분류자)로 해당 불 논리 함수(XOR 게이트)를 구현할 수 없습니다. 직선으로 0영역과 1영역을 나눌 수 없기 때문입니다.

profile
22.10月~24.07月 공군 암호병 복무중/ 사회 과학과 딥 러닝에 관심이 있는 학부생(CS&E)입니다. 기술과 사회에 대한 이해를 바탕으로, 비즈니스 감각과 기술적 역량을 함께 갖춘 인공지능 프로그래머•데이터 과학자로 성장하고 싶습니다.

0개의 댓글