인공신경망을 배우다 보면 딥러닝 아키텍쳐에서 activation function(활성화함수)이 들어있는 것을 볼 수 있다. 처음에는 sigmoid function이 있고, 그 뒤에는 relu 등으로 다양한 activation function이 있는 것을 보게 되는데, 정작 이 활성화함수가 뭐고, 왜 필요한지에 대해서는 모르는 경우가 있다. 나 또한 그냥 넘어갈 뻔 했으나, 복잡한 아키텍쳐로 접어들면서 레이어마다 activation function이 왜 필요한지에 대해 궁금해졌고, 그 때문에 아래와 같은 포스팅을 하게 되었다.
1. Activation Function이 무엇인가?
간단히 말하면, 활성화함수는 데이터 내에에서 네트워크가 복잡한 패턴을 학습할 수 있도록 인공신경망에 추가되는 함수다. 단일 퍼셉트론에서는 여러개의 신호가 들어오면 이를 조합하여 다음으로 신호를 보낼지 말지 결정하는데(0또는 1), 그것을 조금 더 확장하여 multiple layer perceptron에서는 레이어마다의 신호의 강도를 결정해주는 것이 활성화함수라고 할 수 있다. 아래와 같은 그림으로 실제 뉴런과 비교할 수 있다.
2. 그럼, Activation Function이 왜 필요한가?
일단 찾아본 바로는, 활성화함수를 사용하는데에는 크게 두가지 이유가 있다고 한다.
1. 신경망에 비선형 기능을 추가하기 위해서
만약 활성화함수가 없다면, 여러개의 레이어를 쌓는다고 해도 각 뉴런의 결과값은 선형결합의 선형결합이 된다. 그래서 결과적으로 출력값은 입력값들의 선형결합이 된다. 즉, 층을 여러개 쌓는 의미가 없어지게 된다.
2. 출력값을 특정 한계로 제한하기 위해서
Wx + b의 형태로 레이어가 만들어 질 때, 만일 활성화 함수로 가중치의 값에 한계를 주지 않게 되면, 복잡한 모델의 경우 weight의 값이 극단적이어질 수 있다. 그렇게 되면 컴퓨팅 계산 이슈로 이어질 수도 있다.
3. 적절한 activation function의 필요조건
인공신경망에 유리한(?) activation funcation을 만족하기 위해서는 다음과 같은 사항들을 고려하는 것이 좋다.
1. Vanishing Gradient problem
인공신경망의 back propagation에서 가장 일반적으로 사용되는 gradient descent의 경우 chain rule을 사용하는데, 이 과정에서 편미분값이 0에 매우 가까워지는 값들이 계속해서 곱해지게 된다면 layer의 weight의 값들은 점점 0으로 수렴한다. 그렇게 되면 학습의 결과가 back propagation 과정에서 전달되지 못하고 weight값이 업데이트되지 않는 문제가 발생한다. 그렇게 되면 모델의 정확성도 감소하게 된다. 이것이 vanishing gradient problem이라고 하는데, 모델 학습시 이러한 문제가 일어나지 않도록 활성화함수를 설정해야 한다.
2. Zero-Centered
활성화함수의 결과는 weight가 특정한 방향으로 이동하지 않도록 0에서 대칭되어야 한다.
3. Computiational Expense
활성화함수는 모든 레이어 직후에 적용이 되기 때문에 깊은 모델로 갈수록 계산의 횟수가 급격히 많아진다. 이러한 값들을 모두 계산하기 위해서는 계산 비용이 저렴해야 한다.
4. Differentiable(미분가능)
인공신경망은 경사하강법을 사용하여 훈련되므로 layer들은 미분가능해야 한다.
4. activation function의 종류
1. sigmoid function
activation function에 대해 기초를 배울때 이 함수를 가장 먼저 접하지만, vanishing gradient 문제들 발생시키는 대표주자라고 할 수 있다. 또한 sigmoid function의 결과값는 중심이 0이 아니라는 문제도 있어, 현재는 모델에서 이 활성화함수는 거의 사용하지 않는다.
2. tanh function
tanh function은 sigmoid드와 비슷한 형태의 함수이지만 결과값의 범위가 -1~1이기때문에 중심값이 0이다. 그래서 sigmoid보다 optimization이 빠르다는 장점이 있고 선호된다. 그러나 tanh모델도 vanishing gradient 문제를 가지고 있다.
3. ReLU(Rectified Linear Unit) = f(x) = max(0,x)
ReLU함수는 CNN에서 널리 사용되는 활성화함수다. 계산하기 쉽고, vanishing gradient 문제를 일으키지 않는다. 그러나 음수 입력에 대해서는 0으로 출력하기 때문에 0이 중심이 아니고 일부 노드는 아무것도 학습할 수 없다. 이러한 문제를 "dying ReLU"라고 한다.
4. LeakyReLU f(x) = max(αx, x)
ReLU의 수식의 값에 0대신 작은 값 αx를 넣어준 함수이다. 이 모델이 "dyning ReLU"문제를 어느정도 해결해준다. α에 1을 넣어줄 경우 그냥 선형함수 f(x) = x가 되기 때문에 1과 가까운 수가 아닌 작은 값을 넣어줘야 한다.
P.S. 이 외에도
요즘 google BERT 등에서 새롭게 사용되고 있는 활성화 함수로 GELU(Gaussian Error Linear unit) 함수가 있다.
깊은 레이어로 갈수록 GeLU의 성능이 좀 더 부각된다고 한다. 다른 알고리즘들보다 빠르게 수렴한다는 장점이 있다.
참고링크
pozalabs.github.io/Activation_Function/#
'Study > DL_Basic' 카테고리의 다른 글
[딥러닝] CNN 구조 - VGG (0) | 2021.01.08 |
---|---|
[파이토치로 시작하는 딥러닝 기초]10.4_Advance CNN(VGG) (0) | 2021.01.07 |
[파이토치로 시작하는 딥러닝 기초]10.3 ImageFolder / 모델 저장 / 모델 불러오기 (0) | 2021.01.04 |
[파이토치로 시작하는 딥러닝 기초]10.2_visdom (0) | 2020.12.31 |
[파이토치로 시작하는 딥러닝 기초]10.1_Convolutional Neural Network (0) | 2020.12.30 |