인공지능(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 불러오기
import numpy as np
numpy는 컴퓨터 프로그래밍에서 숫자를 더 쉽고 빠르게 계산해주는 도구입니다. numpy를 사용하면, 큰 숫자 목록을 쉽게 더하거나 빼고 곱하고 나눌 수 있어요.
2. 퍼셉트론 함수를 정의 하기
이제 단순한 퍼셉트론 함수를 정의해 봅니다. f(x_1,x_2) = w_1 x_1 + w_2 x_2 + b
def f(x1, x2, w1, w2, b):
return w1 * x1 + w2 * x2 + b
3. 계단함수 정의하기
def step_function(y):
return 1 if y > 0 else 0
여기서 활성화 함수로서 0 < f(x_1,x_2) 일때만 1이되고 아니면 0이되는 함수를 정의 해보겠습니다. 이를 계단 함수 라고 합니다.
활성화 함수는 컴퓨터가 어떤 결정을 내릴 때, 그 결정을 조금 더 확실하게 만들어주는 역할을 합니다. 대표적으로 계단함수, 시그모이드 함수, 렐루함수, 소프트맥스 등이 있습니다.
4. 가중치, 편향, 미지수 지정하고 테스트 해보기
# 가중치와 편향 설정 (예시)
w1, w2 = 0.5, 0.5
b = -0.7
우선 가중치와 편향을 임의의 값으로 설정했습니다.
# 미지수 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[행][열] 이 됩니다.
# 가중치와 편향 설정 (예시)
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입니다.
# 가중치와 편향 설정 (예시)
print(step_function(y1)) # 0 출력
print(step_function(y2)) # 0 출력
print(step_function(y3)) # 0 출력
print(step_function(y4)) # 1 출력
그 후에 y 값이 0보다 큰지 비교하여 결과를 출력합니다.
5. 단층 퍼셉트론 구현해보기 전체 코드
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
이 파라미터들을 딕셔너리와 키의 쌍으로 넣어보겠습니다.
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을 만들어 보겠습니다.
과정은 다음과 같습니다.
- (x_1,x_2) 를 NAND에 거쳐 nand_out 을 도출한다.
- (x_1,x_2) 를 OR에 거쳐 or_out 을 도출한다.
- 위의 두값을 입력값으로 하여 (nand_out,or_out)를 AND 를 거쳐 결괏값을 도출한다.
- 이모든 과정을 합치면 XOR이 됩니다.
전체 코드 구성은 아래와 같습니다.
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
의 결괏값을 얻게 됩니다.
퍼셉트론의 활용 분야
인공 지능과 머신러닝의 중요한 기본 구성 요소로서 다양한 분야에서 활용되고 있습니다. 이러한 활용 분야와 결론은 다음과 같습니다:
퍼셉트론의 활용 분야:
- 이미지 인식: 이미지 분류 및 객체 감지와 같은 컴퓨터 비전 작업에서 중요한 역할을 합니다. 여러 개의 층으로 조합하여 복잡한 이미지 패턴을 학습하고 인식하는 데 사용됩니다.
- 자연어 처리: 자연어 처리에서는 텍스트 분류, 감성 분석, 기계 번역 등 다양한 언어 관련 작업에 적용합니다. 텍스트의 특성을 벡터로 표현하고, 이러한 벡터를 처리하기 위해 사용합니다.
- 금융 분야: 금융 시장에서는 주가 예측, 부정 거래 감지, 신용 점수 평가 등 다양한 예측 및 분류 작업에 퍼셉트론을 활용합니다. 퍼셉트론은 금융 데이터의 패턴을 식별하고 예측하는 데 도움이 됩니다.
- 패턴 인식: 퍼셉트론은 다양한 패턴 인식 작업에 사용됩니다. 이러한 작업은 의료 영상 처리, 음성 인식, 지문 인식 등 다양한 분야에서 중요합니다.
- 로봇 공학: 퍼셉트론은 로봇 제어 및 자율 주행 자동차와 같은 로봇 공학 응용 프로그램에서 사용됩니다. 로봇은 센서로부터 받은 정보를 기반으로 환경을 이해하고 작업을 수행하는 데 퍼셉트론을 활용합니다.
결론
“이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.”
퍼셉트론은 인공 지능과 머신러닝 분야에서 핵심적인 개념으로, 복잡한 작업을 처리하고 패턴을 인식하는 데 필수적입니다. 이 간단한 알고리즘은 다양한 분야에서 사용되며, 머신러닝과 딥러닝의 발전과 혁신에 중요한 역할을 합니다. 퍼셉트론을 이해하고 활용하는 것은 머신러닝 및 인공 지능 분야에서 미래의 발전을 이끌어 나가는 데 큰 역할을 할 것으로 기대됩니다.
함께 참고하면 좋은 글
인공지능 및 딥러닝 학습을 위한 필수 요소와 기본 지식
4 thoughts on “퍼셉트론: 딥러닝 기초 시리즈 1”