퍼셉트론(Perceptron)

퍼셉트론은 코넬 항공 연구소(Cornell Aeronautical Lab)의 프랭크 로젠블렛(Frank Rosenblatt)이 1957년에 발표한 이론으로 현재 인공신경망(딥러닝)의 기원이 되는 알고리즘입니다. 퍼셉트론이 동작하는 방식은 각 노드의 가중치와 입력치를 곱한 것을 모두 합한 값이 활성함수에 의해 판단되는데, 그 값이 임계치(θ-세타) 보다 크면 뉴런이 활성화되고 그렇지 않은 경우 비활성화 되는 방식(주로 1-활성화, 0-비활성화)입니다.

그림1 퍼셉트론의 개념

그림1은 2개의 입력을 통해 출력하는 퍼셉트론의 예입니다. x1,x2 입력값에 가중치로 각각 w1,w2를 곱해집니다. 또 편향치(bias) 값을 더해주고 이 값이 일정한 임계치가 넘어가면 출력값으로 1을 표시해주고 그렇지 않으면 0을 출력해줍니다. (b는 θ를 -b로 치환한 값입니다.)

그림2 퍼셉트론 이론

곱해주는 가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용합니다. 즉, 가중치가 크다면 해당 신호(입력)이 중요한 특징을 가지고 있다고 해석 할 수 있습니다. 학습이라는 것은 입력값(x)이 주어졌을 경우에 얼마의 w(가중치)와 b(bias)를 정해주는 것이 실제 결과를 잘반영하는 것인가를 알아내는 과정이라고 할 수 있습니다.

말은 간단하지만 실제로는 굉장히 어려운 과정입니다. 이 부분을 좀 더 간단한 설명해보면 입력값이 들어왔을 경우에 임의의 가중치(이후 w)와 편향정보(이후 b)를 주면 이에 대한 결과로 하나의 출력값을 얻게 됩니다. 이때 얻은 출력값을 실제 값과 비교해보면 어떤 차이가 나오고 이 차이를 점점 줄여가도록 w, b 정보를 수정해서 나중에 가장 좋은 결과 값을 얻게 되면 학습이 종료되게됩니다. 이러한 잘못된 학습을 거치면 과대적합(Overfitting)이나 과소적합(Underfitting)이 발생하기도 합니다.

다시 퍼셉트론으로 돌아와서 좀 더 알아보겠습니다. 이러한 퍼셉트론 이론은 인간의 신경망의 기본 구조인 뉴런을 모사한 구조로 당시에 많은 관심을 받게됩니다.

https://inteligenciafutura.mx/english-version-blog/blog-06-english-version

그러나 당시에는 이러한 퍼셉트론 이론의 한계를 극복하지 못해 연구가 한동안 중지되었으나 현재는 당시에 지적된 문제즘들을 극복하고 현재 인공지능의 주류로 자리잡게 되었습니다.

이러한 퍼셉트론 이론을 통해서 간단한 AND, NAND, OR, XOR 게이트 문제를 생각해보겠습니다.

X1X2ANDNANDORXOR
000100
100111
010111
111010
표1 논리 게이트 진리표

위의 표1에서와 같이 두개의 입력 X1, X2에 대해서 AND 게이트는 모든 입력이 1일 경우에만 1을 출력하고 그 나머지의 경우는 모두 0을 출력합니다. NAND(Not AND)의 경우에는 AND 게이트의 반대입니다. OR 게이트의 경우에는 두 입력 중에서 1일 하나만 들어오더라도 출력값을 1을 표시합니다. 모두 0일 경우에만 0이 되는 특징이 있습니다.

표1의 논리 게이트 진리표를 아래의 그림과 같이 간단히 표현할 수 있습니다.

그림3 AND, NAND Gate
그림4 OR, XOR Gate

그림에서 보면 AND, NAND, OR 게이트의 경우는 선형으로 데이터 분류가 잘되는 것을 볼 수 있습니다. 그러나 XOR 게이트의 경우에는 선형으로 두개의 데이터를 분류한다는 것은 불가능합니다. 이러한 데이터를 분류하려면 비선형으로 이뤄져야 하는데 단일 퍼셉트론 구성으로는 이러한 구성이 불가능했던 것이죠. 물론 다층퍼셉트론(Multi-Layer Perceptron)을 통해서 XOR의 문제를 풀 수 있습니다. 다층퍼셉트론은 퍼셉트론을 하나만 사용하는 것이 아니라 2개 이상을 연결해서 결과를 얻어내는 기술입니다. 현대의 딥러닝에서는 수많은 퍼셉트론과 이 퍼셉트론의 연결층을 사용합니다. 아래의 그림에서처럼 딥러닝은 크게 입력층, 은닉층(Hidden Layer), 출력층으로 구성됩니다. 이때 은닉층을 얼마나 깊고 넓게 만드는가에 따라서 학습의 효과가 높아집니다.

그림5 인공신경망 구조

활성화 함수(Activation Function)

활성화 함수는 입력신호의 총합을 출력 신호로 변환해주는 함수를 일반적으로 일컫는 통칭입니다. 이 활성화 함수에는 여러가지가 있고 그중에서 가장 대표적인 것이 시그모이드 함수(Sigmoid Function)입니다.

그림6 활성화 함수
exp(-x) = e^{-x}

e는 자연상수로 2.7182…의 값을 가지는 실수로 분모가 커지면 0에 가까워지고 작아질 수록 1에 가까운 형태로 됩니다. 반면 그림6의 계단함수(Step Function)의 경우 임계치를 기준으로 0,1로 변화하고 중간 값을 가지지 않습니다.

그렇기 때문에 계단 함수의 경우는 정보의 손실이 크다고 할 수 있습니다. 시그모이드 함수의 장점은 바로 이러한 부드러운 곡선의 형태를 가지기 때문에 연속적인 실수의 형태값을 가지게 됩니다. 두 함수의 공통점이 있다면 결과값을 0,1로 출력한다는 것과 모두 비선형 함수라는 것입니다.

아래의 코드는 python으로 만들어진 sigmoid 함수 코드입니다.

import numpy as np
import matplotlib.pylab as plt

def sigmoid_func(x):
    return 1/(1+np.exp(-x))

x = np.arange(-10.0, 10.0, 0.1)
y = sigmoid_func(x)

plt.plot(x,y)
plt.ylim(-0.1,1.1)
plt.show()

현재는 딥러닝에서는 Sigmoid 함수보다는 ReLU함수를 많이 사용합니다. Sigmoid함수는 모든 값을 0,1 사이의 형태로 돌려주기 때문에 모델이 깊어지면 점점 가중치가 약해져서 나중에는 극히 미약한 영향을 주는 정도로 변형되는 단점이 있습니다. ReLU는 이러한 단점을 해결해 줍니다. 이 함수는 입력이 0을 넘으면 그 값을 그대로 출력하고 0 이하이면 그대로 0을 출력해주는 함수입니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다