퍼셉트론(Perceptron)

그니·2024년 6월 1일

ML/DL

목록 보기
1/5

퍼셉트론(Perceptron)이란?

퍼셉트론(Perceptron)은 인공신경망의 한 종류로 1957년에 Rosenbaltt라는 사람에 의해 처음 고안된 알고리즘이다. Perceptron은 perception과 neuron의 합성어이며 인공 뉴런이라고도 부른다. 일반적으로 인공 신경망 시스템은 동물의 신경계를 본떠 만들었기 때문에 개념적으로나 형태로나 비슷한 부분이 많다.

우리 사람의 뇌 속에서는 위 그림과 같은 형태의 신경계를 구성하는 뉴런이 1000억 개 가까이 서로가 다중적이고 복잡하게 연결되어 있다. 생물학 관점에서의 뉴런은 여러 개의 입력신호가 수상돌기에 도착하면 신경세포 내에서 이들을 하나의 신호로 통합하고, 통합된 신호 값이 어떤 임곗값을 초과하면 하나의 단일 신호가 생성되며, 이 신호는 축색돌기를 통해 하나의 아웃풋을 산출해낸다.

퍼셉트론은 다수의 신호를 입력받아 하나의 신호를 출력한다. 이는 생물학 관점에서의 뉴런 동작 과정과 비슷하다. 또한, 뉴런의 수상돌기나 축색돌기에서 신호를 전달하는 역할을 퍼셉트론에서는 weight(가중치)가 그 역할을 한다. 입력 신호가 뉴런에 보내질 때는 각각 고유한 weight가 곱해지며, 뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어서면 1을 출력하며 그렇지 않으면 -1(or 0)을 출력한다. 여기서 한계는 임계값이라 하며 θ(theta, 세타) 기호로 나타낸다. 이를 수식으로 나타내면 아래와 같은 그림이다.

퍼셉트론은 복수의 입력 신호 각각에 고유한 가중치를 부여하며 가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용된다. 즉, 가중치가 클수록 해당 신호가 그만큼 더 중요함을 뜻한다.

퍼셉트론(Perceptron)의 학습 방법

처음에는 임의로 설정된 가중치로 시작한다. 학습 데이터를 입력해 기댓값이 나오지 않는 경우, 가중치를 개선해 나간다. 이러한 과정을 학습이라고 한다.

퍼셉트론(Perceptron) 알고리즘 구현

class Perceptron(object):
    def __init__(self, eta=0.01, n_iter=50, random_state=1):
        self.eta = eta # learning rate
        self.n_iter = n_iter # number of iteration
        self.random_state = random_state # random generator seed for random weight

        # weight initiailization
        rgen = np.random.RandomState(self.random_state)
        self.w_ = rgen.normal(loc=0.0, scale=0.01, size=1 + X.shape[1])
        
    def fit(self, X, y):
        self.errors_ = []        
        for _ in range(self.n_iter):
            errors = 0
            for xi, target in zip(X, y):

                ####################################################
                # wj = wj +  eta * (y - yhat) * xj
                update = self.eta * (target - self.predict(xi))
                self.w_[1:] += update * xi
                self.w_[0] += update
                
                errors += int(update != 0.0)
                ####################################################
            self.errors_.append(errors)
            print(self.w_)
            
        return self
    
    def net_input(self, X):
        return np.dot(X, self.w_[1:]) + self.w_[0]  
    
    def predict(self, X):
        return np.where(self.net_input(X) >= 0.0, 1, -1) 

퍼셉트론(Perceptron)의 한계점

퍼셉트론은 간단하고 효과적인 분류 알고리즘이지만 한계점이 존재한다. 바로 선형 분리 불가능한 문제이다. 퍼셉트론은 선형 결정 경계만 학습할 수 있다. 즉, 입력 데이터가 선형적으로 분리 가능한 경우에만 작동한다. 선형적으로 분리되지 않는 복잡한 문제에서는 효과적으로 동작하지 않을 수 있다. 그러나 층이 여러 개인 다층 퍼셉트론은 비선형 영역도 표현할 수 있다.

profile
Data scientist in the making

0개의 댓글