티스토리 뷰

AI/밑바닥부터 시작하는 딥러닝

퍼셉트론

취뽀가자!! 2018. 8. 27. 09:26

이 카테고리에 있는 모든 글들은 밑바닥부터 시작하는 딥러닝을 읽고 정리한 글입니다.


퍼셉트론

퍼셉트론은 프랑크 로젠블라트가 1975년에 고안한 알고리즘이다. 퍼셉트론이 중요한 이유는 신경망의 기원이기 때문이다.

퍼셉트론이란?

퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력한다. 


위 그림은 입력으로 2개의 신호를 받은 퍼셉트론의 예이다. x1과 x2는 입력을, w1과 w2는 가중치를, 원은 뉴런을 모방한 노드를 뜻한다.


동작원리는 입력 신호가 노드에 보내질 때는 각각 고유한 가중치가 곱해진다. 여기서 가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용한하고, 가중치는 클수록 해당 신호가 더 중요하다는 것을 의미한다. 그리고 노드에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력한다. 이것을 '노드를 활성화시킨다' 라고 표현한다.(임계값이라고도 부름) 아래는 수식으로 나타낸 것이다.


단순한 논리 회로


1, AND 게이트

AND게이트는 입력이 둘이고 출력은 하나고, 두 입력이 모두 1일때 1을 출력한다.

진리표


이 AND 게이트를 퍼셉트론으로 표현하고 싶다면 위 진리표대로 작동하도록 w1, w2, theta의 값을 정하는 것이다.


2. NAND 게이트와 OR 게이트

NAND 게이트는 아까 설명했던 AND 게이트에 NOT을 붙여 보수를 취한것과 같다.

OR 게이트는 입력 신호 중 하나 이상이 1이면 출력이 1이 되는 논리 회로입니다. OR 게이트의 진리표는 아래와 같다.

진리표

이렇게 해서 퍼셉트론의 AND, NAND, OR 논리 회로를 표현할 수 있음을 알았다. 여기서 중요한 점은 AND, NAND, OR 게이트 모두 퍼셉트론의 구조에서 같다는 점이다. 다른 점이라면 매개변수(가중치와 임계값)이다.

퍼셉트론의 구현

1. AND 게이트의 구현

다음은 x1과 x2를 인수로 받는 AND라는 함수이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def AND(x1, x2):
    #w1, w2, theta 초기화
    w1, w2, theta= 0.50.50.7
    tmp=x1*w1+x2*w2
 
    #가중치를 곱한 입력의 총합이 
    #임계값이 넘으면 1, 아니면 0 
    if tmp<=theta:
        return 0
    elif tmp>theta:
        return 1
 
print(AND(0,0)) #0
print(AND(1,1)) #1
print(AND(1,0)) #0
print(AND(0,1)) #0
cs

2. 가중치 편향 도입

앞에서 구현한 게이트들은 직관적으로 알기 쉽지만 신경망에서는 결과는 똑같지만 약간 다른 방식으로 수정해서 사용한다.
다른 방식은theta를 -b로 치환해서 아래수식으로 바꿔 사용한다. 여기서 b는 편향이라고 부른다.


위 식을 설명해보면 임력신호에 가중치를 곱한 값과 편향을 합하여, 그 값이 0을 넘으면 1을 출력하고 못 넘으면 0을 출력하는 식이다.


3. 가중치와 편향 구현하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import numpy as np
 
def AND(x1, x2):
    x=np.array([x1,x2])
    w=np.array([0.5,0.5])
    b=-0.7
    tmp=np.sum(w*x)+b
 
    if tmp<=0:
        return 0
    elif tmp>0:
        return 1
 
print(AND(0,1))
print(AND(0,0))
print(AND(1,0))
print(AND(1,1))
cs


다시 정리해보면 -theta를 b로 치환하고, 편향은 노드가 얼마나 쉽게 활성화(결과로 1을 출력) 되느냐를 조정하는 매개변수이다.

ex)b=-0.1 -> 입력과 가중치를 곱한 값들의 합이 0.1을 넘으면 1출력(활성화)


아래는 NAND와 OR을 구현한 코드입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import numpy as np
def NAND(x1,x2):
    x=np.array([x1,x2])
    w=np.array([-0.5,-0.5])
    b=0.7
    tmp=np.sum(x*w)+b
 
    if tmp<=0:
        return 0
    elif tmp>0:
        return 1
 
print(NAND(1,1))
print(NAND(0,1))
print(NAND(1,0))
print(NAND(0,0))
cs



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np
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
    elif tmp>0:
        return 1
print(OR(1,1))
print(OR(0,1))
print(OR(1,0))
print(OR(0,0))
cs



퍼셉트론의 한계

1. xor 게이트

xor은 x1과 x2 중 한쪽이 1일 때만 1을 출력한다. 

진리표                                                   

퍼셉트론의 한계는 xor에서 나온다. 왜인지는 그림으로 확인하겠다.



위 그림처럼 or과 and는 선 하나로 구분이 되지만 xor같은 경우는 선 하나로 구분이 불가능하다.


하지만 xor을 구분하기 위해서는 선형이 아닌 비선형을 사용하여 구분한다면 가능하다.

저렇게 비선형으로 만들기 위해서는 and, or처럼 단층 퍼셉트론으로는 구현이 불가능 하지만, 여러 개의 층을 쌓아 다층 퍼셉트론을 만들면 가능해진다.

어떻게 조합하여 연결하면 가능한지 알아보겠다.

위 그림처럼 and와 or 그리고 nand를 조합하면 가능해진다.


2. XOR 게이트 구현하기

1
2
3
4
5
6
7
8
9
10
11
def XOR(x1,x2):
    s1=NAND(x1,x2)
    s2=OR(x1,x2)
    y=AND(s1,s2)
 
    return y
 
print(XOR(1,1))
print(XOR(0,1))
print(XOR(1,0))
print(XOR(0,0))
cs

이렇게 하면 xor을 풀 수 있게 된다.



이 그림은 xor을 그림으로 표현한 것이다. 그림에 대해 자세히 설명해 보면 0층의 두 뉴런이 입력 신호를 받아 1층의 뉴런으로 신호를 보내고, 1층의 뉴런이 2층의 뉴런으로 신호를 보내고, 2층의 뉴런은 이 입력 신호를 바탕으로 y를 출력한다.


여기서 중요한 핵심은 단층 퍼셉트론으로는 표현하지 못하면 층을 하나 더 추가하고 2개로도 안되면 3개.. 이런식으로 점점 늘려나가면 더 다양한 것을 표현할 수 있다는 점이다.(실제 이론상으로는 컴퓨터도 표현 가능)


정리

이번 글에서 설명한 것들을 간략하게 정리했다.

● 퍼셉트론은 입출력을 갖춘 알고리즘이다. 입력을 주면 정해진 규칙에 따른 값을 출력한다.
● 퍼셉트론에서는 '가중치'와 '편향'을 매개변수로 설정한다.
● 퍼셉트론으로 AND, OR, NAND 게이트 등의 논리 회로를 표현할 수 있다.
● XOR은 단층 퍼셉트론으로는 구현 불가능하고, 다층 퍼셉트론을 사용해야 한다.
● 단층 퍼셉트론은 직선형 영역만 표현할 수 있고, 다층 퍼셉트론은 비선형 영역도 표현할 수 있다.
● 다층 퍼셉트론은 (이론상)컴퓨터를 표현할 수 있다. 





-------------------------------------------------------------------
이 글은 밑바닥부터 시작하는 딥러닝을 읽고 정리한 글입니다.






'AI > 밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글

오차역전파(2)  (0) 2018.09.18
오차역전파법(1)  (0) 2018.09.17
신경망 학습  (0) 2018.09.13
신경망(2)  (0) 2018.09.09
신경망(1)  (0) 2018.09.03
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함