[DL] 활성함수(Activation Function)

JINJU·2021년 11월 23일
0
post-custom-banner

활성화 함수

입력 신호의 총합을 출력 신호로 변환하는 함수
즉, 이름 그대로 활성화 함수는 입력 신호의 총합이 활성화를 일으키는지를 정하는 역할을 한다.

sigmoid 함수

h(x)=11+exh(x) = \frac{1}{1+e^{-x}}

위 식은 sigmoid를 식으로 나타낸 식이다.

h(x)={0if x01if x > 0h(x) = \begin{cases} 0 & \text{if x} \le 0 \\ 1 & \text{if x > 0}\end{cases}

위와 같이 x가 0일때 0, x가 0보다 클 때 1로 반환되는 함수이다.

계단함수 그래프 그려보기

책에서 나와있는 sigmoid 함수를 numpy와 matplot을 사용하여 그린 코드는 다음과 같다

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()

여기서 arange(-5.0, 5.0, 0.1)은 -5.0에서 5.0까지 0.1씩 x 좌표값의 배열을 만드는 것을 의미한다. 따라서, [-5.0, -4.9, ..., 4.9] 의 배열이 만들어진다.

step_function을 통해서 x의 값들이 계산 후에 다시 배열로 만들어 돌려준다.
결과는 다음과 같다.

결과

sigmoid 함수 구현

import numpy as np

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

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

결과

[0.26894142 0.73105858 0.88079708]

여기서 계산이 잘 된 이유는 Numpy의 'broadcast'때문!
numpy와 scalar의 계산을 할 수 있었던 것은 numpy 배열의 원소 각각이 스칼라값의 연산으로 바꿔 수행했다.

예를들면,

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


[2. 3. 4.]
[1.         0.5        0.33333333]

위에서 numpy 배열로 되어 있는 float 각 원소들이 scalar값인 1.0과 +와 /로 각각 연산되어 numpy 배열의 형태로 계산후 출력이 이루어졌다.
이와 같은 것을 브로드캐스트 라고 한다!

따라서 sigmoid의

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

에서도 넘파이 배열의 각 원소에 연산을 수행한 결과이다.

sigmoid 함수 그래프 그리기

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()

결과

post-custom-banner

0개의 댓글