본문 바로가기
컴퓨터&프로그래밍&머신러닝

[딥러닝] 퍼셉트론 - 연속출력 실습

by 토들백만장자 2020. 10. 30.

이번 포스팅에서는 지금까지 살펴본 퍼셉트론을 이진분류 체계에서 나아가

연속값 출력 방식으로 실습해보려 한다. 그래서 XOR게이트가 어떻게 그림 그려지는지도 확인해보자.

 

마찬가지로 지난 포스팅을 건너뛰고 이번 포스팅을 보는 독자들은 이전 포스팅도 부터 보기를 추천한다.

 

>> 이전 포스팅 보러가기

 

[딥러닝] 퍼셉트론 출력신호 조절 - 활성화 함수

이번 포스팅도 꾸준히 앞선 포스팅에서부터 연속된 내용이다. 퍼셉트론 개념부터 시작하므로 역시나 이해가 부족하면 이전 포스팅서부터 같이 와주길 바란다. >>>이전포스팅 보러가기 [딥러닝]

toddlemillionaire.tistory.com

 

지난시간에는 활성화 함수를 통해서 신호가 연속적으로 출력시키는 Sigmoid함수를 확인했다.

간단히 보자면 주어진 수식을 분석하면 알파벳 S자 형태의 그래프로 0부터 1까지의 값이 연속적으로 나온다.

이를 AND게이트, NAND게이트, OR게이트, 그리고 XOR게이트에 하나하나씩 적용해보도록 하겠다.

 

AND게이트

AND게이트 예시

필자는 그림의 수식처럼 가중치와 편향치를 설정하고 실습을 하였다.

연속적인 신호로 보면 신호가 전달된 참값 영역-푸른원-은 신호가 강하게 나타나야하고,

반대의 영역-붉은 X-은 신호가 약하게 나타나야한다.

 

파이썬 코드와 그림은 아래와 같다.

(포스팅 맨마지막에 사용되었던 코드 전체를 제공해줄것이니 흐름만 따라가자)

 

def AND(x1,x2):
	y=x1+x2-1.5
	return Sigmoid_function(y)​

 

AND게이트 연속신호

그림의 오른쪽 컬러바를 보면 붉은영역이 신호가 큰영역, 푸른영역이 신호가 작은부분이다. 

이진 분류방식과 그림이 유사하게 나오는 것을 확인 할 수 있다.

(참고로 Sigmoid함수를 정의 그대로쓰면 위 그림과 같이 나오지 않는다. 필자는 그림을 선명하게 그리기위해 Sigmoid함수에 입력값 x에 스케일 트릭을 걸었다는 점을 미리 밝히는 바이다)

 

NAND게이트

NAND게이트 예시

AND게이트의 반대 신호이다. AND게이트 수식에 '-'부호만 붙여주면 NAND게이트가 구현된다.

 

파이썬코드와 그림은 다음과 같다.

 

def NAND(x1,x2):
	y=-(x1+x2-1.5)
	return Sigmoid_function(y)

NAND게이트 연속신호

AND와 마찬가지로 신호가 강해야할 부분이 붉게 이미지로 표현됨을 확인하였다.

 

OR게이트

논리합 게이트로 원점(0,0)이외의 지점에서 신호가 강하게 나오는 논리회로이다.

OR게이트 예시

파이썬코드와 그림은 다음과 같다.

def OR(x1,x2):
	y=x1/0.5+x2/0.5-1
	return Sigmoid_function(y)​

 

XOR게이트

논리게이트를 두 개를 이어서 만드는 다층퍼셉트론을 통해서만 구현할수있는 복잡한 논리게이트이다.

 

XOR게이트 예시

이전 포스팅에서 어떻게 조합해서 나오는지 말하였기 때문에 구체적으로 말하진 않겠다.

 

파이썬 코드와 그림은 다음과 같다.

(그림에 대해 미리 말하건대 예시로 만든 직선과는 다른방식으로 구분을 짓는다 ^^)

 

def XOR(x1,x2):
		new_x1 = self.NAND(x1,x2)
		new_x2 = self.OR(x1,x2)
		return AND(new_x1,new_x2)

XOR 연속신호

XOR게이트를 생각해보면 X1과 X2가 이질적일수록 강한신호가 나타나야하는데 비슷한 영역에서도 상대적으로 강한신호가 출력됨을 확인하였다. (아무래도 버그같은데 확인해서 수정하도록 하겠다)

 

 

 

자! 지금까지 가중치 및 편향을 설정해서 원하는 결과를 얻을 수 있는 퍼셉트론을 구현함으로 인공지능의 기초발판을 마련하였다고 볼 수있다. 다음포스팅에서부터 딥러닝의 계산그래프, 경사하강법 등등 한단계 발전된 예시로 포스팅을 할예정이다. 

 

어느것부터 해볼까... 하고 생각을 하다가 글을 읽은 독자들이 AND게이트 OR게이트등 가중치와 편향치를 구하는 방식에 대해서 '대체 저런 가중치 및 편향은 어떻게 찾는거지?'라는 의문사항이 많이 들것이라고 생각되어 이부분 부터 짚고 넘어가겠다. 정말 재미있는(나만?) 이야기이므로 기대해도 괜찮을 것 같다.

 

이번 포스팅을 작성하기위한 코드의 전문은 다음과 같다.

 

import numpy as np
import matplotlib.pyplot as plt

def Sigmoid_function(x):
	return 1/(1+np.exp(-3*x))

def Relu_function(x):
	return np.where(x>=0,3*x,0)
	
def Elu_function(x):
	return np.where(x>0,x,np.exp(x)-1)

def Drawing(data):
	plt.imshow(data,extent=[0,1,0,1])
	plt.grid()
	plt.xlabel('x1')
	plt.ylabel('x2')
	plt.colorbar()
	plt.show()

x1 = np.linspace(0,1)
x2 = np.linspace(0,1)
X1,X2 = np.meshgrid(x1,x2)
X2 = np.flipud(X2)
	
class Continuous_Logic_Gate():		
	def AND(self,x1,x2):
		y=x1+x2-1.5
		return Sigmoid_function(y)
		
	def NAND(self,x1,x2):
		y=-(x1+x2-1.5)
		return Sigmoid_function(y)
		
	def OR(self,x1,x2):
		y=x1/0.5+x2/0.5-1
		return Sigmoid_function(y)
		
	def XOR(self,x1,x2):
		new_x1 = self.NAND(x1,x2)
		new_x2 = self.OR(x1,x2)
		return self.AND(new_x1,new_x2)
		
Gate_info = Continuous_Logic_Gate()	
	
Drawing(Gate_info.AND(X1,X2))
Drawing(Gate_info.NAND(X1,X2))
Drawing(Gate_info.OR(X1,X2))
Drawing(Gate_info.XOR(X1,X2))​

 

 

 

P.S np.flipud구문이 중간중간 나온 이유는 우리는 y축을 아래에서부터 위로 증가하는 방향으로 그리지만 python은 array를 위에서부터 아래로 증가하는 방식으로 그리기때문에 사람이 보고 이해하게끔 반전을 시켜주었기 때문이다.

 

댓글