본문 바로가기

ML

[ML] 활성화 함수 (Activation Function) - Jungyu Ko

머신러닝을 공부할 때, 매우 다양한 기초지식들이 존재하지만 오늘은 그중 하나인 활성화 함수 (Activation Function)에 대해 공부해보도록 하겠습니다.

Activation Function이란?

Neural Network 모델의 각 layer에서는 input $x$와 모델 parameter $W$, bias $b$를 활용한 연산 $a = Wx+b$를 계산하고 마지막으로 activation function $h(a)$를 거쳐 출력합니다.

최종적으로 각 layer마다의 연산은 아래의 수식과 같습니다.

$$output = h(Wx+b)$$


Activation Function의 필요성

Activation Function을 통과시켜야 하는 이유는 무엇일까요?

결론부터 말씀드리면 선형 시스템을 비선형 시스템으로 만들기 위함입니다.

인공지능의 첫 시작이라 볼 수 있는 XOR problem의 예를 보면서 살펴보겠습니다.

 

XOR Problem

XOR Problem 예시

 

3번째 그래프를 살펴보겠습니다.

해당 그래프는 하나의 직선으로 어떠한 방법을 취해도 '+', '-'를 완벽하게 분류할 수 없습니다.

이러한 문제를 XOR problem이라고 합니다.

그렇다면 해당 문제를 어떤 방법으로 풀어야 할까요?

 

XOR problem 해결법

 

방법은 간단합니다. 위의 그래프처럼 직선을 하나 더 추가하면 됩니다.

여기서 말하는 직선은 Neural Network에서 하나의 layer라고 보시면 됩니다.

 

Deep Neural Network 예시

 

위의 그림을 보시면 input layer와 output layer 사이에 2개의 hidden layer가 있는 것을 확인할 수 있습니다.

hidden layer란 말 그대로 숨겨진 layer를 의미하며, input layer와 ouput layer에 가려져서 겉으로 보이지 않는 layer라고 볼 수 있습니다.

이렇게 hidden layer를 여러 개 쌓게 되면 Deep Neural Network로써의 의미를 가질 수 있습니다.

 

그렇다면 아무 작업을 하지 않고 단순하게 hidden layer를 쌓는 것은 의미가 있을까요?

결론부터 말씀드리자면 아무 작업을 하지 않고 단순하게 hidden layer를 쌓는 것은 하나의 layer를 쌓는 것과 같은 의미를 보여줍니다.

그 이유에 대해 알아보기 위해 선형대수학에서 배운 개념을 살펴보아야 합니다.

 

$$ f(x_1) = W_1x_1+b $$

$$ f(x_2) = W_2x_2+b $$

$$ f(x_1) + f(x_2) = f(x_1+x_2) $$

 

위의 수식 법칙으로 인하여 아무리 여러 개의 layer(function)를 쌓는다고 하여도 결국 하나의 layer(function)으로써의 작용이 되기 때문입니다.

이러한 문제로 인해 각 layer마다 특수한 무언가를 추가해주어야 여러 개의 layer를 쌓는 의미를 얻을 수 있습니다.

특수한 무언가란, 선형 시스템을 비선형 시스템으로 만들어주기 위한 특수한 함수를 의미하며 이것을 활성화 함수(Activation Function)이라 합니다.


Activation Function의 종류

각 layer마다 비선형적인 특징을 추가해주기 위해 activation function을 마지막에 통과시켜줍니다.

다행히도 activation function에 대한 다양한 종류의 함수들이 정리되어 있습니다.

activation function의 대표적인 4가지 함수에 대해 알아보도록 하겠습니다. 

 

Sigmoid 

Sigmoid 함수와 미분 값

$$ \sigma(x) = \frac{1}{1+e^{-x}} $$

Sigmoid 함수는 ReLU 함수 등장 전 가장 널리 사용되었습니다.

 

Sigmoid 함수 특징

  1. 출력 값으로 0~1 사이의 값으로 출력됩니다.
  2. 출력 값의 중심값이 0.5입니다.
  3. 지수함수 계산이 포함되어 계산이 복잡합니다.

ReLU 함수 등장 이후 Sigmoid 함수는 사용되지 않는다고 하였습니다

그렇다면 어떤 이유로 Sigmoid 함수를 사용하지 않는 것일까요?

가장 큰 문제는 Gradient Vanishing 문제가 있다는 것입니다.

 

Gradient Vanishing

이전 layer로 전파되는 gradient가 0에 가까워지는 현상을 의미합니다.

layer가 깊게 쌓이게 되면 parameter의 업데이트가 제대로 이뤄지지 않는다는 것을 의미합니다.

그렇다면, gradient vanishing이 왜 생길까요?

그 이유는 위의 그래프의 주황색 값을 보면, 양 극단의 sigmoid 함수 미분 값이 0에 가깝기 때문에 발생합니다.

미분 값이 0에 수렴하게 되면 parameter의 업데이트가 이루어지지 않습니다.


Tanh

Tanh 함수와 미분 값

$$ tanh(x) = \frac{e^x-e^{-x}}{e^x+e^{-x}} $$

ReLU 함수 등장 이전 Sigmoid 함수와 함께 사용되던 activation function입니다.

 

Tanh 함수 특징

  1. 출력 값으로 -1~1 사이의 값으로 출력됩니다.
  2. 출력 값의 중심값이 0입니다.
  3. 지수함수 계산이 포함되어 계산이 복잡합니다.

Tanh 함수 역시 Sigmoid 함수와 마찬가지로 gradient vanishing 문제가 있어서 깊은 layer에서의 parameter 업데이트가 이뤄지지 않습니다.


ReLU

ReLU 함수와 미분 값

$$ ReLU(x) = \max (0,x) $$

현재 activation function으로 가장 많이 사용되고 있는 ReLU 함수입니다.

 

ReLU 함수 특징

  1. 양 극단 값이 0에 수렴되는 현상이 발생하지 않습니다.
  2. 계산이 효율적입니다.
  3. 수렴 속도가 Sigmoid 함수에 비해 6배 정도 빠릅니다.

ReLU 함수는 Sigmoid, Tanh 함수의 가장 큰 문제인 gradient vanishing 문제를 해결하였습니다.

하지만 ReLU 함수가 이론적으로 완벽하다고 볼 순 없습니다.

중심값이 0이 아니며, 입력값이 음수인 경우, 항상 0을 출력하므로 입력값이 음수라면 parameter의 업데이트가 진행되지 않습니다.

그럼에도 불구하고, 실험적으로 ReLU 함수가 좋은 성능을 보여주기 때문에 널리 사용되고 있습니다.


Leaky ReLU

Leaky ReLU 함수와 미분 값

$$ Leaky\_ ReLU = \max (0.1x, x) $$

ReLU 함수의 가장 큰 문제는 입력 값이 음수면 parameter 업데이트가 이뤄지지 않는다는 것입니다.

Leaky ReLU는 음수의 입력값이 들어오면 약간의 weight를 주어서 음수 값에 대해서도 parameter의 업데이트를 하는 방법입니다.

 

Leaky ReLU 함수 특징

  1. 양 극단 값이 0에 수렴되는 현상이 발생하지 않는다.
  2. 음수의 입력값이 주어져도 parameter의 업데이트가 이뤄진다.

이론적으로 Leaky ReLU 함수가 ReLU 함수에 비해 좋은 성능을 보일 것 같지만 꼭 그렇지도 않다고 합니다.


마무리

layer를 깊게 쌓기 위한 방법으로는 여러 개의 layer를 통과시키는 것입니다.

이때, 단순하게 통과시키는 것이 아닌 각 layer마다 activation function을 통과시켜서 비선형적인 특징을 추가해줍니다.

본 포스팅에서는 4가지의 activation function을 살펴보았습니다.

  1. Sigmoid 
  2. Tanh
  3. ReLU
  4. Leaky ReLU

Sigmoid, Tanh 함수는 gradient vanishing 문제로 사용되지 않습니다.

ReLU 함수가 널리 사용되고 있습니다. 하지만 음수의 입력값에 대해 parameter의 업데이트가 이뤄지지 않습니다.

Leaky ReLU 함수는 음수의 입력값에 대해 parameter의 업데이트가 이뤄져 ReLU 함수의 단점을 보완하였습니다.