딥러닝의 모델을 구성하거나, 이미 학습된 모델을 사용할 때 많은 활성화 함수를 보게 됩니다. ReLU, Sigmoid, 등이 있는데, 왜 그런 활성화 함수를 그곳에 사용하느냐? 를 모르고 사용하는 경우가 있습니다. 단순히 ReLU를 쓰면 성능이 좋다는데? 보다는 조금 더 깊은 내용을 알아보고자 합니다.
1. Non-linear or not
사용하는 활성화 함수를 보면 전부 다 비선형 함수 입니다. 지금은 당연하지만, 활성화 함수로 다른 함수를 사용할 때도 있었습니다. 그 중 대표적인 함수가 Step Function 입니다.
Step Function은 정의 하기 나름 입니다만, 위 그림처럼 '계단같이' 생긴 함수들을 말합니다. 위 함수는 간단하게 0보다 크면 1, 작으면 -1로 나눈 것입니다. 아주 예전에 딥러닝이 등장하기 전에 인공신경망을 구성하였던 perceptron의 활성화 함수로 사용한 함수 입니다.
위 사진은 선형 함수 입니다. 이런 계단 함수, 선형 함수 대신에 왜 비선형 함수만 활성화 함수로 사용할까요? 그 이유로 크게 두가지를 볼 수 있습니다.
1) 계단함수 + 선형함수의 미분값
요즘 딥러닝의 학습 방법(파라메터 업데이트 방법)은 Back Propagation 입니다. Step Function의 사진을 보면 0에서는 미분이 불가능 하고, 그 외의 영역에서 미분값이 0 입니다. 선형 함수의 사진을 보면 y=-x+5는 미분값이 -1, y=1/2x+2는 미분값이 1/2 입니다.
Back Propagation으로 파라메터를 학습하려면 x의 값마다 gradient가 0이 아니고, 값도 서로 달라야 학습이 잘 됩니다. 그렇기 때문에 선형함수를 사용하면 학습이 어려워 집니다.
2) 비선형 함수 자체의 장점
비선형 함수를 사용하면 입력과 출력간의 관계가 복잡해집니다. 이런 관계를 통해 학습을 진행하게 됩니다. 기존의 머신러닝에 비해서 더 복잡한 관계를 학습하고 정보를 얻을 수 있으므로 딥러닝의 장점인 좋은 성능이 나오게 되는 것 입닌다.
2. 활성화 함수의 종류
활성화 함수는 꾸준히 연구 되고 있고, 그래서 종류도 정말 많습니다. 이번 글에서는 많이 알려져있고 자주 사용하는 함수들 몇가지를 소개해보겠습니다.
1. Sigmoid
시그모이드 함수란 S자형 곡선 또는 시그모이드 곡선을 갖는 수학 함수이다.[위키백과 참조.]
보통 딥러닝에서 시그모이드 함수라고 한다면, 위의 그림의 파란색선과 같습니다. 로지스틱함수라고도 부릅니다. 보시다시피 0~1 사이의 output 값을 가지고, 항상 증가하는 형태의 함수 입니다. 0~1 사이의 값으로 항상 아웃풋이 나온다는 의미는 꽤 큽니다. 딥러닝이 출발한 머신러닝, 그리고 통계가 결국 '확률'을 다루기 때문입니다. 그래서 많은 활성화 함수가 존재하는 요즘에도 종종 쓰이는 이유 입니다.
시그모이드 함수는 딥러닝 초기에 특히 자주 사용되어 왔는데 그 이유는 시그모이드의 gradient 값 때문 입니다. 값이 0이나 1에 수렴해 갈때 미분값이 거의 0에 수렴하다는 것을 볼 수 있습니다. Back propagation으로 학습할 때 이런 gradient vanishing 문제로 학습에 어려움이 존재했었고, 후에 다른 활성화 함수로 이 문제들을 해결했습니다.
(tanh 함수도 시그모이드 함수의 일부분으로, 비슷한 형태입니다.)
2. ReLU
ReLU는 간단합니다. 0보다 크면 그대로, 작으면 0으로 출력합니다. 의외로 이 단순한 함수가 성능이 굉장히 좋았습니다. 시그모이드 함수가 가지고 있는 비효율성을 해결해주면서 딥러닝 모델들의 성능이 상당히 발전하게 됩니다. 계산자체가 간단하고, 학습도 시그모이드 함수보다 6배 빠르게 수렴했다고 합니다.
ReLU의 성능이 정말 강력하지만 단점이 있긴 합니다. 0보다 작은 값, 즉 음수에서는 미분값이 아예 0이라서 학습이 불가능해지죠. 이 문제를 Dying ReLU라고 합니다. ReLU의 성능이 너무 강력하기 때문에 이런 단점을 개선하기 위해 많은 개선 함수가 등장합니다. PReLU, LeakyReLU 등이 그러합니다.
ReLU 류(?)의 함수들은 보통 위의 음수를 어떻게 처리하느냐, 또는 0 주변값들을 어떻게 처리하느냐, 0보다 클때 그냥 선형으로 둘것인가? 등을 바꿉니다. 설명을 대신할 사진 한장만 올리겠습니다.
3. Softmax
소프트맥스 함수는 다중 분류 문제를 풀때 가장 자주 사용되는 활성화 함수 입니다. 간단하게 말하면 출력되는 layer의 output들이 있을텐데, 그 output들의 합이 1이 되도록 출력하는 함수 입니다. MNIST 처럼 10개의 숫자를 분류하는 작업이라면, 10개 layer의 output의 합이 1이 되도록 하는 것 입니다.
이 때의 의미를 해석해보자면, 숫자를 분류 할때 0~9 중 하나일 확률은 1입니다. 그 중 실제 해당되는 숫자의 확률을 가장 높이 나오도록 학습하는 것이죠. 즉 '그 분류'가 될 확률을 학습하는 모델을 만드는 것 입니다.
3. 활성화 함수를 사용하는 이유
활성화 함수의 종류가 이렇게 많은 이유가 있습니다. 활성화 함수를 사용하는 이유는 크게 두가지 입니다. 하나는 모델 layer들 사이에 존재하면서 학습을 도와주고, 하나는 모델의 가장 마지막 출력에 관여 하면서 출력의 형태를 변화시키는 형태 입니다.
그래서 각각의 활성화 함수가 어느 상황일 때 잘 작동해서 모델의 비선형성을 학습하고 좋은 모델 성능을 이끌어낼지를 알아야 합니다. 맨 마지막 layer에 붙어있는 활성화 함수의 경우에는 모델이 출력해야 할 output이 어떤 형태로 나와야 하는지를 잘 알아야 하는 것이죠.
다중 분류 문제의 경우에는 softmax 함수를 출력으로 가장 먼저 생각 할 것이고, 0~1 사이로 한 사건의 확률을 모델링 할 경우에는 Sigmoid 함수를 가장 먼저 생각해 볼 것 입니다.
Ref)
https://subinium.github.io/introduction-to-activation/
https://en.wikipedia.org/wiki/Step_function
https://en.wikipedia.org/wiki/Linear_function
https://towardsdatascience.com/complete-guide-of-activation-functions-34076e95d044
'딥러닝' 카테고리의 다른 글
13. RNN (순환 신경망) (0) | 2019.11.20 |
---|---|
12. Learning Curve (학습 곡선) (2) | 2019.11.19 |
10. Transfer Learning (0) | 2019.11.16 |
9. CNN - Transposed, Dilated, Causal (0) | 2019.11.14 |
8. CNN - 1x1, 3x3, 5x5, 예제 코드 (0) | 2019.11.13 |