Logic Gate by Perceptron

짜장범벅·2022년 6월 4일
0

수학이 주전공이었던 나는 2학년 때 집합론 강의에서 처음으로 접한 Logic Gate.

예전에 들어서 기억은 잘 안나지만 Boolean 대수(?)로 배웠는데 아마 컴퓨터 공학과에서 학부 수업으로 논리회로나 자세하게는 오토마타 시간에 배웠을 것이다.

Logic Gate는 여러 연산이 있지만 우선 and, or를 먼저 생각해보자.

1은 true고 0은 false인 것은 집합론에서 다루면 '명제가 어떻고....' 따위의 과정을 거쳐야 하지만 너무 오래된 기억이라 까먹었기 때문에 생략하겠다. and와 or을 간편히 표로 나타내면

and : 

xyanswer
000
010
100
111

or : 

xyanswer
000
011
101
111

여기서 딥 러닝에서 등장하는 Perceptron을 통해 and와 or Gate를 나타내보자.

처음에 나는 Perceptron을 가지고 Logic Gate를 '어떻게 나타낼까?'란 질문을 받고 이렇게 답했었다.

import numpy as np

def AND(x, y):
    X = np.array([x,y])
    w = np.array([1,1]) # weight
    b = -1.5
    
    tmp = np.sum(X*w)+b
    
    if tmp >= 0:
        return 1
    else:
        return 0
      
def OR(x, y):
    X = np.array([x,y])
    w = np.array([1,1])
    b = -.5
    
    tmp = np.sum(X*w)+b
    
    if tmp >= 0:
        return 1
    else:
        return 0

하지만 대부분은 weight를 0.5, bias를 -0.7을 둬서 and gate를 구현했다. 뭐 틀린건 아니니 각자 취향이라 생각하자.

간편한 and와 or gate는 한개의 perceptron으로 해결할 수 있지만 복잡한 xor같은 gate를 처리하기 위해서는 여러개의 perceptron으로 해결해야한다. 사실 여기서 linear와 nonlinear를 언급해야하지만 설명이 길어지니 Reference 2번을 참고하라.

nand와 or, and를 조합하면 xor를 구현할 수 있다. 우선 nand를 perceptron으로 정의하면

import numpy as np

def NAND(x1, x2):
  x = np.array([x1,x2])
  w = np.array([-1,-1]) #weight
  b = 1.5 #bias
  
  tmp = np.sum(x*w)+b
  
  if tmp>=0:
    return 1
  else:
    return 0

처럼 표현할 수 있다. 따라서 위의 and, or, nand를 이용해 xor을 조합하면 다음과 같다.

#This code has an assumption that NAND, OR and AND are well-defined.

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

여기서 Activation Function은 (당연히) step function을 사용한 것이라 생각할 수 있다.

Reference

[1] https://en.wikipedia.org/wiki/XOR_gate

[2] https://excelsior-cjh.tistory.com/169

profile
큰일날 사람

0개의 댓글