퍼셉트론이란?

퍼셉트론은 최초의 인공뉴런 혹은 인공신경망으로 알려져 있다.

- 기본적인 로직은 입력값(x)과 가중치(w)들의 곱의 합(순입력z)을 활성화 함수 h(z)를 통해 임계점을 넘으면 1, 그렇지 않으면 0혹은 - - 1을 출력하도록 하는 것이다.

가중치 벡터의 크기는 항상 입력 벡터의 크기와 동일하다.

 

 

퍼셉트론 이진 분류

- 선형 이진 분류기(linear binary classification)

- 2차원에서 직선으로 분류 가능하다고 전제한다.

 

 

필요한 요소

- 입력

- 가중치

- 활성화 함수(시그모이드, step, ReLU, tanh 등)

이진 분류의 경우는 step function을 사용한다.

 

 

학습방법

- 가중치를 임의로 설정한 후 학습을 시작한다.

- 학습이란 가중치의 개선을 말한다.

- 즉 최적의 가중치를 얻는 것이다.

 

 

과대적합과 과소적합

언제 일어 나는가?

과대적합 overfitting : 학습자료 자체만 완벽하게 분류하려고 할 때

과소적합 underfitting : 오차를 너무 허용할때

즉 완벽한 학습은 없다.

 

 

퍼셉트론 알고리즘

목적 : 입력 x를 분류하는 가중치 w를 구하는 것이다.

1. 가중치를 난수(0~1)로 초기화

2. 각 학습자료 x에 대해 출력(y hat)계산 후 가중치 조정

 

 

순입력z 계산 예제

import numpy as np
np.random.seed(0) # 난수 값을 고정시켜주는 역할
x = np.array(np.arange(4)).reshape(4,1) # 열백터로 변환
w = np.array(np.random.random(4)).reshape(4,1) # 열백터로 변환 random의 parameter는 shape을 뜻한다.
z = np.dot(w.T,x).squeeze() 
print(z)
print(x)
print(w.T)
print('shape: x{}, w{}, w.T{}, z{}'.format(x.shape, w.shape, w.T.shape, z.shape))

 

가중치 조정값 계산법

 

 

 

퍼셉트론 학습 전체과정

1. 학습 자료들을 입력받는다. x(i)

2. x(i)와 w를 곱하여 순입력 z를 얻는다.

3. 순입력 z 를 활성활 함수에 넣어 예측값 y hat을 얻는다.

4. 예측값과 실제값(class label)을 비교하여 델타w를 계산한다.

5. 기존가중치 w 에 델다w를 더한다.

 

 

퍼셉트론 알고리즘의 한계

1.베타적 논리합(XOR)문제를 풀지 못함.

-> 역전파 알고리즘과 다층 퍼셉트론으로 해결 가능하다.(1974년 논문발표)

2.최적 분류의 한계

직선으로 분류는 하지만 최적의 직선은 아니다.

 

퍼셉트론 알고리즘 코딩

주어진 자료로 퍼셉트론을 학습시키고 학습자료들을 분류할 수 있는 가중치를 구하는 것이다.

먼저 학습자료로 부터 두 클래스토 분류가능한 판별식을 구하게 된다. 그리고 결과를 시각화 한다.

 

x = np.array([[1.0,1.0], [2.0, -2.0],
             [-1.0, -1.5], [-2.0, -1.0],
             [-2.0, 1.0], [1.5, -0.5]])
X = np.c_[np.ones(len(x)), x]
y = np.array([1,-1,-1,-1,1,1])
w = np.array([0, 1.0, 0.5])

W = np.array([w])
ecochs = 4
for _ in range(ecochs):
  w = perceptron(X, y, w, eta = 0.05, epochs = 1)
  W = np.vstack([W, w])
plot_xyw(x,y,W,annotate=True)
def perceptron(X,y,w=None, eta=0.1, epochs=5, random_seed=1):
  if w is None:
    np.random.seed(random_seed)
    w = np.random.random(X.shape[1], 1)
    maxlabel, minlabel = y.max(), y.min()
    for _ in range(epochs):
      for xi, yi in zip(x,y):
        xi = xi.reshape(w.shape)
        z = np.dot(w.T, xi)
        yhat = np.where(z >= 0.0, maxlabel, minlabel)
        delta = eta * (yi - yhat) * xi
        w += delta
  return w

 

 

 

 

 

+ Recent posts