Activation Function(활성화 함수)

Hyunsuki·2021년 8월 19일
1

ML/DL

목록 보기
2/2
post-thumbnail

Activation Fuction 공부해야만 하는거야🤨❔

Deep Learning 관련 공부를 하다보면 대부분 activation function는 relu, optimizer는 adam, loss(cost) fuction은 categorical_crossentropy(이진분류의 경우는 binary_crossentropy) 이런 식으로 가볍게 넘어가는 경우가 대부분이다.

물론 Deep Learning에서 자주 사용하는 활성화 함수는 이미 일부 정해져있기는 하나, '무조건 이러한 경우에는 활성화 함수는 이것을 쓰는게 맞아'와 같은 정답이 정해져있는 경우는 잘 없기에 굳이 공부해야하나 같은 생각이 들 수도 있다.

그렇지만 활성화 함수이 왜 쓰이는지각각의 활성함수 어떤 특징을 가지며, Graph의 모양이 어떤지 이해하고 알고 있다면 확실히 배제되는 활성화 함수가 생긴다.

이는 model train간 시간요소가 큰 Deep Learning 특성다양한 조합의 layer를 구성해볼 수 있는 시간을 확보할 수 있게 도와준다.

왜 활성화 함수에 대해 공부해야 하는지에 대한 얘기가 끝났으니, 이제 활성화 함수에 대해 파보도록 하자.

Activation Fuction의 기능💡

인공신경망사람의 신경구조를 모방하여 만들어졌다는 사실은 다들 알고 있을 것이다. 인공신경망의 가장 기본 개념은 단일 퍼셉트론에서 출발했다.


Single-layer Perceptron(단층 퍼셉트론) 포스팅에서도 설명했지만 퍼셉트론은 여러 개의 신호가 들어오면 이를 조합하여 다음으로 신호를 보낼지 말지를 결정한다(0 또는 1).

이것을 발전시킨 feed forward multiple layer neural network는 하나의 단일 뉴런에 여러 신호가 들어오면, 다음 뉴런에 보낼 신호의 강도를 결정하게 된다. 즉, 단일 퍼셉트론이 multi layer perceptron으로 발전해나가는 과정에서, 뉴런은 신호의 전달유무가 아닌 전달 강도를 정하게 되었다. 이때 전달하는 신호의 세기를 정하는 방법활성화 함수이다.

각각의 함수네트워크의 각 뉴런에 연결되어 있으며, 각 뉴런의 입력이 모델의 예측과 관련되어 있는지 여부에 따라 활성화된다. 이런 활성화를 통해 신경망은 입력값에서 필요한 정보를 학습한다.

활성화 함수는 훈련 과정에서 계산량이 많고, 역전파(backpropagation)에서도 사용해야 하므로 연산에 대한 효율성은 중요하다. 그렇다면 이런 활성화 함수의 종류에는 어떠한 것 들이 있는지 살펴보자.

Activation의 분류📑

Activation는 크게 Binary step functionLinear activation function, Non-linear activation function 이렇게 3개로 분류할 수 있다.

•Binary step function
Binary step function임계치를 기준으로 출력을 해주는 함수이다. 퍼셉트론(perceptron) 알고리즘에서 활성화 함수로 사용한다.

f(x)={1  for  x(x=>0)0  for  x,(x<0)f(x) = \begin{cases} 1\;for\;x &\text(x\stackrel{>}{=}0)\\ 0\;for\;x, &\text(x<0) \end{cases}

하지만 Binary step function다중 값 출력을 할 수 없어 다중 클래스 분류 문제에 사용할 수 없으며, Binary step function의 기울기가 0이기 때문에 역전파 과정에서 문제가 된다.

•Linear activation function

Linear activation function는 말 그대로 선형 활성화 함수이다.

f(x)=cx,  c  is  constantf(x)=cx, \;c\;is\;constant
입력값에 특정 상수 값을 곱한 값을 출력으로 가진다. 다중 출력이 가능하다는 장점이 있지만, 다음과 같은 두 개의 문제점이 있다.

  1. backpropagation(역전파) 사용이 불가능하다.

기본적으로 역전파는 활성함수를 미분하여 이를 이용해 손실값을 줄이기 위한 과정이다. 하지만 선형함수의 미분값은 상수이기에 입력값과 상관없는 결과를 얻는다. 그렇기 때문에 예측과 가중치에 대한 상호관계에 대한 정보를 얻을 수 없다.

  1. 은닉층을 무시하고, 얻을 수 있는 정보를 제한한다.

•Non-linear activation function

위의 두 종류의 활성화 함수의 단점 때문에 활성화 함수는 비선형 함수를 주로 사용한다.

최근 신경망 모델에서는 거의 대부분 비선형 함수를 사용한다. 입력과 출력간의 복잡한 관계를 만들어 입력에서 필요한 정보를 얻는데 이는 비정형적인 데이터에 특히 유용하다. (이미지, 영상, 음성 등의 고차원 데이터)

비선형 활성화 함수의 장점을 보면 다음과 같다.

  1. 입력과 관련있는 미분값을 얻으므로 역전파를 가능하게 하고, 다시 돌아가서 입력 뉴런의 어떤 가중치가 더 나은 예측을 제공할 수 있는지 이해할 수 있다.

  2. 출력이 여러 레이어를 통과하는 입력의 비선형 조합이 되므로 뉴런의 여러 레이어를 쌓을 수 있다. 모든 출력은 신경망에서 기능적 계산으로 나타낼 수 있기 때문에 심층 신경망을 통해 더 많은 핵심 정보를 얻을 수 있다.

이제 10가지 다른 비선형 신경망 활성화 함수와 그 특성을 알아보자.

10가지 비선형 신경망 활성화 함수

1. Sigmoid / Logistic 함수
이 함수는 임의의 실수 값을 입력으로 받아 0에서 1 사이의 값을 출력한다.

아래 그림과 같이 입력 값이 클수록(양수일수록) 출력 값이 1.0에 가까워지고 입력이 작을수록(음수일수록) 출력이 0.0에 가까워지는 함수이다.

수식으로는 다음과 같이 나타낼 수 있다.

f(x)=11+exf(x)=\dfrac{1}{1+e^{-x}}

Sigmoid / Logistic 함수는 확률을 출력으로 예측해야 하는 모델에 일반적으로 사용된다. 확률은 0과 1 사이에만 존재하므로 범위 때문이다.

👍🏻장점
• 미분 가능하고 부드러운 기울기를 제공한다.
• 출력값의 범위가 (0, 1)로 제한하기에 정규화 관점에서 exploding gradient 문제를 방지할 수 있다.

👎🏻단점
Vanishing gradient(경사소실) 문제를 갖는다.
Sigmoid / Logistic 함수의 출력은 0을 중심으로 대칭이 아니기에 모든 뉴런의 출력은 동일한 부호(모두 양수 또는 모두 음수의 형태)가 된다. 이것은 비용/효율면에서 좋지 못하다.

Vanishing gradient(경사소실) 문제에 대해 알아보기 위해 Sigmoid 함수의 도함수를 구하는 식을 구해보면 식은 다음과 같다.

f(x)=sigmoid(x)(1sigmoid(x))f'(x) = sigmoid(x)*(1-sigmoid(x))

우리는 위의 그래프에서 보는 바와 같이, 3보다 크거나 -3보다 작은 값의 경우 함수의 기울기가 매우 작음을 알 수 있다. 또한 입력이 아무리 커도 미분 값의 범위는 제한된다는 것도 알 수 있다. 층이 쌓일수록 gradient 값이 0에 수렴할 것이고, 학습의 효율이 매우 떨어지는 것을 직관적으로 알 수 있다.

2. Tanh 함수(Hyperbolic tangent)
Tanh 함수는 Sigmoid / Logistic 함수와 동일한 S자 모양을 갖고 있지만 출력 범위가 -1에서 1까지 차이가 있는 활성함수이다.

수식으로 다음과 같이 나타낼 수 있다.

f(x)=(exex)(ex+ex)f(x)=\dfrac{(e^{x}-e^{-x})}{(e^{x}+e^{-x})}

👍🏻장점
tanh 활성화 함수의 출력은 0 중심이다. 따라서 출력 값을 강한 음수, 중립 또는 강한 양수로 쉽게 매핑할 수 있다. 그렇기 때문에 데이터를 중앙에 배치하는데 도움이 되며, 다음 계층에 대한 학습이 훨씬 쉬워진다.

👎🏻단점
Sigmoid 활성화 함수와 유사한 Vanishing gradient(경사소실) 문제에 직면해 있다. 게다가 Sigmoid 함수에 비해 훨씬 더 가파르다.

이를 확인하기 위해 Tanh의 도함수를 구해보면 다음과 같다.
f(x)=g(x)=1=tanh2(x)f'(x) = g(x)=1=tanh^{2(x)}

💡 참고: Sigmoidtanh 모두 Vanishing gradient(경사소실) 문제에 직면하지만 tanh는 중심이 0이며 gradient가 특정 방향으로 이동하도록 제한되지 않는다.

3. ReLU 함수
ReLURectified Linear Unit의 약자이다.

선형 함수의 모양을 띄지만 ReLU는 미분 함수를 가지고 있으며 역전파를 허용하는 동시에 계산 효율을 높인다.

여기서 중요한 점은 ReLU 함수가 모든 뉴런을 활성화하지 않는다는 것이다. 선형 변환의 출력이 0보다 작은 경우에만 뉴런이 비활성화된다.

수식으로 다음과 같이 나타낼 수 있다.

f(x)=max(0,x)f(x)=max(0,x)

👍🏻장점
특정 수의 뉴런만 활성화되기 때문에 ReLU 함수는 sigmoid 및 tanh 함수와 비교할 때 훨씬 더 계산 효율적이다.
위에서도 말했지만 모양 자체는 선형같지만, 이 함수는 비선형 함수이다. 따라서 도함수를 가지며, backpropagtion(역전파)을 허용한다.
👎🏻단점
Dying ReLU 문제를 가지고 있다. ReLU 함수는 입력값이 0또는 음수일때, gradient값은 0이 된다. 즉 모든 음수 입력 값은 즉시 0이 되어 데이터를 적절하게 맞추거나 훈련하는 모델의 기능이 감소하게 되는 것이다. 이러한 이유로 역전파 과정에서 일부 뉴런의 가중치와 편향은 업데이트되지 않기 때문에 제대로 된 학습을 하지 못한다는 문제가 발생하게 된 것이다. 데이터의 축소는 ReLU를 효율적인 계산을 할 수 있게 해줬지만 동시에 이것이 ReLU의 단점이 되었다.

Dying ReLU 문제가 왜 발생하는지 알아보기 위해 ReLU 함수의 도함수를 구해보자.
f(x)  =  g(x)  =  1,  x>=  0  =  0,  x<0f'(x)\;=\;g(x)\;=\;1,\;x>=\;0\;=\;0,\;x<0

이 문제를 해결하기 위해 다양한 유사함수가 만들진다. 그 유사함수들은 아래에 소개하겠다.

4. Leaky ReLU 함수
Leaky는 '새는, 구멍이 난'이라는 뜻을 가지고 있다. ReLU에서 발생하는 Dying ReLU 문제를 해결하기 위해 만든 함수이다.


수식으로 다음과 같이 나타낼 수 있다.

f(x)=max(0.1x,x)f(x) = max(0.1x,x)

👍🏻장점
Dying ReLU 문제를 방지하며 ReLU보다 균형적인 값을 반환하고, 이로 인해 학습이 조금 더 빨라진다.

👎🏻단점
ReLU보다 항상 나은 성능을 내는 것은 아니다.

Leaky ReLU 함수의 도함수의 식은 아래와 같다.
f(x)  =  g(x)  =  1,  x>=  0  =  0.01,  x<0f'(x)\;=\;g(x)\;=\;1,\;x>=\;0\;=\;0.01,\;x<0

5. Parametric ReLU (PReLU) 함수
Leaky ReLU 함수와 거의 유사하지만 상수를 원하는 값으로 설정하며, 여기서 그 상수는 음수 값의 기울기 매개변수이다.

수식으로 보면 다음과 같다.
f(α,x)=max(αx,x)f(\alpha,x)=max({\alpha}x,x)

👍🏻장점
문제에 따라 유동적으로 설정할 수 있다. 기타 다른 장점은 Leaky ReLU의 장점과 같다.

👎🏻단점
문제에 따라 다른 상수값을 설정해줘야 한다. 나머지 단점은 Leaky ReLU와 단점과 같다.

5. ELU 함수
ELU 함수Exponential Linear Unit을 의미한다. 음수일 때 exp를 활용하여 표현한다.


수식으로는 다음과 같이 나타낼 수 있다.

f(α,x)={α(ex1),  x0x,                          x>0f(\alpha,x) = \begin{cases} &\alpha(e^x-1),\;x\leq0\\ &\text x,\;\;\;\;\;\;\;\;\;\;\;\;\;x>0 \end{cases}

여기에 scale 상수 λ를 곱해주면 Scale Exponential Linear Unit(SELU) 함수이다.

👍🏻장점
Dying ReLU 문제를 해결했으며, ReLU의 모든 장점을 포함하는 함수이다.

👎🏻단점
exp 함수를 사용하여 연산 비용이 추가적으로 발생하며, 큰 음수값에 대해 쉽게 포화된다.

6. Swish 함수
Google의 연구원들이 개발한 자체 게이트 활성화 함수이며, 시그모이드 함수에 입력값을 곱한 함수로 특이한 형태를 지닌 함수다.

수식으로 나타내면 아래와 같다.

f(x)=x(1+ex)=xsigmoid(x)f(x)=\dfrac{x}{(1+e^{-x})}=x*sigmoid(x)

Swish 함수ReLU 및 다른 활성화 함수를 대체하기 위해 만든 함수이다. Swish는 이미지 분류 , 기계 번역 등과 같은 심층 네트워크에서 ReLU 활성화 함수와 비교하여 성능이 대부분 동일하거나 능가했다고 한다.

6. 그 외 활성화 함수
위에서 설명한 6가지의 이 외에도 SELU, GELU, Thresholded ReLU, Softplus, Softplus, Maxout 등등 많은 활성화 함수들이 있지만 글이 길어진 관계로 이 즈음에서 마치고자 한다.

Conclusion🔖

어떤 함수가 제일 좋다고는 할 수 없지만, 자주 사용하는 활성화 함수는 이미 일부 정해져있다. 예를 들면 분류 문제에는 Softmax 또는 Sigmoid 함수를 사용해야한다거나, Hidden layer를 쌓는 과정에서 활성화 함수를 선택해야하는 경우, ReLU로부터 시작해 다른 활성화 함수로 시도해보는 절차가 좋다 등을 들 수 있다. 하지만 여기서 중요한 점은 모든 문제에 최적화된 함수는 없다는 것이다.

문제에 따라 다소 황당해보는 아이디어(활성화 함수는 아니지만 예를 들어 Dropout)로도 성능을 향상 시킬 수 있는 것처럼 딥러닝에서 '무조건 이게 맞아'와 같은 생각 만큼은 최대한 지양하는 것이 맞다 생각한다. 필자 또한 무언가를 배제하기보단 다양한 가능성을 제시해보는 사람이 되야겠다는 생각을 하며 이번 포스팅을 마치고자 한다.

Reference

https://subinium.github.io/introduction-to-activation/
https://medium.com/@vinodhb95/activation-functions-and-its-types-8750f1287464

profile
뒤늦게 시작된 데이터 분석가 생활

0개의 댓글