입력 신호의 총합을 출력 신호로 변환하는 함수
즉, 이름 그대로 활성화 함수는 입력 신호의 총합이 활성화를 일으키는지를 정하는 역할을 한다.
위 식은 sigmoid를 식으로 나타낸 식이다.
위와 같이 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의 값들이 계산 후에 다시 배열로 만들어 돌려준다.
결과는 다음과 같다.
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))
에서도 넘파이 배열의 각 원소에 연산을 수행한 결과이다.
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()