티스토리 뷰

 

 

앞으로는 -임계점 대신 편향을 사용한다.

앞으로는 -임계점 대신 편향을 사용합니다.

 

앞으로는 임계점보다 높으면 1, 임계점보다 낮으면 0 이라는 정보를 Heaviside 함수로 표현합니다.

 

즉 

 

y = h(w1x1 + w2x2 + b) 와 a=w1x1+w2x2+b 는 같은 수식입니다.

 

 

a의 값이 0보다 크면 1, a의 값이 0보다 작거나 같으면 0으로 합니다.

 

 

Heaviside 함수를 Sigmoid함수로 바꿉니다. 

 

머신러닝은 데이터를 넣으면 머신이 스스로 학습을 하는 개념입니다. 이때 미분을 통해서 학습을 합니다.

 

여기서 Heaviside 함수를 미분한다면, 미분값이 0을 제외한 함수에서 모든 값이 0으로 나오기 때문에 머신러닝을 할 수 없는 함수입니다.

 

그래서 우리는 Heaviside 함수 대신 Sigmoid 함수를 사용합니다. 앞으로 자주 사용되는 개념이니 Sigmoid 함수는 외워두셔도 좋습니다.

 

Sigmoid 함수

 

y= 1/1+e^-x

 

 

 

 

 

 

위를 보시면, Sigmoid 함수의 그래프 모양이 어째서 저런식으로 나오게 되는지 설명할 수 있습니다.

 

우선 시그모이드함수를 리미트로 보냈을 때의 값은 1또는 0 입니다. 

 

 

두번 미분 했을때 양수가 나온다는 것은 아래로 볼록이라는 의미이고

음수가 나온다는 것은 위로 볼록이라는 의미입니다.

 

 

시그모이드 함수를 두번 미분하게되면 가장 아래에 있는 값이 나오게 되는데 여기서 왼쪽 부분은 항상 양수이므로 무시하겠습니다. 오른쪽부분만 따로 보게된다면 e^-x -1 이 나오는것을 알 수 있습니다.

 

이때 x가 0보다 작거나같으면 e^-x -1 은 0보다 커지므로 아래로 볼록하다는 것을 알 수 있고

 x가 0보다 크거나같으면 e^-x -1 은 0보다 작아지므로 위로 볼록하다는 것을 알 수 있습니다.

 

 

위의 사실들을 바탕으로 그래프를 그리게 되면 아래와 같은 그림이 나오게 됩니다.

sigmoid함수 그래프

 

sigmoid함수를 파이썬으로 정의해보고, 그래프를 그려보겠습니다.

 

# coding: utf-8
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()

np.arange(-5.0,5.0,0.1) = -5부터 5까지 0.1간격의 값

 

plt < 그림 그리는 라이브러리 

 

 

실행시키면 그래프가 만들어진다.

 

 

아래는 Heaviside 함수 코드입니다.

# coding: utf-8
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)  # y축의 범위 지정
plt.show()

return np.array(x > 0, dtype=np.int) 여기서 X>0은 X가 0보다 크면 TRUE 작으면 FALSE로 나옵니다. 그 뒤 dtype=np.int 에서 TRUE이면 정수 1, FALSE 이면 정수 0 으로 바꾸어주는 역할을 합니다.

 

실행시키면 아래와 같은 그래프가 만들어집니다.

 

 

얕은 신경망에서는 괜찮지만,

 

깊은 신경망에서는 Sigmoid 함수로도 문제가 생긴다.

Vanishing Gradient Problem

라는 문제인데, 이걸 해결하는 방법으로 활성화함수를 ReLU 함수로 바꿔서 사용한다. 음수일때는 0이고 양수일때는 y=x 

 

코드는 아래와 같다.

# coding: utf-8
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)
y = relu(x)
plt.plot(x, y)
plt.ylim(-1.0, 5.5)
plt.show()

 

그래프는 아래와 같이 나온다.

 

 

2020/09/14 - [Study/인공지능] - 다층 퍼셉트론 XOR 논리회로 표현하기 , 단층으로 안되는 이유 ( 인공지능 기초 #3 )

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

2020/09/13 - [Study/인공지능] - 퍼셉트론, 뉴런 네트워크의 모방 ( 인공지능 기초 #1 )

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