머신러닝&딥러닝/이론

[머신러닝&딥러닝] 비선형 활성화 함수(Activation Funtions)

거북이07 2024. 1. 19. 09:30

비선형 활성화 함수(Activation Funtions)

✨참고

https://wikidocs.net/60683

 

06-06 비선형 활성화 함수(Activation function)

비선형 활성화 함수(Activation function)는 입력을 받아 수학적 변환을 수행하고 출력을 생성하는 함수입니다. 앞서 배운 시그모이드 함수나 소프트맥스 함수는 대표적인…

wikidocs.net

 

비선형 활성화 함수(Activation function)는 입력을 받아 수학적 변환을 수행하고 출력을 생성하는 함수입니다. 비선형 활성화 함수는 신경망의 성능을 향상시키기 위해 사용되며 선형 함수는 입력값과 가중치를 곱한 결과를 그대로 출력하기 때문에 신경망에서 여러개의 활성화 함수를 사용한다면 최종 출력값은 입력값과 가중치의 선형 조합으로 표현되므로 입력 데이터의 비선형 관계를 표현할 수 있다. 그래서 신경망이 입력데이터의 비선형  관계를 잘 학습할 수 있도록 하기 위해 비선형 활성화 함수가 필요하다.


💻 비선형 활성화 함수 특징

활성화 함수의 특징은 선형 함수가 아닌 비선형 함수여야한다. 선형 함수랑 출력이 입력의 상수배만큼 변하는 함수를 선형함수라고 하는데 예를 들어 아래 함수가 있을 때 W와 b는 상수입니다.

 

이 식은 그래프를 그리면 직선이 그려집니다. 반대로 비선형 함수는 직선 1개로는 그릴 수  없는 함수를 말합니다.

인공 신경망의 늘력을 높이기 위해서는 은닉층을 계속해서 추가해야 합니다. 그런데 만약 활성화 함수로 선형 함수를 사용하게 되면 은닉층을 쌓을 수가 없습니다. 


💻 비선형 활성화 함수 종류

1️⃣ 시그모이드 함수(Sigmoid Function)

 

위의 그래프는 시그모이드 함수의 그래프입니다. 시그모이드 함수의 출력값이 0또는 1에 가까워지면 그래프의 기울기가 완만해지는 모습을 확인할 수 있습니다. 기울기가 완만해지는 구간을 주황색,  그렇지 않은 구간을 초록색으로 표시해보면

주황색 부분은 기울기를 계산하면 0에 가까운 값이 나오게 됩니다. 그런데 역전파 과정에서 0에 가까운 아주 작은 기울기가 곱해지게  되면 앞단에는 기울기가 잘 전달되지 않습니다. 이러한 현상을 기울기 소실(Vanishing Gradient)라고 합니다.

 

시그모이드 함수를 사용하는 은닉층의 개수가 다수가 될 경우에는 0에 가까운 기울기가 계속 곱해지면 앞단에는 거의 기울기를 전파받을 수 없게 된다. 다시 말해 매개변수 W가 업데이트 되지 않아 학습이 되지 않는다.

 

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

 

💻 예제

import numpy as np
import matplotlib.pyplot 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.plot([0, 0], [1.0, 0.0], ':') # [0,0] 사이에 ':'.. 을 넣으라는 뜻
plt.title('Sigmoid Function')
plt.show()

2️⃣ 하이퍼볼릭 탄젠트 함수(Hyperbolic tangent function)

하이퍼볼릭탄젠트 함수(tanh)는 입력값을 -1과 1사이의 값으로 변환합니다. 탄젠트 함수를 그래프로 그려보면 아래 같은 그래프가 나타난다.

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

하이퍼볼릭탄젠트 함수도 -1과 1에 가까운 출력값을 출력할 때, 시그모이드 함수와 같은 문제가 발생합니다. 그러나 하이퍼볼릭탄젠트 함수의 경우에는 시그모이드 함수와는 달리 0을 중심으로하며, 이 때문에 시그모이드 함수와 비교하면 반환값의 변화폭이 더 크다.  그래서 시그모이드 함수보다 기울기 소실 증상이 적은 편입니다.


2️⃣ 렐루 함수(ReLU)

인공 신경망에서 가장 인기있는 함수입니다.

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

 

렐루 함수는 음수를 입력하면 0을 출력하고, 양수를 입력하면 입력값을 그대로 반환합니다. 렐루 함수는 특정 양수값에 수렴하지 않으므로 기울기 소실 문제가 발생하지 않아 깊은 신경망에서 시그모이드 함수보다 훨씬 더 잘 동작합니다. 뿐만 아니라 렐루 함수는 시그모이느 함수와 하이퍼볼릭탄젠트 함수와 같이 어떤 연산이 필요한 것이 아니라 단순 임계값이므로 연산 속도도 빠릅니다.

 

하지만 렐루의 문제점도 있습니다. 입력값이 음수이면  기울기도 0이 되며 이 뉴런은 다시 회생하는것이 매우 어렵습니다.

그래서 죽은 렐루(dying ReLU)라고 합니다