PostIT

[AI/Deep Learing] 인공지능을 위한 Deep Learning 준비(시그모이드 & ReLU 함수 구현하기) - 2 본문

Deep Learning

[AI/Deep Learing] 인공지능을 위한 Deep Learning 준비(시그모이드 & ReLU 함수 구현하기) - 2

shun10114 2017. 5. 31. 20:23

# [AI/Deep Learing] 인공지능을 위한 Deep Learning 준비(신경망을 위한 시그모이드 함수 구현하기) - 2


1일차에서 퍼셉트론과 계단함수에 대해 알아봤습니다. 

이번에는 계단함수와 시그모이드 함수를 비교해보겠습니다.

1일차  계단함수


## 시그모이드 함수 구현하기

import numpy as np

import matplotlib.pylab as plt


def sigmoid(x):

    return 1 / (1 + np.exp(-x))


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

sigmoid(x)

    array([ 0.26894142,  0.73105858,  0.88079708])


t = np.array([1.0,2.0,3.0])

1.0 + t

    array([ 2.,  3.,  4.])


1.0 / t

    array([ 1.        ,  0.5       ,  0.33333333])


x = np.arange(-5.0,5.0,0.1)

y = sigmoid(x)

plt.plot(x,y)

plt.ylim(-0.1, 1.1)

plt.show()




## 계단함수와 시그모이드 함수


차이점

  • 계단함수는 직선적인 값을 갖고 있지만, 시그모이드 함수는 곡선이며 입력에 따라 출력 값이 연속적으로 변화합니다.
  • 계단 함수가 0과 1 중 하나의 값만 돌려주는 반면 시그모이드 함수는 실수(0.731 ..등)를 돌려줍니다.
공통점
  • 입력이 작을 때는 출력이 0에 가깝고, 입력이 커지면 1에 가까워 지는 구조입니다.
  • 둘 함 수 모두 비선형 함수입니다.

중요한 사항
신경망에서는 활성화 함수로 비선형 함수를 사용해야 합니다. 선형 함수를 사용해서는 안 됩니다. 이유는 선형함수는 층을 아무리 깊게 해도 은닉층이 없는 네트워크와 같기 때문입니다. 그러므로, 층을 쌓아 딥러닝의 혜택을 얻고싶다면 반드시 비선형 함수를 사용해야 합니다.


Sigmoid 함수는 사실 전에 머신러닝 붐을 약화시킨 주범입니다. 바로 hidden layer 즉 층이 깊어지면 깊어질수록 정확성을 오히려 떨어뜨린다는 것입니다. sigmoid 특성상 마이너스 값을 0에 가깝게 만듭니다. 따라서 관계가 깊어지면 깊어질수록 미분의 체인룰에 의해 sigmoid된 값들이 곱해질 때 모두다 0에 가까운 값에 수렴하게 되어 input 값이 최종값에 아무런 영향을 끼치지 못하는 사태가 벌어지게 됩니다.
이를 위해 탄생한게 ReLU입니다. ReLU는 0이하의 값이 들어오면 0을 출력하고 0이상의 값이 오면 비례함수로 그냥 내보내는 겁니다.



## ReLU 함수



ReLU는 입력이 0을 넘으면 그 입력을 그대로 출력하고, 0 이하이면 0을 출력하는 함수입니다.



def relu(x):
    return np.maximum(0,x)
 

# print(np.maximum(0,x))
# maximum : 두 원소중 큰 값을 반환
# np.maximum(0,1) -> 1
# np.maximum(0,x) (x : -10 ... 9.9) -> 브로드캐스팅에 의해 maximum(0, -10) ... maximum(0, 9.9)
 

x = np.arange(-10, 10, 0.1)
y = relu(x)
plt.plot(x,y)
plt.ylim(-0.1, 10.1)
plt.show()



## 참고

밑바닥부터 시작하는 딥러닝

https://penglover.github.io/2017/01/15/relu-vs-sigmoid/

Comments