@senspond
>
원시적인 퍼셉트론(Perceptron)은 입력데이터를 2개의 클래스 중 하나로 분류하는 모델로 고전적인 선형 분류 모델입니다. 인공 신경망의 레이어를 구성하는 가장 기초적인 토대가 된다고 할 수 있습니다.
원시적인 퍼셉트론(Perceptron)은 입력데이터를 2개의 클래스 중 하나로 분류하는 모델로 고전적인 선형 분류 모델입니다.
인공 신경망의 레이어를 구성하는 가장 기초적인 토대가 된다고 할 수 있습니다.
( https://cs231n.github.io/neural-networks-1/ )
y = wx + b
퍼셉트론으로 구성된 레이어를 여러층으로 쌓아 다중클래스를 분류하거나 비선형 문제 등 보다 복잡한 문제를 풀 수가 있습니다.
초 간단하게 디지털 논리회로를 퍼셉트론으로 구현하는 예제입니다.
# x : 가중치
# b : 편향
def Perceptron(x, w, b):
y = np.sum(w * x) + b
if y <= 0:
return 0
else:
return 1
출력 값이 0과 1 을 리턴하는 퍼셉트론을 작성했습니다.
그리고 아래처럼 작성합니다.
# NAND 게이트
def NAND(x1, x2):
return Perceptron(np.array([x1, x2]), np.array([-0.5,-0.5], 0.7)
# OR 게이트
def OR(x1, x2):
return Perceptron(np.array([x1, x2]), np.array([0.5,0.5], -0.2)
# AND 게이트
def AND(x1, x2):
return Perceptron(np.array([x1, x2]), np.array([0.5,0.5], -0.7)
그리고 AND, OR, NAND 에 입력을 해서 확인을 해볼 수 있습니다.
그런데, 단층 퍼셉트론은 비선형 문제인 배타적 논리합(XOR) 을 풀수가 없는데요.
XOR 은 입력값 x1, x2 두값이 서로 같지 않을 때만 1을 출력하고 그외에는 0을 출력합니다.
그림을 보시면 XOR은 신경망의 출력인 가설 공간을 직선 형태로 나눌 수가 없습니다.
즉, y = ax + b 와 같은 선형 함수로는 해를 구하지 못한다는 의미입니다.
디지털 논리회로에서 NAND, OR, AND를 조합해서 XOR 게이트를 완성하듯이 다층 퍼셉트론으로 이 문제를 해결할 수가 있습니다.
# XOR 게이트
def XOR(x1, x2):
return AND(NAND(x1, x2), OR(x1, x2))
좀더 제대로 퍼셉트론을 구현해봅니다. 위의 AND, OR, .. 게이트는 미리 알고 있는 가중치와 편향값을 넣어서 구현했습니다. 기본적으로 모델에는 학습을 할 수 있는 fit 과 예측을 할 수 있는 predict 라는 메소드가 정의되어야 합니다.
단층 퍼셉트론은 층(Layer)가 하나뿐인 퍼셉트론입니다.
입력 백터를 X, 가중치 백터를 w라 할때 두 백터의 내적연산은 아래와 같습니다.
import numpy as np
X = np.array([12,32,23,44])
w = np.array([1,2,2,4])
# z
np.dot(X, w) == 12 * 1 + 32 * 2 + 23 * 2 + 44 * 4 # ==> True
출력값의 결정 함수의 표현은 아래처럼 할 수 있겠습니다.
그림대로 구현을 하면 다음과 같습니다.
import numpy as np
class Perceptron:
def __init__(self,eta=0.01,n_iter=50,random_state=1):
self.eta = eta
self.n_iter = n_iter # 학습횟수
self.random_state = random_state
self.w_ = 0
self.b_ = 0
self.loss_ = []
# 가중치 초기화
def init_weight(self, X):
rgen = np.random.RandomState(self.random_state)
self.w_ = rgen.normal(loc=0.0,scale=0.01,size=X.shape[1]) # 정규분포를 이용해서 가중치 초기화
self.b_ = np.float_(0.) # 초기편향을 0으로
# 학습
def fit(self, X, y):
self.init_weight(X)
self.errors_ = []
for i in range(self.n_iter):
errors = 0
for xi, target in zip(X,y):
update = self.eta*(target - self.predict(xi))
self.w_ += update*xi # 가중치 업데이트
self.b_ += update # 편향 업데이트
errors += int(update != 0.0)
# print(f"{i} epoch : {errors}")
self.errors_.append(errors)
return self
def net_input(self,X):
# 학습되어 나온 가중치와 편향으로 구해진 선형방정식
return np.dot(X,self.w_) + self.b_
# 분류 예측
def predict(self,X):
return np.where(self.net_input(X) >=0.0, 1, -1)
양성클래스(1)과 음성클래스(-1)로 분류 할 수 있는 퍼셉트론입니다. 이진 분류기에 사용해 볼 수 있겠습니다.
안녕하세요. Red, Green, Blue 가 만나 새로운 세상을 만들어 나가겠다는 이상을 가진 개발자의 개인공간입니다.
현재글에서 작성자가 발행한 같은 카테고리내 이전, 다음 글들을 보여줍니다
@senspond
>