퍼셉트론: 딥러닝 기초 시리즈 1

인공지능(AI)과 머신러닝이 현대 산업과 생활에 점점 더 깊은 영향을 미치고 있습니다. 그 중심에는 복잡한 알고리즘이나 딥러닝 네트워크가 있을 수 있지만, 그 기초를 이루고 있는 것 중 하나가 바로 ‘퍼셉트론’입니다.

퍼셉트론은 인공 신경망과 머신러닝의 기본 구성 요소로, 이해하기 쉬운 구조와 원리로 많은 연구와 응용이 이루어지고 있습니다.

이 글에서는 퍼셉트론에 대해 알아보고 파이썬 코드로 구현해 보겠습니다.


목차

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

참고 문헌 및 참고자료: 밑바닥부터 시작하는 딥러닝


왜 퍼셉트론이 중요한가?

왜 퍼셉트론이 중요한가?

퍼셉트론은 컴퓨터가 어떤 일을 할 수 있게 해주는 아주 간단한 뇌처럼 생각할 수 있습니다. 인간의 뇌는 생각하거나 판단할 때 여러 정보를 모아서 결정을 내리죠? 이와 비슷하게 작동합니다.

만약 당신이 축구장에서 골키퍼로 서 있다고 해볼게요. 볼이 어디서 날아올지, 볼이 얼마나 빨리 날아오는지 등 여러 정보를 빨리 판단해서 공을 잡거나 막아야 하죠. 여러 가지 정보를 모아서 ‘공을 막을 것인가? 막지 않을 것인가?’를 선택해야 하죠

비슷합니다. 여러 가지 정보를 입력으로 받아서 하나의 결정을 내립니다. 그 결정은 1 또는 0 즉 예 또는 아니오 같은 간단한 답일 수 있습니다.

이렇게 간단하게 작동하는 퍼셉트론 여러 개를 모아서 더 복잡한 일을 할 수 있는 컴퓨터 프로그램을 만들 수 있어요. 이게 바로 인공지능에서 많이 쓰이는 ‘신경망’의 기초가 되는 것입니다.

이는 선형 분류자1) 로 작동하기 때문에 데이터를 두 가지 카테고리로 분류할 수 있습니다. 그리고 이러한 선형 분류의 원리를 활용하여 더 복잡한 알고리즘을 구축할 수 있습니다. 예를 들어, 다층 퍼셉트론(Multilayer Perceptron, MLP)1)은 여러 개의 퍼셉트론을 연결하여 더 복잡한 문제를 해결할 수 있습니다.

1)선형 분류자: 데이터를 두 부류로 나누는 것입니다.
2)다층 퍼셉트론: 하나의 퍼셉트론으로는 사과와 바나나만 구분할 수 있습니다. 그런데 이제 오렌지도 추가되어 하나의 퍼셉트론으로는 세 가지 과일을 잘 구분하기 어렵습니다. 그래서 퍼셉트론 여러 개를 조합해서 '사과, 바나나, 오렌지'를 구분할 수 있게 하는 것입니다.

Affine 층

Affine Transformation은 기하학적 변환이나 선형 대수에서 나오는 용어로, 벡터에 대한 선형 변환과 이동 변환(translation)을 결합한 형태입니다. 수학적으로는 다음과 같이 표현됩니다:

y = wx+b

여기서 w 는 선형 변환을 나타내는 행렬 (가중치 행렬)
여기서 b 는 이동 변환을 나타내는 벡터 (편향 벡터)

신경망에서 아핀(아파인) 변환은 주로 각 계층에서의 연산을 나타내며, 이 연산을 통해 입력 데이터는 다음 계층으로 전달됩니다. 이 때 선형 변환 후에 대개 비선형 활성화 함수가 적용되어, 신경망은 복잡한 함수를 근사할 수 있게 됩니다.


퍼셉트론의 기본 원리

여러 개의 입력을 받아 하나의 출력을 생성하는 알고리즘입니다.

간단히 말해, 각 입력에 가중치를 곱하고, 그 결과를 합산한 후 활성화 함수를 통과시켜 출력을 얻습니다. 이렇게 단순하지만 효과적인 구조 덕분에, 복잡한 인공 신경망의 기초를 제공합니다.

우선 기본적인 식은 아래와 같습니다.

y = \begin{Bmatrix} 0 \space (\space w_1 x_1+w_2 x_2 \leq θ) \\ 1 \space (\space w_1 x_1+w_2 x_2 > θ) \end{Bmatrix}

여기서 θ 값을 우측으로 옮기고 b 로 설정하면 편향값이 되어 다음과 같이 됩니다.

y = \begin{Bmatrix} 0 \space (\space w_1 x_1 + w_2 x_2 + b \leq 0) \\ 1 \space (\space w_1 x_1 + w_2 x_2 + b > 0) \end{Bmatrix}

가중치(weight) w 는 중요도 를 나타내고
편향값(bias) b 는 뉴런이 얼마나 쉽게 활성화 되는지를 나타냅니다.


단층 퍼셉트론 구현해보기

이제 단층 퍼셉트론을 구현하는 코드를 짜보겠습니다.

1. numpy 불러오기

Python
import numpy as np
numpy는 컴퓨터 프로그래밍에서 숫자를 더 쉽고 빠르게 계산해주는 도구입니다. numpy를 사용하면, 큰 숫자 목록을 쉽게 더하거나 빼고 곱하고 나눌 수 있어요.

2. 퍼셉트론 함수를 정의 하기

이제 단순한 퍼셉트론 함수를 정의해 봅니다. f(x_1,x_2) = w_1 x_1 + w_2 x_2 + b

Python
def f(x1, x2, w1, w2, b):
    return w1 * x1 + w2 * x2 + b

3. 계단함수 정의하기

Python
def step_function(y):
    return 1 if y > 0 else 0

여기서 활성화 함수로서 0 < f(x_1,x_2) 일때만 1이되고 아니면 0이되는 함수를 정의 해보겠습니다. 이를 계단 함수 라고 합니다.

활성화 함수는 컴퓨터가 어떤 결정을 내릴 때, 그 결정을 조금 더 확실하게 만들어주는 역할을 합니다.
대표적으로 계단함수, 시그모이드 함수, 렐루함수, 소프트맥스 등이 있습니다.

4. 가중치, 편향, 미지수 지정하고 테스트 해보기

Python
# 가중치와 편향 설정 (예시)
w1, w2 = 0.5, 0.5
b = -0.7

우선 가중치와 편향을 임의의 값으로 설정했습니다.

Python
# 미지수 x 지정하기 (보통 입력값 입니다.)
x=np.array([[0,0],
            [0,1],
            [1,0],
            [1,1]])

이제 numpy를 이용하여 미지수를 지정합니다.

입력값 \begin{pmatrix} 0&0 \\ 0&1 \\ 1&0 \\ 1&1 \end{pmatrix} 입니다.

아래 코드에서 x[ ][ ] 코드는 2차원 행렬에서의 x[행][열] 이 됩니다.

Python
# 가중치와 편향 설정 (예시)
y1=f(x[0][0], x[0][1], w1, w2, b)
y2=f(x[1][0], x[2][1], w1, w2, b)
y3=f(x[2][0], x[2][1], w1, w2, b)
y4=f(x[3][0], x[3][1], w1, w2, b)

x= \begin{pmatrix} x[0][0]&x[0][1] \\ x[1][0]&x[1][1] \\ x[2][0]&x[2][1] \\ x[3][0]&x[3][1] \end{pmatrix} 입니다

그 후에 앞서 미리 정의한 함수 f에 파라미터(x값)를 대입한후 결과 값을 낸 값이 y입니다.

Python
# 가중치와 편향 설정 (예시)
print(step_function(y1))  # 0 출력
print(step_function(y2))  # 0 출력
print(step_function(y3))  # 0 출력
print(step_function(y4))  # 1 출력

그 후에 y 값이 0보다 큰지 비교하여 결과를 출력합니다.

5. 단층 퍼셉트론 구현해보기 전체 코드

Python
import numpy as np

def f(x1, x2, w1, w2, b): #퍼셉트론
    return w1 * x1 + w2 * x2 + b

def step_function(y): #계단함수
    return 1 if y > 0 else 0

# 가중치와 편향 설정 (예시)
w1, w2 = 0.5, 0.5
b = -0.7

# 미지수 x 지정하기 (보통 입력값 입니다.)
x=np.array([[0,0],[0,1],[1,0],[1,1]])

# 가중치와 편향 설정 (예시)
y1=f(x[0][0], x[0][1], w1, w2, b)
y2=f(x[1][0], x[1][1], w1, w2, b)
y3=f(x[2][0], x[2][1], w1, w2, b)
y4=f(x[3][0], x[3][1], w1, w2, b)

# 가중치와 편향 설정 (예시)
print(step_function(y1))  # 0 출력
print(step_function(y2))  # 0 출력
print(step_function(y3))  # 0 출력
print(step_function(y4))  # 1 출력

최종적으로 요약하자면

함수 f(x1, x2, w1, w2, b)는 퍼셉트론, 함수 step_function(y) 는 계단함수를 나타내고있고, 가중치와 편향은 랜덤하게 지정합니다. 여기서 지정한 가중치와 편향은 AND 연산자를 위한 파라미터 입니다.

AND 연산자: 입력값 두값 모두 1인경우에만 1을 출력한다.

간단한 다층 퍼셉트론 (신경망 구성해보기)

앞에서는 간단히 단층 으로 구성해 보았습니다. 이장에서는 간단한 다층 , 즉 간단한 인공 신경망을 구성해 보겠습니다.

위에서는 AND 연산자를 구성해 보았는데 XOR연산자의 경우 단층 으로는 구현할수 없는 연산자 입니다. 여기서 XOR 연산자란 입력값이 다를경우에만 1을 출력하는 연산자 입니다.

x = (0,0) 또는 x=(1,1) 일때는 0을 출력하고,

x = (0,1) 또는 x=(1,0) 일때만 1을 출력합니다.

각 연산자에 대하여 필요한 w값과,b값은 아래와 같습니다.

And 연산자:

  • w_{00} = w_{01} = 0.5
  • b_0=-0.7

Nand 연산자:

  • w_{10} = w_{11} = - 0.5
  • b_1=0.7

Or 연산자:

  • w_{20} = w_{21} = 0.5
  • b_2=-0.2

이 파라미터들을 딕셔너리와 키의 쌍으로 넣어보겠습니다.

Python
parameters={}
# NAND 의 가중치와 편향 설정
parameters["w_nand"] = np.array([-0.5, -0.5])
parameters["b_nand"] = 0.7
    
# OR 의 가중치와 편향 설정
parameters["w_or"] = np.array([0.5, 0.5])
parameters["b_or"] = -0.2
    
# AND 의 가중치와 편향 설정
parameters["w_and"] = np.array([0.5, 0.5])
parameters["b_and"] = -0.7

우선 앞서 작성한 퍼셉트론과 계단함수를 가져와서 XOR을 만들어 보겠습니다.

과정은 다음과 같습니다.

  1. (x_1,x_2) 를 NAND에 거쳐 nand_out 을 도출한다.
  2. (x_1,x_2) 를 OR에 거쳐 or_out 을 도출한다.
  3. 위의 두값을 입력값으로 하여 (nand_out,or_out)를 AND 를 거쳐 결괏값을 도출한다.
  4. 이모든 과정을 합치면 XOR이 됩니다.

전체 코드 구성은 아래와 같습니다.

Python
import numpy as np

def f(x1, x2, w1, w2, b): # 퍼셉트론
    return w1 * x1 + w2 * x2 + b

def step_function(y): # 계단함수
    return 1 if y > 0 else 0

# XOR 예측 함수
def xor_predict(x1, x2):
    parameters = {}
    
    # NAND 의 가중치와 편향 설정
    parameters["w_nand"] = np.array([-0.5, -0.5])
    parameters["b_nand"] = 0.7
    
    # OR 의 가중치와 편향 설정
    parameters["w_or"] = np.array([0.5, 0.5])
    parameters["b_or"] = -0.2
    
    # AND 의 가중치와 편향 설정
    parameters["w_and"] = np.array([0.5, 0.5])
    parameters["b_and"] = -0.7
    
    # 첫 번째 퍼셉트론 (NAND)
    nand_out = step_function(f(x1, x2, parameters["w_nand"][0], parameters["w_nand"][1], parameters["b_nand"]))
    #step_function(f(x1, x2, -0.5, -0.5, 0.7)) 와 같습니다.
    
    # 두 번째 퍼셉트론 (OR)
    or_out = step_function(f(x1, x2, parameters["w_or"][0], parameters["w_or"][1], parameters["b_or"]))
    #step_function(f(x1, x2, 0.5, 0.5, -0.2)) 와 같습니다.
    
    # 세 번째 퍼셉트론 (AND)
    and_out = step_function(f(nand_out, or_out, parameters["w_and"][0], parameters["w_and"][1], parameters["b_and"]))
    #step_function(f(nand_out , or_out , 0.5, 0.5, -0.7)) 와 같습니다.
    return and_out

# 테스트
for x1, x2 in [(0, 0),
               (1, 0),
               (0, 1),
               (1, 1)]:
    print(f"x1: {x1}, x2: {x2} => XOR: {xor_predict(x1, x2)}")

위코드를 실행시키면 최종적으로

x1: 0, x2: 0 => XOR: 0
x1: 1, x2: 0 => XOR: 1
x1: 0, x2: 1 => XOR: 1
x1: 1, x2: 1 => XOR: 0

의 결괏값을 얻게 됩니다.


퍼셉트론의 활용 분야

인공 지능과 머신러닝의 중요한 기본 구성 요소로서 다양한 분야에서 활용되고 있습니다. 이러한 활용 분야와 결론은 다음과 같습니다:

퍼셉트론의 활용 분야:

  1. 이미지 인식: 이미지 분류 및 객체 감지와 같은 컴퓨터 비전 작업에서 중요한 역할을 합니다. 여러 개의 층으로 조합하여 복잡한 이미지 패턴을 학습하고 인식하는 데 사용됩니다.
  2. 자연어 처리: 자연어 처리에서는 텍스트 분류, 감성 분석, 기계 번역 등 다양한 언어 관련 작업에 적용합니다. 텍스트의 특성을 벡터로 표현하고, 이러한 벡터를 처리하기 위해 사용합니다.
  3. 금융 분야: 금융 시장에서는 주가 예측, 부정 거래 감지, 신용 점수 평가 등 다양한 예측 및 분류 작업에 퍼셉트론을 활용합니다. 퍼셉트론은 금융 데이터의 패턴을 식별하고 예측하는 데 도움이 됩니다.
  4. 패턴 인식: 퍼셉트론은 다양한 패턴 인식 작업에 사용됩니다. 이러한 작업은 의료 영상 처리, 음성 인식, 지문 인식 등 다양한 분야에서 중요합니다.
  5. 로봇 공학: 퍼셉트론은 로봇 제어 및 자율 주행 자동차와 같은 로봇 공학 응용 프로그램에서 사용됩니다. 로봇은 센서로부터 받은 정보를 기반으로 환경을 이해하고 작업을 수행하는 데 퍼셉트론을 활용합니다.

결론

“이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.”

퍼셉트론은 인공 지능과 머신러닝 분야에서 핵심적인 개념으로, 복잡한 작업을 처리하고 패턴을 인식하는 데 필수적입니다. 이 간단한 알고리즘은 다양한 분야에서 사용되며, 머신러닝과 딥러닝의 발전과 혁신에 중요한 역할을 합니다. 퍼셉트론을 이해하고 활용하는 것은 머신러닝 및 인공 지능 분야에서 미래의 발전을 이끌어 나가는 데 큰 역할을 할 것으로 기대됩니다.


함께 참고하면 좋은 글

인공지능 및 딥러닝 학습을 위한 필수 요소와 기본 지식

딥러닝에서 Nvidia 그래픽 카드의 중요성


4 thoughts on “퍼셉트론: 딥러닝 기초 시리즈 1”

Leave a Comment