본문 바로가기

Programming/[Data Science]

[ML] 인공신경망 비선형 활성화함수 (Activation Function)

반응형

1.활성화 함수의 특징 - 비선형 함수(Nonlinear function)

비선형 활성화 함수는 입력을 받아 수학적 변환을 수행하고 출력을 생성하는 함수입니다. (시그모이드, 소프트맥스)
인공 신경망의 능력을 높이기 위해 은닉층을 계속 추가해 줘야하는데 선형 함수의 경우 단순하게 가중치의 곱의 형태가 되게 때문에 1회 추가한 것과 차이를 줄 수 없습니다. 따라서 모든 은닉층의 활성화함수로 선형함수를 사용하지 않습니다.
예를 들어 활성화 함수 f(x) = Wx라고 가정할 경우 f(f(f(x)))의 경우 f(x) = W^3x입니다. 이는 W^3 = k라고 했을 때 y(x) = kx로 1회 추가한 것과 차이가 없습니다.

2. 시그모이드 함수(Sigmoid function)와 기울기 소실

sigmoid

위 인공신경망은 순전파와 역전파를 통해 가중치와 편향을 업데이트하게 됩니다. 시그모이드 함수는 미분을 해서 기울기를 구할 때 발생합니다.

import matplotlib.pyplot as plt 
import numpy as np

# 시그모이드 함수 그래프를 그리는 코드

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.plot([0,0],[1.0,0.0], ':') # 가운데 점선 추가  
plt.title('Sigmoid Function')  
plt.show()

img

  • 위 그래프는 시그모이드 함수의 그래프를 보여줍니다.
  • 함수의 출력값이 0 또는 1에 가까워지면, 그래프의 기울기가 완만해지는 모습을 볼 수 있습니다.
  • 기울기가 완만해지는 구간을 주황색, 그렇지 않은 구간은 초록색으로 나타납니다.
  • 주황색 부분은 기울기를 계산하면 0에 가까운 아주 작은 값이 나오게 됩니다. 그런데 역전파 과정에서 0에 가까운 아주 작은 기울기가 곱해지게 되면, 앞단에는 기울기가 잘 전달되지 않게 됩니다. 이러한 현상을 기울기 소실(Vanishing Gradient) 문제라고 합니다.

시그모이드 함수의 또 다른 문제점은 원점 중심이 아니라는 점입니다. 따라서 평균이 0이 아닌 0.5이며, 시그모이드 함수는 항상 양수를 출력하기 때문에 출력의 가중치 합이 입력의 가중치 합보다 커질 가능성이 높습니다. 이것을 편향 이동(bias shift) 이라고 하며, 이러한 이유로 각 레이어를 지날 때마다 분산이 계속 커져 가장 높은 레이어에서는 활성화 함수의 출력이 0이나 1로 수렴하게 되어 기울기 소실 문제가 일어날 수 있습니다.

dnn

위의 그림은 은닉층이 깊은 신경망에서 기울기 소실 문제로 인해 출력층과 가까운 은닉층에서는 기울기가 잘 전파되지만, 앞단으로 갈수록 기울기가 제대로 전파되지 않는 모습을 보여줍니다. 결론적으로 시그모이드 함수를 은닉층에서 사용하는 것은 지양됩니다.

3. 하이퍼볼릭탄젠트 함수(Hyperbolic tangent function)

하이퍼볼릭탄젠트 함수(tanh)는 입력값을 -1과 1사이의 값으로 변환합니다.

import matplotlib.pyplot as plt  
import numpy as np

x = np.arange(-5.0, 5.0, 0.1) # -5.0부터 5.0까지 0.1 간격 생성  
y = np.tanh(x)

plt.plot(x, y)  
plt.plot([0,0],[1.0,-1.0], ':')  
plt.axhline(y=0, color='orange', linestyle='--')  
plt.title('Tanh Function')  
plt.show()

tanh

  • 하이퍼볼릭탄젠트 함수도 -1과 1에 가까운 출력값을 출력할 때, 시그모이드 함수와 같은 문제가 발생합니다.
  • 시그모이드 함수와 달리 0을 평균으로 하기 때문에 시그모이드 함수와 비교하면 반환값의 변화폭이 더 큽니다.
  • 시그모이드 함수보다는 기울기 소실이 적어 은닉층에서 시그모이드 함수보다는 많이 사용됩니다.
  • 입력의 절대값이 클 경우 -1이나 1로 수렴하게 되는데 역시 기울기 소실 문제가 일어날 수 있습니다.

4. 렐루 함수(ReLU)

인공 신경망에서 최고의 인기를 얻고 있는 함수로, 수식은 f(x) = max(0, x)로 아주 간단합니다.

import matplotlib.pyplot as plt  
import numpy as np

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.plot([0,0],[5.0,0.0], ':')  
plt.title('Relu Function')  
plt.show()

ReLU

  • 렐루 함수는 음수를 입력하면 0을 출력하고, 양수를 입력하면 입력값을 그대로 반환합니다.
  • 특정 양수값에 수렴하지 않으므로 깊은 신경망에서 시그모이드 함수보다 훨씬 더 잘 작동합니다.
  • 시그모이드 함수와 tanh 함수와 같이 어떤 연산이 필요한 것이 아니라 단순 임계값이므로 연산 속도도 빠릅니다.
  • 하지만 입력값이 음수면 기울기도 0이 되고 이 뉴런은 다시 회생하는 것이 매우 어렵습니다. 이런 문제를 죽은 렐루(dying ReLU)라고 합니다.

5. 리키 렐루(Leaky ReLU)

죽은 렐루를 보완하기 위한 ReLU의 변형 함수로 입력값이 음수일 경우 0이 아니라 0.001과 같은 매우 작은 수를 반환하도록 돼있습니다.
수식은 f(x) = max(ax, x)로 아주 간단합니다. a는 하이퍼파라미터로 Leaky("새는") 정도를 결정하며 일반적으로 0.01의 값을 가집니다.

import matplotlib.pyplot as plt  
import numpy as np

a = 0.1  
def leaky_relu(x):  
return np.maximum(a*x, x)

x = np.arange(-5.0, 5.0, 0.1)  
y = leaky_relu(x)

plt.plot(x, y)  
plt.plot([0,0],[5.0,0.0], ':')  
plt.title('Leaky ReLU Function')  
plt.show()

leaky ReLU

위 그래프는 새는 모습을 잘 보이게 하기 위해 a를 0.1로 설정했습니다. 위와 같이 입력값이 음수라도 기울기가 0이 되지 않으면 ReLU는 죽지 않습니다.

6. 소프트맥스 함수(Softamx function)

은닉층에서 ReLU(또는 ReLU 변형) 함수들을 사용하는 것이 일반적이지만 그렇다고 해서 앞서 배운 시그모이드 함수나 소프트맥스 함수가 아예 사용되지 않는 것은 아님.
분류 문제를 로지스틱 회귀와 소프트맥스 회귀를 출력층에 적용하여 사용합니다.

import matplotlib.pyplot as plt  
import numpy as np

x = np.arange(-5.0, 5.0, 0.1) # -5.0부터 5.0까지 0.1 간격 생성  
y = np.exp(x) / np.sum(np.exp(x))

plt.plot(x, y)  
plt.title('Softmax Function')  
plt.show()

softmax

  • 소프트맥스 함수는 시그모이드 함수처럼 출력층의 뉴런에서 주로 사용됩니다.
  • 시그모이드는 이진 분류, 소프트맥스는 다중 클래스 분류 문제에 주로 사용됩니다.

7. 출력층의 활성화 함수와 오차 함수의 관계

은닉층의 활성화 함수로는 ReLU 또는 Leaky ReLU와 같은 ReLU의 변형을 사용하라고 정리해봤습니다. 그렇다면 출력층은 어떨까요? 다음과 같이 정리할 수 있습니다.

문제 활성화 함수 비용 함수
이진 분류 시그모이드 nn.BCELoss()
다중 클래스 분류 소프트맥스 nn.CrossEntropyLoss()
회귀 없음 MSE

출처 : Pytorch로 시작하는 딥 러닝 입문

Pytorch

반응형