티스토리 뷰

전 게시글에서는 하나의 퍼셉트론 (단층 퍼셉트론) 으로 표현할 수 있는 3가지 (AND, NAND, OR) 논리회로를 표현해 보았습니다.

 

2020/09/13 - [Study/인공지능] - 퍼셉트론 AND, NAND, OR 논리회로 표현하기 ( 인공지능 기초 #2 )

 

이번에는 하나의 퍼셉트론으로는 만들 수 없는 XOR 게이트를 알아보겠습니다. [다층 퍼셉트론 이용]

 

XOR 게이트는 배타적 논리합이라는 논리회로 입니다. 입력값이 둘중 한개만 1일때만 1 (true)를 출력합니다.

 

 

왜 단층 퍼셉트론으로는 구현 할 수 없을까요?

 

앞에서 구현해 보았던 OR 게이트의 경우 좌표로 나타내면 아래와 같이 나타납니다.

여기서 중요한점은 퍼셉트론 함수는 true와 false의 두 구간으로 나누어주는 역할을 한다는 것입니다.

 

하지만 xor 같은 경우는 0,0 1,1 일 경우 false  0,1 1,0 일 경우 true 입니다.

 

 

위 좌표에서도 볼 수 있듯이 true 와 false 영역을 1차함수인 하나의 퍼셉트론으로는 표현할 수가 없습니다.

 

실제로 인공신경망을 연구하던 초창기에 xor을 증명할 수 없다는 사실을 깨닫고 많이 좌절하고 인공지능이 조금 소외됐었다고 합니다.

 

하지만, 다행히 이를 해결할 수 있는 다층 퍼셉트론을 통한 해결방법이 제시되었습니다!

 

 

AND, OR, NAND 게이트를 조합하여 만든 XOR 게이트

 

 

 

 

p -> q 명제 증명 

 

p  q  p->q

T  T     T

T  F     F

F  T     T

F  F     T

 

 

x= [1,2]

y= [3,4]

 

numpy.array(x)

Out : array([1,2])

numpy.array(y)

Out : array([3,4])

x*y

Out : array([3,8])

 

numpy.array 를 사용함으로써 x의 벡터연산이 가능하게 만들어준다.

 

np.sum(x)

Out : 3

 

np.sum(y)

Out : 7

 

XOR 게이트 퍼셉트론 in python

 

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
    else :
        return 1
 
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
 
def XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y
 
XOR(0,0)
XOR(0,1)
XOR(1,0)
XOR(1,1)


 

 

 

np.sum(x*w)

 

tmp = (x1*w1)+(x2*w2)+b    //: x1*w1+x2*w2<-b 이것이 퍼셉트론 공식. // tmp = x1*w1+x2*w2 + b 이걸 0보다 크거나 작거나를 판단함으로써 퍼셉트론 공식을 만족시킨다.  

 

 

3개의 논리 게이트를 만든 후 그것들을 조합하여 XOR 게이트를 만든다.

 

 

 

if __name__ == '__name__' :
	for xs in [(0,0), (1,0), (0,1), (1,1)]:
  	  y = XOR[xs[0], xs[1])
  	  print(str(xs) + " -> " + str(y))
	

XOR(0,0) 이하 대신 위 코드를 사용해도 된다.

 

 

if __name__ == '__name__' :

이게 의미하는 바는 2번 파일에서 1번 Py 파일을 불러와서 사용할 때 1번 파일의 출력결과를 보고싶지 않고 2번만 보고싶다.

 

이럴때 사용할 수 있습니다. 파일을 실행한 main이 아니면 if 이하의 항목을 실행하지 않는다 라는 의미입니다.

댓글
최근에 올라온 글
최근에 달린 댓글
250x250