이번에는 ANN의 개별 node에 적용되는 활성화함수(AF, Activation Function)에 대해서 알아보도록 하겠습니다. 기존에 퍼셉트론에서 알아본 node에 적용된 임계치를 통해서 넘을때 1, 못넘으면 0... 이것도 활성화함수(AF)의 종류중에 하나입니다.
- 인공신경망(ANN)의 개요 및 퍼셉트론과의 차이점
- 인공신경망(ANN)의 활성화함수(AF, Activation Function)
- 인공신경망(ANN)의 출력층 설계 및 순전파(Forward Propagation)
- 인공신경망(ANN)의 손실함수(Loss) 구현
- 수치미분 및 편미분, 그리고 GDA
- 인공신경망(ANN)의 역전파(Back Propagation) 개념
- 인공신경망(ANN)의 역전파(Back Propagation) 구현
활성화함수는 기본적으로 아래과 같이 그림에서 node에 input이 존재하고 그에 대한 sum이 주어질때, 2단계로 0인지 1인지 즉 활성화가 되는지 판단해주는 역할을 해주는 함수입니다.
활성화함수에는 여러가지가 존재하는데 각 함수에 대해서 알아보면서 코드를 통해서 구현해 보도록 하겠습니다.
1. Step Function
말그대로 계단함수로써 sum의 결과로 판단을 수행하게 됩니다. 이는 퍼셉트론에서 알아본 임계치에 대한 활성화함수와 동일합니다. 바로 이것이 인공신경망(ANN)과의 차이입니다. 추후에 알아보겠지만 학습을 위해서는 기울기를 도출해야 하는데, 위해서 미분을 사용합니다. 하지만 Step Function의 경우는 미분에 대한 값이 2가지만 존재하기 때문에 정밀한 학습이 이루어 질 수 가 없습니다.
인공신경망(ANN)에서는 학습을 위해서 Step Function을 사용하지 않습니다. 바로 이것이 신경망으로 가는 첫 단추가 됩니다.
import numpy as np
import matplotlib.pyplot as plt
def stepAF(x):
y = x > 0
return y.astype(np.int)
x = np.arange(-5.0, 5.0, 0.1)
y = stepAF(x)
plt.ylim(-0.1, 1.1)
plt.xlim(-5.1, 5.1)
plt.plot(x, y)
plt.show()
Step Function은 이전 그림처럼 summation 결과에 적용되는 AF이며, sum의 결과가 0보다 크면 1, 0보다 작거나 같으면 0을 output으로 제공하는 함수입니다. 해당 코드를 잠시 설명하자면 입력은 배치로 들어올수도 있다는 가정하에 numpy의 array로 받습니다. 그 후에 AF에 통과시킨 결과를 그림으로 그려보면, 계단모양의 형태를 확인 할 수 있습니다.
2. Sigmoid Function
해당 함수는 이전에 제 글에서도 보셨을 수 있겠지만, Logistic Regression에서 Odd를 통해서 도출되는 함수입니다. 이 함수를 통해서 output과 target의 일치할 확률을 계산이 가능합니다. Sigmoid의 함수식은 Y = 1 / (1 + (exp(-x))) 이며, 그 모양은 S형태를 띕니다. 일단 코드로 확인해 보겠습니다.
def sigmoidAF(x):
return 1 / (1 + np.exp(-x))
x = np.arange(-5.0, 5.0, 0.1)
y = sigmoidAF(x)
plt.ylim(-0.1, 1.1)
plt.xlim(-5.1, 5.1)
plt.plot(x, y)
plt.show()
Sigmoid Function은 그림으로 보시다시피, Step Function과 확연하게 차이가 있습니다. 0, 1만 리턴하는 Step Function과 달리 실수값이 리턴된다는 것이 가장 큰 차이점이며, 0 ~ 1사이의 값을 리턴한다는 것은 공통점이라고 볼 수 있습니다. Sigmoid를 포함해서 아래 계속 확인해 볼 AF들은 비선형 함수입니다. 그 말은 직선 1개로 그릴 수 없다는 말인데... 퍼셉트론에서 SLP / MLP에서 한번 들으신 기억이 있으시죠??
ANN으로 들어가는 첫 단추라고 표현한 데는 위의 내용과 관련이 있습니다. 인공신경망(ANN)에서는 선형함수의 사용이 불가능한데 이유는 hidden layer의 층이 깊어질 수가 없기 때문입니다. 예를 들어, 아래와 같이 node를 계속 통과 한다고 가정할때... AF가 선형일 경우
Y = cx라고 한다고 했을때, Y = c ( c ( c (x) ) )가 됩니다. 이는 Y = c^3 (x)와 차이가 없게 되고, 결국 c^3의 선형함수 단일 node를 통과한 결과와 같습니다. 이 때문에 층이 깊어지지 않는 것 입니다. 따라서 현재까지도 인공신경망(ANN)의 AF로 sigmoid가 사용되어 집니다.
Step Function과 Sigmoid Function에 대해서 생김새를 바로 비교해보면 아래와 같습니다.
x = np.arange(-5.0, 5.0, 0.1)
y1 = stepAF(x)
y2 = sigmoidAF(x)
plt.ylim(-0.1, 1.1)
plt.xlim(-5.1, 5.1)
plt.plot(x, y1, 'r-')
plt.plot(x, y2, 'b--')
plt.show()
3. ReLU (Rectified Linear Unit) Function
이 AF는 상당히 많이 사용되는 함수입니다. 특징은 0이하는 그냥 0이 리턴되고, 0을 초과하는 값이 input으로 들어올 경우 input을 그대로 output으로 리틴합니다. 보통 hidden layer에서 AF로 사용하는 함수입니다. 통상 hidden layer에서는 ReLU를 적용하고, 마지막에 output layer에서만 sigmoid를 적용하면 이전의 학습결과보다 더 정확도(accuracy)가 올라간다고 합니다.
그럼 세부적인 모양을 코드를 통해서 확인해 보겠습니다. 함수는 max(0, x)로 하면 됩니다. 이렇게 하면 x가 0보다 작으면 0, 0보다 크면 x가 리턴되니까요.
def ReLUAF(x):
return np.maximum(0, x)
x = np.arange(-5.0, 5.0, 0.1)
y = ReLUAF(x)
plt.ylim(-0.1, 5.1)
plt.xlim(-5.1, 5.1)
plt.plot(x, y)
plt.show()
그 이후에, ReLU를 개선한 Leaky ReLU라는 것도 등장했는데... 점점 복잡해지는 ANN에서는 학습이 안되는 현상이 발생하는데 이 부분을 해결하기 위함입니다. 이 내용은 나중에 기회가 되면 다루어 보겠습니다. 그래도 생긴거만 확인해 보면... 함수는 max(0.1x, x) 입니다.
def leakyReLUAF(x):
return np.maximum(0.1*x, x)
x = np.arange(-5.0, 5.0, 0.1)
y = leakyReLUAF(x)
plt.ylim(-0.6, 5.1)
plt.xlim(-5.1, 5.1)
plt.plot(x, y)
plt.show()
0보다 작은 input에 대해서도 기울기가 존재하는 차이점이 있습니다.
4. tanh Function
마지막 AF입니다. 이 함수는 sigmoid의 대체로 사용될 수 있는 활성화함수입니다. 아래 그림을 봐도 알 수 있지만 모양은 sigmoid와 유사합니다. 한가지 차이점은 sigmoid는 output이 0 ~ 1사이이고, tanh는 output이 -1 ~ 1입니다.
def tanhAF(x):
return np.tanh(x)
x = np.arange(-5.0, 5.0, 0.1)
y = tanhAF(x)
plt.ylim(-1.1, 1.1)
plt.xlim(-5.1, 5.1)
plt.plot(x, y)
plt.show()
마치며...
지금까지 인공신경망(ANN)의 활성화 함수의 종류 및 특징에 대해서 알아보았습니다. 다음에는 출력층의 설계 및 순전파에 대해서 알아보겠습니다.
- Ayotera Lab -
댓글