본문 바로가기

Python/DeepLearning

퍼셉트론에서 신경망으로(2)

 활성화 함수는 임계값을 경계로 출력이 바뀐다. 이러한 함수를 계단 함수(step function)이라고 한다. 계단 함수 이외의 다른 함수를 알아본다.

- 시그모이드 함수

$$h(x) = \frac{1}{1+exp(-x)}$$

 여기서 exp는 우리가 흔히 알고 있는 자연상수 e이다. 

- 계단 함수를 그려보자.

def step_function(x):
	if x > 0:
		return 1
	else:
		return 0

 아주 간편하게 0 초과의 값이 나오면 1을 반환하고 0 이하의 값이 나오면 0을 주는 함수이다. 하지만 우리가 사용하는 numpy를 input으로 넣을 수 없으므로 조금 수정한다. 

import numpy as np

def step_function(x):
	y = x > 0
	return y.astype(np.int)

x = np.array([-1.0, 1.0, 2.0])
print(x)
print(step_function(x))

y는 np의 원소값을 판단해 0과 1로 돌려주는 bool (True/False) 배열이다. 이제 이들을 이용해서 계단 함수를 직접 그려보자.

import numpy as np
import matplotlib.pylab as plt

def step_function(x):
	return np.array(x>0, dtype=np.int)

x = np.arange(-5.0,5.0,0.1)
y = step_function(x)
plt.plot(x,y)
plt.ylim(-0.1,1.1)
plt.show()

 

0을 경계로 출력이 0에서 1로 바뀐다. 이렇게 값이 한번에 확 변하기 때문에 계단함수라고 칭한다. 같은 방법으로 시그모이드 함수도 만들어본다.

import numpy as np
import matplotlib.pylab as plt

def sigmoid(x):
	return 1 / (1+np.exp(-x))

x = np.arange(-5.0,5.0,0.1)
y = sigmoid(x)
plt.plot(x,y)
plt.ylim(-0.1,1.1)
plt.show()

보기 이쁜 그래프가 만들어진다. S자 모양 함수라고 생각하면된다. 시그모이드 함수와 계단 함수의 차이점을 알기 위해 동 캔버스에 같이 그려본다.

import numpy as np
import matplotlib.pylab as plt

def step_function(x):
	return np.array(x>0, dtype=np.int)

def sigmoid(x):
	return 1 / (1+np.exp(-x))

x = np.arange(-5.0,5.0,0.1)
y1 = sigmoid(x)
y2 = step_function(x)
plt.plot(x,y1)
plt.plot(x,y2)
plt.ylim(-0.1,1.1)
plt.show()

x값과 y값의 범위는 서로 같으나 매끄러움이 서로 다르다. 게다가 돌여주는 y값이 다르다. 계단함수는 0과 1밖에 존재하지 않지만 시그모이드는 나름 많은 값을 주고 있다. 보면 입력이 작을 때 0값에 가깝고 입력이 클수록 1값에 가깝다. 이 친구들은 비선형함수이다. 신경망에서는 은닉층을 위해 꼭 비선형함수를 사용해야한다.

 알아야 할 함수가 하나 더 있다. 바로 ReLU(Rectified Linear Unit)이다. 입력이 0을 넘으면 입력을 그대로 출력하고 0 이하이면 0을 출력하는 함수이다.

$$h(x) = x(x>0), 0(x<=0)$$

구현해보자.

import numpy as np
import matplotlib.pylab as plt

def relu(x):
	return np.maximum(0,x)
	
x = np.arange(-5.0,5.0,0.1)
y3 = relu(x)
plt.plot(x,y3)
plt.ylim(-0.1,5.1)
plt.show()

다같이 그려보자!

입력이 1이후의 값의 출력이 확 달라지는 것을 볼 수 있다.