본문 바로가기

머신러닝

[파이썬] 딥 러닝 ANN perceptron 알고리즘

728x90

 

 

1. ANN ( Artificial Neural Network )

 

ANN은 인간의 뇌, 신경망으로부터 영감을 얻은 통계학적 학습 알고리즘을 뜻합니다.

다수의 인공 뉴런(노드)이 네트워크를 형성해 학습을 통해 문제를 해결하는 모델입니다.

문자, 음성, 영상인식, 자연어 처리 등 다양한 분야에서 활용합니다.

 

ANN은 input-layer, hidden-layer, Output-layer로 이루어져 있습니다.

 

  • Input layer: 데이터 입력 받는 층, model에 적용되는 입력 벡터의 차원과 동일, node는 feature(특징)의 수
  • Hidden layer: 입력층의 노드로부터 전달받은 값을 출력층까지 전달할 때, 거치는 모든 층
  • Output layer: 모델이 예측한 결과 값을 나타내는 층

출처 : COSS 빅데이터

 

Regression이나 Binary class는 1개의 node를 가지며, Multi class는 class 수만큼의 node를 가지게 됩니다.

 

ANN역사는 다음과 같습니다.

 

  • McCulloch and Pitts (1943): 인간의 두뇌를 ON,OFF의 이진 원소들의 집합으로 가정
  • Hebb(1948): 헵의 학습 규칙(두 뉴런 사이의 연결 강도를 조정할 수 있는 규칙 정의)
  • Rosenblatt(1958): 최초 신경망 모델 'Perceptron' 발표
  • Minsky and Papert(1969): Perceptron 한계를 수학적으로 입증
  • Rumelhart(1986): 은닉층을 가진 다층 퍼셉트론과 오차 역전파 알고리즘 제시

 

딥러닝은 ANN에 은닉층을 추가해 깊은 model을 만들어 성능을 높이는 기술로

깊은 층으로 인한 Gradinent vanishing 문제가 발생하고, 과다한 계산 시간이 든다는 문제점이 있었습니다.

그러나 다음과 같은 기술 혁신으로 딥러닝의 문제점이 해결됩니다.

 

  • HW의 발전: 급속한 CPU와 GPU(대용량 데이터 병렬 처리 유리)의 발전
  • Algorithm 변화: 새로운 알고리즘 개발 통한 gradinent vanishing(기울기 소멸) 문제 완화, 성능 개선
  • Data 확보의 용이성: 인터넷 대중화 및 속도 향상 통한 용이한 대용량 데이터 확보

 

2. Perceptron ( Arificial Neuron )

 

먼저 Biological Neuron을 알아보겠습니다.

Biological Neuron은 신경계 구성하는 세포로 전기적인 방법으로 신호를 전달합니다.

시냅스 구조를 통해 신호를 전달 및 저장합니다.

 

 

- Dendrite: 수많은 가지로 뻗어나가 있으며, 다른 neuron으로부터 신호 받아들임
- Nucleus: Dendrite로부터 전달받은 신호 수집 및 처리
- Axon: Nucleus를 거쳐 전달된 신호 다른 neuron으로 전달하는 통로
- Synapse: 한 뉴런에서 다른 뉴런으로 신호를 전달하는 연결 지점

 

Perceptron은 Biological Neuron의 수학적 모델로  Biological Neuron에서 전달되는

전기적 신호를 대신해 수치가 전달됩니다.

 

Perceptron에서 Dendrite와 Nuclues,Axon,Synapse는 다음과 같습니다.

 

- Dendrite: 벡터 형태의 입력 데이터 x= [x0,x1,x2,...,xm]^T
- Nuclues: 입력 데이터 값에 가중치를 곱해 합산$$\sum ^{m}_{i=1}w_{i}x_{i}+b$$

- Axon, Synapse: Nuclues에서 계산된 가중치를 activation function(활성화 함수) f의 입력으로 전달한 후, 출력 값을 생성함

 

출처: COSS 빅데이터

 

Perceptron은 m개의 입력(xi)과 가중치(wi)를 곱한 합에 편향(bias,b)를 더한 값이

0보다 클 경우 1, 작을 경우 0을 출력합니다.

 

step function은 perceptron의 활성화 여부를 결정하므로 활성화 함수 (sigmoid, ReLu) 라고 합니다.

 

 

728x90

 

3. Perceptron Model

 

Perceptron Model에는 AND,NAND,OR,XOR이 있습니다.

 

출처: COSS 빅데이터

 

AND (Single-layer Perceptron, Linearly Separable, Perceptron Model)

 

  • f(z) >= 0 -> 1
  • f(z) < 0 -> 0
  • 입력에는 booltype이 들어감 ( True/False )
  • x1 x2 y 일때 x1과 x2가 모두 True일때만 y가 True임
  • w1x1+ w2x2+b >= 0 -> y=1
  • w1x1+w2x2+b < 0 -> y=0
  • w1,w2,b값을 찾아야 함
  • 만약 x1,x2가 0이라면 b<0
    x1,x2,가 0,1이라면 w2+b <0
    x1,x2가 1,0이라면 w1+b <0
    x1,x2가 1,1이라면 w1+w2+b>=0

 

NAND (Linearly Separable, Perceptron Model)

 

  • AND의 반대/ True,True인 경우 False를 반환함 그 외는 True
  • 만약 x1,x2가 0이라면 b>=0
    x1,x2,가 0,1이라면 w2+b >=0
    x1,x2가 1,0이라면 w1+b >=0
    x1,x2가 1,1이라면 w1+w2+b<0

 

OR (Linearly Separable, Perceptron Model)

 

  • OR은 하나 이상이 True인 경우 True를 반환함
  • 만약 x1,x2가 0이라면 b < 0
    x1,x2,가 0,1이라면 w2+b >=0
    x1,x2가 1,0이라면 w1+b >=0
    x1,x2가 1,1이라면 w1+w2+b >= 0

 

COSS 빅데이터

 

XOR  ( NOT Linearly Separable, Multi layer Perceptron )

 

  • x1과 x2중 하나만 True일 경우 True를 반환함 False, False이거나 True,True이면 False 반환
  • 만약 x1,x2가 0이라면 b < 0
    x1,x2,가 0,1이라면 w2+b >=0
    x1,x2가 1,0이라면 w1+b >=0
    x1,x2가 1,1이라면 w1+w2+b<0
  • XOR은 Linearly Separable이 아니므로 Perceptron 모델을 적용시킬 수 없음
  • Multi-layer perceptron(MLP)는 Single-layer perceptron이 해결할 수 없는
    NOT linearly separable problem을 해결할 수 있음
  • x1,x2 -> s1의 연결을 하나의 single layer라고 생각함
    (x1,x2 -> s1) + (x1,x2->s2) -> y
  • s1을 NAND로 계산하고 s2를 OR로 계산한 후 마지막 s1,s2->y를 AND로 계산함

 

 

4. Perceptron 모델 파이썬 구현

 

Perceptron 모델을 파이썬으로 구현해보겠습니다.

 

import numpy as np

# 입력
x = np.array([[0,0],[0,1],[1,0],[1,1]])
print(x.shape)
# (4,2): feature(특징)이 2개인 4개의 sample


# perceptron 정의

def perceptron(x,w,b):
    # 입력 x,w는 ndarray
    # w1x1+w2x2는 w 벡터와 x벡터의 내적
    y = x.dot(w)+b > 0
    return y.astype('int')
    # 반환하는 값이 bool type인 ndarray이므로 astype()로 타입 변경

 

x는 x1,x2로 구성되어 있으며 위와 같은 ndarray입니다.

 

perceptron 함수는 x,w,b 값을 받으며 x와 w의 내적에 b를 더한 값이 0보다 크다면 True 작다면 False를 반환합니다.

 

# AND
def AND(x_and):
    w_and = np.array([3,4]) # w와 b값은 각 조건을 충족하는 임의의 값임
    b_and = -5
    return perceptron(x_and,w_and,b_and)
    
# NAND
def NAND(x_nand):
    w_nand = np.array([-3,-4])
    b_nand = 5
    return perceptron(x_nand,w_nand,b_nand)

# OR
def OR(x_or):
    w_or = np.array([0.5,0.5])
    b_or = -0.3
    return perceptron(x_or,w_or,b_or)

 

AND,NAND,OR입니다.

각 w와 b값은 조건에 맞는 임의의 값 입니다.

 

# XOR (multi-layer perceptron)
def XOR(x_xor):
    s1 = NAND(x_xor).reshape(-1,1) # 입력 값이 2차원이어야 함
    s2 = OR(x_xor).reshape(-1,1)
    y = AND(np.concatenate((s1,s2),axis=1)) # s1과 s2를 열을 기준으로 합침
    return y

 

XOR입니다.

s1과 s2는 각각 NAND와 OR로 계산합니다.

출력 값이 1차원으로 나오므로 reshape를 통해 2차원 벡터로 변형합니다.

다음 concatenate를 통해 열을 기준으로 합쳐 AND를 계산해 XOR의 출력 값을 계산합니다.

 

print(AND(x))
print(NAND(x))
print(OR(x))
print(XOR(x))

결과가 모두 잘 뜨는 것을 확인할 수 있습니다.

728x90
반응형