본문 바로가기

ML & AI Theory

다층 신경망의 활성화 함수 : 시그모이드, 소프트맥스, 하이퍼볼릭탄젠트, 렐루함수

반응형

지금까지 다층 피드포워드 신경망을 쉽게 이해하기 위해 시그모이드 활성화 함수에 대해 설명했습니다. 다층 퍼셉트론을 구현할 때 출력층과 은닉층에 이 함수를 사용했습니다.

 

일반적으로 다른 문헌에서 부르는 것처럼 이 활성화 함수를 시그모이드 함수라고 합니다. 좀 더 정확한 정의는 로지스틱 함수입니다. 

 

기술적으로는 미분 가능하다면 어떤 함수라도 다층 신경망의 활성화 함수로 사용할 수 있습니다. 실제로는 은닉층이나 출력층에 선형 활성화 함수를 사용하는 것이 그리 유용하지 않습니다. 복잡한 문제를 해결하기 위해서는 일반적인 인공 신경망에 비선형성이 필요하기 때문입니다. 선형 함수를 합치면 결국 하나의 선형 함수가 됩니다. 

 

로지스틱 활성화 함수는 큰 음수 입력이 들어오면 문제가 됩니다. 이 경우 시그모이드 함수의 출력이 0에 가까워지기 때문입니다. 시그모이드 함수가 0에 가까운 출력을 내면 신경망이 매우 느리게 학습합니다. 훈련 과정에서 지역 최솟값에 갇힐 가능성이 높습니다. 이런 이유로 은닉층에 하이퍼볼릭 탄젠트 함수를 더 선호합니다.

 


1. 로지스틱 함수 요약 (시그모이드 함수)

 

로지스틱 회귀 : Logistic Regression, 시그모이드(sigmoid)를 이용한 분류 회귀

로지스틱 회귀는 선형 회귀 방식을 분류에 적용한 알고리즘입니다. 즉, 로지스틱 회귀는 분류에 사용됩니다. 로지스틱 회귀 역시 선형 회귀 계열입니다. 회귀가 선형인가 비선형인가는 독립변

nicola-ml.tistory.com

 


2.소프트맥스 함수를 사용하여 다중 클래스 확률 예측

argmax함수를 사용하여 클래스 레이블을 구하는 방법을 보았습니다. 사실 소프트맥스 함수는 간접적인 argmax함수입니다. 하나의 클래스 인덱스를 찾는 대신 각 클래스의 확률을 반환하므로 다중 클래스 환경(다중 로지스틱 회귀)에서 의미 있는 클래스 확률을 계산할 수 있습니다.

 

def softmax(z):
    return np.exp(z)/np.sum(np.exp(z))

 

이렇듯 소프트맥스는 신경망의 출력층에서 사용하는 활성화 함수로 분류 문제에 쓰이는 함수입니다.  위의 수식은 소프트맥스를 잘 표현하고 있지만 컴퓨터로 계산할 때는 오버플로 문제가 발생할 수 있습니다.  소프트맥스 지수 함수를 계산할 때 어떤수를 더하거나 빼도 결과는 바뀌지 않습니다. 일반적으로 신호 중 최댓값이 나오는 방식입니다.

 


3. 하이퍼볼릭 탄젠트로 출력 범위 넓히기

인공 신경망의 은닉층에 많이 사용하는 또 다른 시그모이드 함수는 하이퍼볼릭 탄젠트(보통 tanh)입니다. 이 함수는 스케일이 조정된 로지스틱 함수라고 생각할 수 있습니다. 

 

로지스틱 함수에 비해 하이퍼볼릭 탄젠트 함수의 장점은 출력 범위를 (-1, 1)사이로 넓혀서 역전파 알고리즘의 수렴을 향상할 수 있는 것입니다.

반면 로지스틱 함수는 (0,1)범위의 출력 신호를 반환합니다. 로지스틱 함수와 하이퍼볼릭 탄젠트를 비교하기 위해 두 시그모이드 함수를 그래프로 그려 보겠습니다.

 

import matplotlib.pyplot as plt

def tanh(z):
    e_p = np.exp(z)
    e_m = np.exp(-z)
    return (e_p - e_m) / (e_p + e_m)

def logistic(z):
    return 1.0 / (1.0 + np.exp(-z))

z = np.arange(-5, 5, 0.005)
log_act = logistic(z)
tanh_act = tanh(z)

plt.ylim([-1.5, 1.5])
plt.xlabel('net input $z$')
plt.ylabel('activation $\phi(z)$')
plt.axhline(1, color='black', linestyle=':')
plt.axhline(0.5, color='black', linestyle=':')
plt.axhline(0, color='black', linestyle=':')
plt.axhline(-0.5, color='black', linestyle=':')
plt.axhline(-1, color='black', linestyle=':')

plt.plot(z, tanh_act,
         linewidth=3, linestyle='--',
         label='tanh')

plt.plot(z, log_act,
         linewidth=3,
         label='logistic')
plt.legend(loc='lower right')
plt.tight_layout()
plt.show()

 


4. 렐루 활성화 함수

렐루(ReLU)는 심층 신경망에 자주 사용되는 또 다른 활성화 함수입니다. 렐루를 알아보기 전에 잠시 하이퍼볼릭 탄젠트와 로지스틱 활성화 함수의 그래디언트 소실 문제를 살펴보겠습니다.

 

하이퍼볼릭 탄젠트 활성화 함수는 모든 값은 -1에서 1로 수렴을 하기 때문에 입력값이 크면 클수록 출력 값은 작아지게 됩니다. 결국 그래디언트가 0에 아주 가까워지기 때문에 훈련 과정 동안 가중치가 매우 느리게 학습됩니다. 렐루 활성화 함수는 이런 문제를 해결합니다. 

 

렐루도 신경망이 복잡한 함수를 학습하기 좋은 비선형 함수입니다. 입력 값이 양수면 입력에 대한 렐루의 함수는 항상 1입니다. 이것이 그래디언트 소실 문제를 해결해 주므로 심층 신경망에 적합합니다. 

반응형