Practice makes perfect

[DeepLearning] 퍼셉트론(perceptron) 본문

Anaconda/DeepLearning

[DeepLearning] 퍼셉트론(perceptron)

kerpect 2020. 8. 3. 16:10

퍼셉트론(perceptron)

- 프랑크 로젠블라트(Frank Rosenblatt)가 1957년에 고안한 알고리즘


- 신경망(딥러닝)의 기원이 되는 알고리즘


- 퍼셉트론의 구조를 배우는 것은 신경망과 딥러닝으로 나아가는 데 중요한 아이디어를 배우는 일

 

- 퍼셉트론은 모든 학습 데이터를 정확히 분류시킬 때까지 학습이 진행되기 때문에 학습 데이터가 선형적으로 분리될 수

  있을 때 적합한 알고리즘

 

출처: https://www.slideshare.net/jbhuang/lecture-29-convolutional-neural-networks-computer-vision-spring2015

 

● 퍼셉트론(perceptron : 인공 뉴런 / 단순 퍼셉트론)

- 다수의 신호를 입력으로 받아 하나의 신호를 출력
- 신호 : 전류나 강물처럼 흐름이 있는 것을 상상
- 퍼셉트론 신호도 흐름을 만들고 정보를 앞으로 전달
- 퍼셉트론 신호는 ‘흐른다(1로 표현) / 안 흐른다(0으로 표현)의 두 가지 값으로 표현

 

 

퍼셉트론의 동작 방식  

: 각 노드의 가중치와 입력치를 곱한 것을 모두 합한 값이 활성함수에 의해 판단되는데, 그 값이 임계치(보통 0)보다 크면 뉴런이 활성화되고 결과값으로 1을 출력합니다. 뉴런이 활성화되지 않으면 결과값으로 -1을 출력합니다. 

 

- 입력으로 2개의 신호를 받은 퍼셉트론의 예

- x1 과 x2는 입력 신호
- y는 출력 신호
- w1 과 w2는 가중치(weight) : 각 신호가 결과에 주는 영향력을

                                        조절하는 요소로 작용

- 각 입력신호에는 고유한 weight가 부여되며 weight가 클수록

  해당 신호가 중요 
- 뉴런(혹은 노드) : 그림의 원
- θ(theta) : 임계값(뉴런의 활성화 기준값)

  θ : 흐르는지 흐르지 않는지에 대한 기준이 되는 값    

  θ < y  신호가 흐른다 / θ >= y 신호가 흐르지 않는다. 

 

 

- 신호가 흐르지 않는다.

 

- 신호가 흐른다. 

 

 

퍼셉트론의 출력 값은 앞에서 말했듯이 1 또는 0(or -1)이기 때문에 선형 분류(linear classifier) 모형이라고도 볼 수 있습니다. 보통 실수형의 입력 벡터를 받아 이들의 선형조합을 계산하는 것이며, 선형 분류 평면 상에 선을 쫙 그어서 여기 넘으면 A, 못 넘으면 B 이런식으로 분류합니다. 


y = ax + b 의 기원이 되는 것으로 a(기울기) = w 값,  b(절편) = x 값 입니다. 

y = w1x1 + w2x2 , 2개의 feature(colum) 를 통해서 계산 하는 것입니다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

- 컴퓨터에서 가장 많이 존재합니다. 변화가 일어날때만 출력하기 때문에 일정한 상태가 지속되어 질때, 이벤트를 감지합니다. 

 

 

 

 

 

 

 

 

컴퓨터의 cpu가 위의 모습으로 되어 있기 때문에 이러한 모습을 컴퓨터의 언어로 만들어준 시초가 퍼셉트론으로  빠른 명령을 내려서 피드백 받을 수 있도록 하기 위한 것이었다. 

 

 

perceptron -> 신경망 : 20년이라는 과도기가 있었습니다. 

gate - AND , NAND , OR , NOR

 

1차 암흑기) 

 

 

- ○ (동그라미) 와 △ (세모)는 일차 함수로 나눌 수 없었기 때문에 과도기가 존재했습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

AND , NAND , OR 를 구성하여 XOR를 구현 

 

 

 

문제 해결

: 단층으로 선형으로만 가능할 것이라는 고정관념에서 다층으로 가져감으로 비선형성을 가지는 것을 발견되었습니다. 

 

 

노드를 다층으로 가져가므로 물리적으로  gate를 조합함으로 분류가 가능하도록 되었다. 비선형의 모형으로 구분할 수 있도록 합니다. 

 

- 다층(선형) -> 다층(비선형) 

 

 

 

 

 

 

 

 

 

- 다층 구조 

XOR gate : 다층 퍼셉트론

 

다층 퍼셉트론의 동작 설명


 1. 0층의 두 뉴런이 입력 신호를 받아 1층의 뉴런으로 신호를 보냅니다. 
 2. 1층의 뉴런이 2층의 뉴런으로 신호를 보내고, 2층의 뉴런은이 입력신호를 바탕으로 y를 출력합니다. 
 3. 단층 퍼셉트론으로는 표현하지 못한 것을 층을 하나 늘려 구현할 수 있었습니다. 
 - 퍼셉트론은 층을 쌓아(깊게하여) 더 다양한 것을 표현할 수 있습니다. 

 

 

 

 

1) 단순한 논리 회로 – AND 게이트

 - 퍼셉트론을 활용한 간단한 문제 적용
 - AND 게이트를 퍼셉트론으로 표현하기
 - 즉, w1, w2, θ 의 값 구하기

 - 사람이 매개변수 값을 정함

 

 

 

 

 

 

def AND(x1, x2):
    w1, w2, theta = 0.5, 0.5, 0.7 # 사람이 매개변수의 값을 정함.
    tmp = w1 * x1 + w2 * x2

    if tmp <= theta:
        return 0
    else:
        return 1
if __name__ == "__main__":
    for xs in [(0,0),(0,1),(1,0),(1,1)]:
        y = AND(xs[0],xs[1])
        print(str(xs)+" : "+ str(y))

 

앞의 퍼셉트론 수식에서 나오는 세타θ를 -b로 치환하여 좌변으로 넘기면 

 

    b + w1x1 + w2x2 <0    => 0

    b + w1x1 + w2x2 >=0  => 1

 

과 같이 되며 여기에서 b를 편향(bias)라고 할 수 있습니다. 

 

import numpy as np

def AND(x1, x2):
    x = np.array([x1,x2]) # 배열형으로 형변환 해서 x에 담다아줌
    w = np.array([0.5,0.5])
    b = -0.7

    tmp = np.sum(w * x) + b # b(bias : 편향/절편)
    if tmp <=0:
        return 0
    else:
        return 1

if __name__ == "__main__":
    result = AND(0,0)
    print(result) # 0 
    result = AND(0,1)
    print(result) # 0
    result = AND(1,0)
    print(result) # 0
    result = AND(1,1)
    print(result) # 1

 

2) 단순한 논리 회로 – NAND 게이트

- 퍼셉트론을 활용한 간단한 문제 적용
- NAND(Not AND) 게이트를 퍼셉트론으로 표현하기
- 즉, w1, w2, θ 의 값 구하기 – 사람이 매개변수 값을 정함.

- 실제 하드웨어의 동작(부하를 최소화 하기 위해 반대로 동작)

   의미를 가질 때 : 0 

   의미를 가지지 않을 때 : 1 

 

 

 

 

import numpy as np

# NAND Gate - AND의 반대
def NAND(x1, x2):
    x = np.array([x1,x2])
    w = np.array([-0.5,-0.5])
    b = 0.7 # bias

    tmp = np.sum(w * x) + b
    if tmp <= 0:
        return 0
    else:
        return 1

if __name__ == "__main__":
    result = NAND(0,0)
    print(result)
    result = NAND(1,0)
    print(result)
    result = NAND(0,1)
    print(result)
    result = NAND(1,1)
    print(result)

 

3) 단순한 논리 회로 – OR 게이트

-퍼셉트론을 활용한 간단한 문제 적용
- OR 게이트를 퍼셉트론으로 표현하기
- 즉, w1, w2, θ 의 값 구하기

– 사람이 매개변수 값을 정함

 

 

 

 

 

 

def OR(x1, x2):
    x = np.array([x1,x2])
    w = np.array([0.5,0.5])
    b = -0.2
    
    tmp = np.sum(w * x) + b
    if tmp <=0:
        return 0
    else: 
        return 1


if __name__ == "__main__":
    result = OR(0,0)
    print(result)  # 0
    result = OR(1, 0)
    print(result)  # 1
    result = OR(0, 1)
    print(result)  # 1
    result = OR(1, 1)
    print(result)  # 1

 

 

4) XOR gate - 다층 퍼셉트론 

 

import numpy as np

# AND gate
def AND(x1, x2):
    x = np.array([x1,x2]) # 배열형으로 형변환 해서 x에 담다아줌
    w = np.array([0.5,0.5])
    b = -0.7

    tmp = np.sum(w * x) + b # b(bias : 편향/절편)
    if tmp <=0:
        return 0
    else:
        return 1
# NAND gate
def NAND(x1, x2):
    x = np.array([x1,x2])
    w = np.array([-0.5,-0.5])
    b = 0.7 # bias

    tmp = np.sum(w * x) + b
    if tmp <= 0:
        return 0
    else:
        return 1
# OR gate
def OR(x1, x2):
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5])
    b = -0.2

    tmp = np.sum(w * x) + b
    if tmp <= 0:
        return 0
    else:
        return 1

def XOR(x1, x2):
    s1 = NAND(x1,x2)
    s2 = OR(x1,x2)
    y  = AND(s1,s2)

    return y

if __name__ == "__main__":
    print(XOR(0,0)) # 0
    print(XOR(0,1)) # 1
    print(XOR(1,0)) # 1
    print(XOR(1,1)) # 0