반응형

퍼셉트론이란 1957년에 고안된 알고리즘으로 신경망(딥러닝)의 기원이 되는 알고리즘이다.

 

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

(여기서 신호는 흐른다/안 흐른다 (1이나 0)의 값만을 가질 수 있다.)

 

2개의 입력신호를 받는 퍼셉트론의 예

 

X1과 X2는 입력신호, y는 출력신호, w1, w2는 가중치를 뜻하고 아래 식의 theta는 임계값을 나타낸다.

그리고 그림의 원을 뉴런 혹은 노드라고 부르고 입력신호가 뉴런에 보내질 때는 각각 고유한

가중치가 곱해진다.

 

[식.1]

 

 

그럼 퍼셉트론을 활용한 간단한 문제들을 보자.

 

AND 게이트의 진리표

위의 표는 AND게이트의 진리표를 나타낸 표이다.

이 AND게이트를 퍼셉트론으로 표현해보자.

 

입력은 x1, x2 가 존재하고 출력은 y로 존재한다.

이를 만족하는 매개변수 조합은 무수히 많겠지만 몇가지 예를 통해 이해해보도록 하겠다.

 

(w1, w2, theta) 가 (0.5, 0.5, 0.7) 이라고 가정해보자.

 

첫번째로 x1=0, x2=0 일때

w1x1 + w2x2 = 0 이므로 만족한다.

 

다음 x1=1, x2=0 일때

w1x1 + w2x2 = 0.5  이므로 이는 임계값(theta)보다 작으므로 만족하고

따라서 x1=0, x2=1 일때도 역시 만족할 것이다.

 

마지막으로 x1=1, x2=1 일때

w1x1 + w2x2 = 1 이므로 이는 임계값보다 큰 값이 되고 따라서 1이 출력되도록 된다.

 

따라서 (w1, w2, theta) 를 (0.5, 0.5, 0.7) 로 설정하는 것은 AND게이트를 잘 표현한 것이다.

 

 

 

위의 내용을 구현해보자.

def AND(x1, x2):
    w1, w2, theta = 0.5, 0.5, 0.7
    tmp = x1*w1 + x2*w2
    if tmp <= theta:
        return 0
    elif tmp > theta:
        return 1
    
    
print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))

이와 같이 나타낼 수 있을 것이고 출력결과

 

0

0

0

1

 

이 출력되는 것을 확인할 수 있을 것이다.

 

 

 

 

다음으로 위의 [식.1] 을 조금 변형시켜 보도록 하자.

[식.1]의 theta를 (-b) 로 치환시켜보도록 하자.

 

[식.2]

위와 같이 표현할 수 있다.

 

[식.1]과 [식.2] 는 표기방식만 바꿨을 뿐 같은 내용이고 [식.1]에서 theta를 임계값으로 표현하였는데

이제부터 이를 [식.2] 처럼 표시하고 여기서 b를 편향 이라고 하자.

w1과 w2는 여전히 가중치를 의미한다.

 

즉 w1과 w2는 각 입력신호가 결과에 주는 영향력(중요도)을 조절하는 매개변수이고

편향은 뉴련이 얼마나 쉽게 활성화하느냐를 조정하는 매개변수이다.

 

 

NAND 게이트의 진리표
OR 게이트의 진리표

그리고 위와 같은 내용으로 NAND 게이트와 OR게이트가 표현 가능하다.

def NAND(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
    else:
        return 1
    
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 

 

 

하지만

위의 경우에는 한계가 존재한다.

 

XOR게이트에 대하여 생각해보자.

XOR게이트의 진리표

 

지금까지 본 퍼셉트론으로는 XOR게이트를 구현할 수 없다.

이를 위해 다층 퍼셉트론  의 개념을 사용하게 되는데

이는 퍼셉트론의 층을 쌓는다고 보면 된다.

 

쉽게말해 AND, OR, NAND 게이트를 조합하여 XOR게이트를 표현하는 것이다.

위의 그림과 같이 NOR게이트를 AND와 NAND, OR 게이트를 이용하여 표현할 수 있고

이를 구현하면 아래와 같다.

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

print(XOR(0,0))
print(XOR(1,0))
print(XOR(0,1))
print(XOR(1,1))

그리고 실행 결과

 

0

1

1

0

 

이 출력됨을 확인할 수 있을 것이다.

반응형

+ Recent posts