상세 컨텐츠

본문 제목

2.활성화 함수(Activation Function)

본문

활성화 함수란?

딥러닝 네트워크에서는 노드에 들어오는 값들에 대해 곧바로 다음 레이어로 전달하지 않고 주로 비선형 함수를 통과시킨 후 전달한다. 이때 사용하는 함수를 활성화 함수(Activation Function)  이라 부른다.

활성화 함수로는 비선형 함수를 사용해야 한다. 선형함수인 h(x)=cx를 활성화함수로 사용한 3층 네트워크를 떠올려 보자. 이를 식으로 나타내면 y(x)=h(h(h(x)))가 된다. 이는 실은 y(x)=ax와 똑같은 식이다. a=c3이라고만 하면 끝. 즉, 은닉층이 없는 네트워크로 표현할 수 있다. 뉴럴네트워크에서 층을 쌓는 혜택을 얻고 싶다면 활성화함수로는 반드시 비선형 함수를 사용해야 한다.

 

시그모이드 함수 : σ(x)=1/1+e^−x

sigmoid에 대해 특징을 살펴보자.

  • 우선 함수값이 0에서 1 사이로 제한된다.
  • 매우 큰 값을 가지면 함수값은 1로 발산하며 값이 매우 작다면 0으로 수렴한다.

신경망(Neural Network)은 기울기(Gradient)를 이용해 최적화된 값을 찾아 가는데, 계층(Layer)이 많아지면 점점 값이 0에 수렴되는 문제가 발생해 성능이 떨어지게 됩니다.

이러한 이유로 은닉층(Hidden Layer)에서는 활성화 함수(Activation Function)로 사용하지 않으며, 주로 출력층(Output Layer)에서만 사용됩니다.

이러한 특징을 가지는 sigmoid는 신경망 초기에는 많이 사용되었지만, 최근에는 아래의 단점들 때문에 사용하지 않는다.

sigmoid의 단점들

  • Gradient Vanishing(기울기 소실) 현상이 발생한다. 미분함수에 대해 에서 최대값  을 가지고, input값이 일정이상 올라가면 미분값이 거의 0에 수렴하게된다. 이는 값이 커질 수록 Gradient Backpropagation시 미분값이 소실될 가능성이 크다.
  • 함수값 중심이 0이 아니다. 함수값 중심이 0이 아니라 학습이 느려질 수 있다.
  • exp 함수 사용시 비용이 크다.

1. 기울기 소실의 의미(Gradient Vanishing)

딥러닝 분야에서 Layer를 많이 쌓을수록 데이터 표현력이 증가하기 때문에 학습이 잘 될 것 같지만, 실제로는 Layer가 많아질수록 학습이 잘 되지 않습니다. 바로 기울기 소실(Vanishing Gradient) 현상때문입니다. 기울기 소실이란 역전파(Backpropagation) 과정에서 출력층에서 멀어질수록 Gradient 값이 매우 작아지는 현상을 말합니다(그림 1 참고). 그렇다면 왜 이런 기울기 소실 문제가 발생할까요? 이어지는 섹션에서 자세히 알아봅니다.

2. tanh 함수, (Hyperbolic tangent function)

하이퍼볼릭탄젠트란 쌍곡선 함수중 하나이다.

 

tanh 함수의 정의

tanh(x)=(e^x-e^-x)/(e^x+e^-x)

tanh(x)=2σ(2x)−1

tanh(x)=e^x−e^−x/e^x+e^−x

tanh′(x)=1−tanh2(x)

  • tanh 함수는 함수의 중심값을 0으로 옮겨 sigmoid의 최적화 과정이 느려지는 문제를 해결했다.
  • 하지만 미분함수에 대해 일정값 이상 커질시 미분값이 소실되는 gradient vanishing 문제는 여전히 남아있다.

3. ReLU 함수 (Rectified Linear Unit)

ReLu함수는 최근 가장 많이 사용되는 활성화 함수이다. 함수는 아래와 같이 정의된다.

f(x)=max(0,x)

ReLU함수의 특징을 살펴보자.

  • x>0 이면 기울기가 1인 직선이고, x<0이면 함수값이 0이된다.
  • sigmoid, tanh 함수와 비교시 학습이 훨씬 빨라진다.
  • 연산 비용이 크지않고, 구현이 매우 간단하다.
  • 시그모이드 함수(Sigmoid Function) 나 하이퍼볼릭 탄젠트 함수(Hyperbolic Tangent Function) 는 출력값이 제한되어 기울기 소실(Vanishing Gradient) 이 발생하지만, ReLU 함수(Rectified Linear Unit Function)는 선형 함수에 대입하므로 입력값이 양수라면 출력값이 제한되지 않아 기울기 소실이 발생하지 않습니다.
  • x<0인 값들에 대해서는 기울기가 0이기 때문에 뉴런이 죽을 수 있는 단점이 존재한다.leakly ReLU는 ReLU의 뉴런이 죽는(“Dying ReLu”)현상을 해결하기위해 나온 함수이다. 함수도 매우 간단한 형태로 다음과 같다.위의 식에서 0.01대신 다른 매우 작은 값 사용 가능하다.
    • Leakly ReLU는 음수의 값에 대해 미분값이 0되지 않는다는 점을 제외하면 ReLU와 같은 특성을 가진다.
  • f(x)=max(0.01x,x)
  • 4. Leakly ReLU

5. PReLU

f(x)=max(αx,x)

Leakly ReLU와 거의 유사하지만 새로운 파라미터 α 를 추가하여 x<0에서 기울기를 학습할 수 있게 하였다.

 

6. Exponential Linear Unit(ELU)

ELU는 비교적 가장 최근에 나온 함수이다.

f(x)=x i f x>0

f(x)=α(e^x−1) i f x≤0

ELU 의 특징은 다음과 같다.

  • ReLU의 모든 장점을 포함한다.
  • “Dying ReLU” 문제를 해결했다.
  • 출력값이 거의 zero-centered에 가깝다
  • 일반적인 ReLU와 달리 exp함수를 계산하는 비용이 발생한다.

7. Maxout 함수

Maxout 함수는 다음과 같다.

f(x)=max(wT1x+b1,wT2x+b2)

이 함수는 ReLU가 가지는 모든 장점을 가졌으며, dying ReLU문제 또한 해결한다. 하지만 계산량이 복잡하다는 단점이 있다.

결론

위와 같이 여러 활성화 함수가 있는데, 어떤 함수를 사용해야 할지에 대한 결론은 다음고 같다.

  • 우선 가장 많이 사용되는 함수는 ReLU이다. 간단하고 사용이 쉽기 때문에 우선적으로 ReLU를 사용한다.
  • ReLU를 사용한 이후 Leakly ReLU등 ReLU계열의 다른 함수도 사용 해본다.
            <Relu함수가 단점이 있는데도 불구하고 많이 사용되는 이유는????>

-relu은 연산 비용이 크지 않습니다.

-임계치보다 작으면 0을 크면 그 수를 그대로 반환하기 때문이죠.

-leaky relu는 임계치보다 작으면 0.01을 곱해야 하기 때문에 연산 비용이 상대적으로 큽니다.

-연산 비용이 크다는 것은 속도가 그만큼 느리다는 것을 의미합니다.

-relu가 속도면에서 leaky relu보다 좋습니다.

-때문에 실제로 relu를 많이 사용하는 것입니다.

  • sigmoid의 경우에는 사용하지 않도록 한다.
  • tanh의 경우도 큰 성능은 나오지 않는다.

헤비사이드,시그모이드, 렐루 함수의 파이썬 소스코드

import matplotlib.pylab as plt
import numpy as np
x= np.array([-1,1,2])

#헤비사이드 함수
def step_function(x):
    return np.array(x > 0, dtype=np.int)

X = np.arange(-5,5,0.1)
Y = step_function(X)
plt.plot(X,Y)
plt.ylim(-0.1,1.1)
plt.show()

#시그모이드 함수
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

X = np.arange(-5,5,0.1)
Y = sigmoid(X)
plt.plot(X,Y)
plt.ylim(-0.1,1.1)
plt.show()

#렐루함수, 음수일때는 0 양수일때는 x그대로 내보낸다
def relu(x):
    return np.maximum(0, x)

X = np.arange(-5,5,0.1)
Y = relu(X)
plt.plot(X,Y)
plt.ylim(-0.1,1.1)
plt.show()

 

#하이퍼볼릭 탄젠트 
import matplotlib.pylab as plt
import numpy as np

def tanh(x):
  a = np.exp(x)
  b = np.exp(-x)

  y = (a-b)/(a+b)

  return y

x = np.arange(-5,5,0.1)
y = tanh(x)

fig=plt.figure(figsize=(10,7))
fig.set_facecolor('white')

plt.plot(x,y)
plt.xlabel('x', fontsize=20)
plt.ylabel('y',fontsize=20)

plt.yticks([-1,0,1])
plt.axvline(0, color='k')
ax = plt.gca

plt.show()

'딥러닝 기초 이론 > 밑바닥부터 시작하는 딥러닝 이론' 카테고리의 다른 글

7.수치미분과 기울기  (0) 2023.01.22
6.엔트로피  (0) 2023.01.22
4.손실함수  (0) 2023.01.22
3.인공신경망  (0) 2023.01.22
1.퍼셉트론  (0) 2023.01.22

관련글 더보기