활성화 함수란?
말보단 식으로 보여주겠다. 아래식은 퍼셉트론의 동작방식을 설명한 것이다.
$$ y=\left\{\begin{array}{l}0\left(b+w_{1}x_{1}+w_{2}x_{2}\leq0\right)\\ 1\left(b+w_{1}x_{1}+w_{2}x_{2}>0\right)\end{array}\right. $$
간단하다. 여기서 아래처럼 치환하면 이런 식으로 표현할 수 있다.
$$ y=h(b+w_{1}x_{1}+w_{2}x_{2}) $$
$$ h(x)=\left\{\begin{array}{l}0(x\leq0)\\ 1(x>0)\end{array}\right. $$
위 식을 말로 정리하면 입력신호의 총합이 h(x)로 들어왔을 때
0이 넘으면 1을 반환하고
그렇지 않으면 0을 반환한다.
여기서 h(x)가 활성화 함수다.
참 쉽죠잉~
위 식은 step function활성화 함수를 거친 거라고 생각하면 된다.
즉, 퍼셉트론은 활성화함수로 step function을 이용한다.
활성화 함수의 종류
종류는 상당히 많지만 우리가 여기서 구현해 보고 다룰 건 간단하게
- step function (계단 함수)
- sigmoid function (시그모이드 함수)
딱 2개다.
step function - 계단 함수
상당히 기본적인 활성화 함수이다.
0을 넘으면 1을 출력하고
그 외의 경우 0을 출력하는 함수이다.
def step_fuction(x):
y= x > 0
return y.astype(int)
x = np.arange(-5, 5, 0.1)
y = step_fuction(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.show()
잘 구현된 걸 볼 수 있다.
생긴 게 계단처럼 생겨서 계단 함수라 불린다.
sigmoid function - 시그모이드 함수
$$ h(x) = \frac{1}{1+e^{-x}} $$
시그모이드를 나타내는 식은 위의 식이다.
def sigmoid_function(x):
return 1 / (1 + np.exp(-x))
x = np.arange(-5, 5, 0.1)
y = sigmoid_function(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.show()
아주 매끄럽다.
선형함수 및 비선형함수
선형함수가 뭐고 비선형함수가 뭐고 싶겠지만 필자가 위에서 다룬 모든 활성화함수는 비선형 함수이다.
우리가 앞으로 배울 신경망에서는 활성화함수를 사용할 때 무조건 비선형함수를 사용해야 한다.
왜 그럴까?
선형함수는 치명적인 단점이 존재하는데 그것은 층을 아무리 깊게 해도 단일 퍼셉트론이랑 차이가 없기 때문이다.
간단한 예시를 들어보자
$$ h(x) = bx $$
위와 같은 활성화함수를 사용해서 3층정도로 쌓은 네트워크를 보면 아래처럼 나타낼 수 있다.
$$ y(x) = h(h(h(x))) $$
위 식을 풀어쓰면 아래와 같다.
$$ y(x) = b^3x = ax $$
결국 똑같은 식이기 때문에 층을 쌓은 이점이 존재하지 않는다.
그래서 활성화함수는 비선형함수를 사용해야 한다라고 꿀팁정도로 알아두면 좋다.