본문 바로가기
밑바닥부터시작하는딥러닝

퍼셉트론

by Benihs 2023. 5. 16.

퍼셉트론이란?

퍼셉트론은 프랑크 로젠 블라트(Frank Rosenblatt)가 1957년에 고안해 1958년에 만들어진 알고리즘이다.

처음엔 기계장치로 만들어져 이미지 인식을 목적으로 만들었다.

퍼셉트론은 신경망(딥러닝)의 기원이 되는 알고리즘이기 때문에 딥러닝의 기초에 상당히 중요한 역할을 맡고 있다.

 

퍼셉트론은  Perception(지각하다) Neuron(뉴런)의 합성어로 그 이름에서도 알 수 있듯이 감각 기관을 통해 대상을 인식하는 뉴런을 뜻한다.

때문에 퍼셉트론을 배우기 전에 그 근간이 되는 뉴런이 인식하는 방법을 알고 가는 것이 나중에 이해할 때 도움이 된다.

 

퍼셉트론의 구조

퍼셉트론의 구조를 보기 전, 먼저 뉴런의 구조를 본다.

뉴런은 우리 몸에서 신경전달물질을 통해 신호를 전달하고 정보를 받아들이며 처리하는 역할을 한다.

크게 가지돌기(수상돌기), 핵, 신경세포제, 축삭돌기와 마지막으로 축삭말단으로 이루어진다.

 

자극(신호)을 받아들이는 방향은 가지돌기에서 축삭말단으로 간다.

 

뉴런의 중요 구성요소를 보면,

  • 신경 세포체 : 핵과 미토콘트리아를 가지고 있다. 대부분의 세포질이 모여있는 부분. 뉴런의 생명활동을 유지한다.
  • 가지돌기(수상돌기) : 신경 세포체에서 나온 짧은 돌기로 다른 뉴런이나 기관으로부터 자극을 수용한다.
  • 축삭돌기 : 신경 세포제에서 나온 긴 돌기로 인접한 뉴런이나 운동 기관에 자극을 전도, 전달한다.
  • 축삭말단 :  축삭의 말단 부위는 다른 축삭과 접촉하는 부위이다.
  • 시냅스 : 축삭말단의 접촉 부위로써 축삭말단에 전달된 신호를 다른 신경세포에 전달

뉴런은 이렇게 이루어지고 이런 신경세포들의 커다란 네트워크를 신경망이라고 부른다.

 

간단하게 뉴런의 구조를 알아봤다.

이제 뉴런을 퍼셉트론과 비교해 보자.

퍼셉트론은 다수의 신호를 입력받아 하나의 신호를 출력한다.

신경세포는 동그라미, 시냅스는 화살표로 표시한다.

이해하기 힘들다면 여기서 입력신호는 전류를 예시로 생각해 보자.

퍼셉트론은 전류가 전선을 따라 흐르듯 신호도 흐름을 만들고 정보를 앞으로 전달한다.

다만, 실제 전류와 달리 퍼셉트론 신호는 흐른다/ 흐르지 않는다(1이나 0)의 두 가지 값을 가질 수 있다.

뉴런도 여러 갈래로 뻗어있는 각각의 가지돌기에서 신호를 받아 하나의 축삭돌기로 전달되는 것이다.

 

퍼셉트론의 예로 2개의 신호를 받는 퍼셉트론을 만들어보자.

 

x1...xn는 입력 신호, y 출력 신호 w1...wn(weight)는 가중치를 뜻한다.

퍼셉트론의 작동 원리는 입력 신호가 뉴런에 보내질 때는 각각 고유한 가중치가 곱해진다.

노드(뉴런)에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력한다.

뉴런에선 시냅스의 신호가 강화되는 현상이 관찰되는 데, 이것을 학습으로 보고 이를 뉴런 활성화라고 표현한다.

여기선 그 한계를 임계값이라고 하며, 세타(theta) 기호로 나타낸다.

이를 수식으로 나타내면 이렇게 된다.

식에서도 마찬가지로 x1 x2 입력 신호, y 출력 신호 w1, w2(weight) 가중치를 뜻한다.

퍼셉트론은 복수의 입력 신호 각각에 고유한 가중치를 부여한다.

가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용한다.

가중치가 클수록 해당 신호가 그만큼 중요하다는 뜻이다.

 

퍼셉트론의 용도

퍼셉트론은 어떻게 신호를 구분할까?

퍼셉트론의 용도를 알아보기 위해 간단한 문제인 게이트를 구현해 보겠다.

게이트는 입력이 둘이고 출력이 하나이다.

입력 신호와 출력 신호의 대응 표를 진리표라고 한다.

 

모든 게이트를 구현하진 않고 예시로 간단하게  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

가중치1(w1), 가중치 2(w2), 임계값(theta)을 정의해 주고

각 입력값과 가중치를 곱한 값의 총합을 tmp로 정의한다.

이 총합이 임계값을 넘으면 1을 반환하고, 그 외에는 0을 반환한다.

결괏값을 확인해 보자.

print(AND(0, 0))  # 0을 출력
print(AND(0, 1))  # 0을 출력
print(AND(1, 0))  # 0을 출력
print(AND(1, 1))  # 1을 출력

 AND 게이트와 NAND 게이트도 같은 형식으로 구현할 수 있다.

그리고 여기서 퍼셉트론의 매개변수 값을 정하는 것은 컴퓨터가 아니라 인간이다.

 

퍼셉트론 가중치와 편향 도입

아까 전 위에 나왔던 식의 세타를 -b로 치환하면 퍼셉트론 동작이 다음의 식처럼 변한다.

두 식은 기호만 바꿨을 뿐, 그 의미는 같다. 여기서 b를 편향이라고 한다.

편향의 정의를 검색해 보면 "한쪽으로 치우치는 것"이라고 나온다.

이런 편향의 정의에서도 알 수 있듯이 두 입력 값이 0이라도 0이 아닌 편향 값이 나온다.

편향의 값은 뉴런이 얼마나 쉽게 활성화되는지 결정해주기도 한다.

 

식을 해석해 보면 퍼셉트론은 입력 신호에 가중치를 곱한 값과 편향을 합하여,

그 값이 0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력한다.

 

이 식을 기준으로 코드로 구현해 보았다.

import numpy as np
x = np.array([0, 1])  # 입력
w = np.array([0.5, 0.5])  # 가중치
b = -0.7  # 편향

print(w * x)                # [0. 0.5]
print(np.sum(w * x))        # 0.5
print(np.sum(w * x) + b)    # 대략 -0.2 (부동소수점 수에 의한 연산 오차)

넘파이 배열끼리의 곱셈은 두 배열의 원소 수가 같다면 각 원소끼리 곱한다.

np.sum 메서드는 입력한 배열에 담긴 모든 원소의 총합을 계산한다. 

이 가중치에 편향을 더하면 위 식의 계산이 완료된다.

 

마지막으로 최종  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

아까 이야기했듯이 -세타가 편향  b로 치환되었다.

w1과 w2는 각 입력 신호가 결과에 주는 영향력(중요도)을 조절하는 매개변수[가중치]고,

b는 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력) 하느냐를 조정하는 매개변수[편향]이다.

 

선형과 비선형

지금까지 AND게이트 하나만 구현해 봤지만

지금까지 배웠던 이론만으로도 모든 게이트를 퍼셉트론으로 구현할 수 있을 것 같다.

하지만 막상 구현을 하려고 보면 XOR게이트에서 멈칫할 것이다.

그 이유는 이론상으로 우리가 지금 배운 단층 퍼셉트론으로 XOR 게이트를 구현하는 것은 불가능하다.

이제부터 왜 그런지 알아보도록 하겠다.

 

퍼셉트론은 다른 말로 선형 이진 분류기(linear binary classification)라고 불린다.

그 이유는 퍼셉트론으로 구현하기 전 수식을 본다면 이해할 수 있다.

선형(함수 y=ax+c)은 말 그대로 입력 값을 받아 출력 값을 출력했을 때 그 형태가 직선으로 나오는 1차식 함수이다.

우리는 선형함수식에서 매개변수 값인 a값과 c값을 조정함으로써 직선의 기울기와 위치를 변화시킨다.

그리고 이 과정을 학습이라고 부른다.

2차원 평면에서 직선하나를 그으면 어떻게 될까?

그 직선을 기준으로 두 가지 영역으로 나뉘게 된다.

퍼셉트론에선 이를 0과 1로 표현하고 이런 성질들이 합쳐져 선형 이진 분류기라고 불리게 된 것이다.

 

이제 는 2차원에서 직선으로 분류가 가능하다는 사실을 알았으니 그래프를 보자.

아까 구현했던 AND 게이트의 그래프이다.

직선을 한번 그어 검은색 점과 흰색 점을 잘 불리해낸 것을 볼 수 있었다.

 

다음은 XOR 게이트의 그래프를 보자.

보다시피 검정점과 흰점이 서로 엇갈려서 그려졌다.

이런 경우가 직선하나만으로 분류하지 못하게 되는 것이다.

 

그렇다면 영역을 나누는 선이 직선이 아니라 곡선이라면 어떨까?

곡선이라면 나눌 수 있다.

이런 직선을 선형, 곡선을 비선형이라고 한다.

학습과정을 자세히 더 보고 싶다면 이 링크를 참조해라.

1969년 Marvin Minsky와 Seymour Papert의 논문에서 XOR를 perceptron알고리즘으로 학습시킬 수 없다는 것을 보였다.

 

다층 퍼셉트론

그렇다면 곡선은 퍼셉트론으로 어떻게 구현할 수 있을까?

바로 퍼셉트론의 층을 여러 겹으로 쌓아 다층 퍼셉트론(multi-layer perceptron)을 만드는 것이다.

다층 퍼셉트론을 세는 법은 가중치만 갖는 층을 선택해 세기도 한다.

총층은 3층이면 2층이 되는 것이다. 

다층 퍼셉트론 만으로 이론적으로 컴퓨터도 만들 수 있다.

<The Elements of Computing Systems: Building a Modern Computer from First Principles (The MIT Press, 2005)>

궁금하다면 이 책을 보면 된다.

하지만 다층 퍼셉트론 역시 XOR 게이트 문제를 해결할 수는 있었지만 학습시키기가 어려웠다.

 

다층 퍼셉트론 그 이후

  • 1986년 역전파 훈련 알고리즘이 공개되어 다층 perceptron을 학습시킬 수 있었다
  • 1989년 Yann LeCun은 역전파 알고리즘을 적용하여, 손으로 쓴 우편번호를 인식할 수 있었다. 학습하는데 3일 걸렸다고 한다.
  • 2006년 Geoff Hinton에 의해 많은 층을 가진 인공신경망을 효과적으로 학습시키는 방법을 발견하였다.

'밑바닥부터시작하는딥러닝' 카테고리의 다른 글

다차원의 배열 계산  (1) 2023.05.26
손글씨 숫자 인식  (0) 2023.05.25
신경망  (0) 2023.05.24