# activation function의 역할 : 비선형성 구현
linear한 hidden layer 백만개 쌓아봤자 linear 백만개 합성하면 그대로 linear이기에... activation funciton을 이용하여
non-linearity가 가능하게, 모델이 더 복잡하게 만들어질 수 있도록 해준다.
활성화 함수의 종류로 여러 가지 (sigmoid / tanh / ReLU)등이 있는데 이들 중 어떤 function을 neural network model로 이용할지 결정해야 한다.
Sigmoid Function
σ(x) = 1/(1+exp(-x))
위 그림에서 보이는것처럼 σ(x) 의 output은 (0,1)의 범위내로 출력된다.
초기 간단한 Neural Network 구현에서는 σ(x)의 output이 위와 같은 성질로 인해 확률적으로 해석하기 편하다는 장점으로 인하여 자주 사용되었지만, 아래와 같은 다양한 문제점들로 인해 지금은 잘 사용되지 않는 활성화 함수이다.
# 1 problem with σ(x) : saturated neurons kill the gradients
backpropagation 단계에서 gradient를 계산하여 가중치를 update해주는데, Loss function을 x에 대해서 미분해준 값을 구한다고 하자. (downstream gradient) 이는 upstream gradient (L을 σ(x)에 대하여 미분)과 local gradient ( σ(x)를 x에 대하여 미분)을 곱한 값이다. 그런데 σ'(x)의 그래프를 보면 x가 조금만 커지면 0으로 가까워진다는 것을 확인할 수 있다. 따라서, 활성화함수 노드를 지나가면서 계산되는 gradient가 0으로 가까워지고, 층이 쌓이면 쌓일수록 앞 layer에는 거의 update가 되지 않을 것임을 예상할 수 있다.
# 2 problem with σ(x) : sigmoid output의 중심 ( σ(0) = 0.5 )이 0이 아니다
local gradient인 σ(x) 을 weight에 대해 미분한 값을 보면 x 앞 부분은 항상 양수이고, x 는 input이므로
input이 양수이면 local gradient가 계속 양의 값으로, input이 음수이면 local gradient가 계속 음의 값으로 계산된다.
이 말은 sigmoid node로 인해서 모든 weight(w_i)에 대하여 upstream gradient의 부호 그대로, 또는 그 반대 부호로 유지된다는 것이고 all gradient elements would be either all-positive or all-negative
따라서 아래 그림과 같이 gradient가 update되는 방향이 특정지어질 수 밖에 없고 이는 gradient update 과정이 상당히 비효율적이게 만든다.
# 또 하나의 부수적인 문제점은 exponential function이 계산하는데 비용이 든다는 점..?
Tanh Function
tanh (x) = (e^x - e^-x) / ( e^x + e^-x)
hyperbolic tangent 함수는 위의 sigmoid function과 다르게 0-centered 함수이고 치역이 (-1,1)이지만
결국 scaled sigmoid function이기 때문에
( tanh(x) = 2 σ(2x) - 1 ) sigmoid function과 마찬가지로 gradient가 죽는다는 문제점이 동일하게 발생한다.
ReLU (Rectified Linear Unit)
f(x) = max(0,x)
x>0 인 구간에 대하여 기울기가 1로 일정하므로 sigmoid/tanh function과 다르게 gradient가 죽지 않는다는 장점이 있다.
여기서 또 기울기가 1로 일정하기에 연산 속도가 빠르다.
한편 단점으로는 sigmoid function과 같이 0-centered ouput이 아니며, x=0에서 미분이 불가능하고,
'Dead ReLU problem'이 일어난다. x<0인 구간에서 기울기가 0이기 때문에 초반에 output이 0으로 나오면 그 이후로 뭘 곱해도 계속 0이니까 gradient가 계속 업데이트되지 않는다.
Leaky ReLU (Rectified Linear Unit)
y = max(ax, x), a는 hyperparameter, 보통 a = 0.01
ReLU의 x<0 범위에서의 죽은 렐루 문제를 해결하기 위해 살짝 변형된 함수, x<0일 때 0.01x를 따라간다.
ReLU를 살짝 변형한 함수이기 때문에 ReLU의 장점 (기울기 소실 x, 빠른 연산)을 모두 취한다.
ELU (Exponential Linear Unit)
leaky ReLU 함수와 같이 ELU 함수 또한 음수 값에 대한 지수 곡선을 도입하여 죽은 ReLU문제를 방지한다. tanh함수 만큼 완벽한 0-centered는 아니지만 어느 정도 0-centered에 가까워졌음을 확인할 수 있다. 또한 음수 입력 값에 대하여 ReLU 함수에 비해 기울기가 완만하여 노이즈에 더 강하다.
다만, 지수함수이기 때문에 연산속도가 느리다는 단점이 있다.
그래서 어떤 Activation Function을 사용해야 하는가?
은닉층의 활성화 함수로는 대부분 ReLU를 이용한다. (단, dead relu problem 방지를 위하여 초기 값이 양이 되도록 initialize 해주기, learning rate 조절하기 등의 주의가 필요하다.)
때에 따라 leaky ReLU나 ELU 등의 변형함수를 이용하기도 한다.
그리고 sigmoid나 tanh함수는 거의 이용하지 않는다고 한다.
물론 출력층의 활성화 함수로는 시그모이드(2 class classification)나 소프트맥스(n class classification)를 활용한다.
'Study > 딥러닝' 카테고리의 다른 글
Weight Initialization (1) | 2023.10.22 |
---|---|
Data Preprocessing & Augmentation (1) | 2023.10.22 |
Convolutional Neural Networks (1) | 2023.10.14 |
Nerual Networks and Backpropagation (0) | 2023.10.13 |
Loss function & Optimization (0) | 2023.10.11 |