딥러닝 활성화함수에 대해 공부하다보니 함수에 대한 의문이 들었다.
RNN, LSTM에서는 Sigmoid(시그모이드) 함수를 사용했는데, 왜 현대의 모델들은 Relu(렐루)함수를 많이 쓰는 걸까?
그렇다면 각각의 함수의 장단점은 무엇일까?
우선 sigmoid, ReLU 둘 다 딥러닝에서 일반적으로 사용하는 활성화 함수다.
각각의 식을 살펴보면 아래와 같다.
시그모이드는 왼쪽과 같이 S자 곡선을 가지고, 0과 1 사이의 출력 범위를 가진다. 즉 x가 음의 무한대에 가까워지면 출력도 0에 가까워지고, 양의 무한대에 가까워지면 출력은 1에 가까워진다.
반면 ReLU는 양수면 입력값을 출력하고, 아니면 0을 출력한다. 양수의 입력값에 대해서는 기울기가 1이고, 음수 입력 값에 대해서는 기울기가 0이다.
두 가지 그래프를 함께 그려보면 아래와 같은 식으로 뻗어나간다는 것을 알 수 있다.
ReLU가 Sigmoid보다 선호되는 이유
1. 계산 효율성
활성화 함수의 계산 효율성은 입력이 주어졌을 때 출력을 얼마나 빨리 계산할 수 있느냐다.
대규모 데이터셋이나 복잡한 모델을 다룰 때는 당연히 더 간단한 함수가 계산 효율성이 높을 것이다.
그런 측면에서 sigmoid는 지수 함수가 포함되기 때문에 나눗셈 같은 복잡한 수학적 연산이 필요하지만, ReLU는 간단하계 계산할 수 있기 때문에 계산 효율성을 높일 수 있고 이는 훈련 프로세스를 더 빠르게 만들고 최적의 값으로 수렴하는 속도도 높여줄 수 있다.
2. Gradient(기울기) 소실 방지
sigmoid 함수는 그래디언트 소실 문제가 있다. 입력값이 매우 크거나 작다면 기울기도 0에 가까워진다.
기울기가 0에 가까워지면 가중치가 매우 느리게 업데이트되므로 학습 과정이 늦어지고, 신경망이 수렴하기 어렵게 된다. local minimum에 갇히게 될 수도 있다.
ReLu는 양수 입력 값에 대해 일정한 기울기를 갖고 있으므로 이 문제를 방지할 수 있다는 것!
3. Saturation problem(포화 문제) 방지 : 심층 네트워크에 더 적합하다
ReLU는 시그모이드 함수에서 발생할 수 있는 포화 문제를 방지할 수 있다.
여기서 포화는 활성화 함수의 출력이 1 또는 0에 매우 가까워져서 가중치와 편향을 업데이트하기 어려워져버려 신경망의 학습 능력이 제한되어 버리는 경우이다.
4. ReLU는 sparse activation(희소 활성화)를 생성한다
희소 활성화라는 의미는 많은 뉴런이 0을 출력하게 해서 활성화를 적게 한다는 뜻이다. 즉 한 번에 몇 개의 뉴런만 활성화된다.
ReLU함수의 그래프를 생각해보면, 음수는 모두 0을 출력하고 양수만 변경하지 않고 출력하게 되는데 이를 희소 활성화라고 한다.
이렇게 하면 계산 비용이 줄고, 과적합을 줄이는 데도 도움이 된다.(희소 활성화는 보통 자연어처리, 이미지인식 시에 일반화 성능을 높이는데 도움이 된다고 한다)
이런 ReLU함수에도 단점이 있는데, DNN에서 일부 뉴런이 비활성화되어서 출력이 0이 되는 'dying ReLU'문제를 겪을 수 있다. 이 문제를 완화하려면 Leaky ReLU 함수를 사용해서, ReLU함수의 음수 부분에 작은 기울기를 추가해서 음수 값에 대한 기울기가 0인 문제를 방지할 수 있다!
그러면 ReLU함수만 사용하면 되고, 시그모이드 함수는 필요가 없는 것일까?
물론 ReLU가 활성화 함수로 널리 사용되기는 하지만, 아직 RNN과 같은 일부 경우에는 시그모이드 활성화 함수를 자주 사용한다.
그 이유는 시그모이드가 0과 1 사이의 출력범위를 가지면서도 확률이나 백분율을 나타내는데 유용하기 때문이다. RNN에서 hidden layer의 출력은 보통 확률을 나타내는데, 시그모이드 함수를 쓰면 출력값이 원하는 확률 범위 내에 있는지 확인할 수 있다.
또 다른 이유는 시그모이드 함수가 곡선 형태이기 때문이다. 즉, 입력 데이터의 미묘한 변화를 감지하는 데 유용하다.
시간 경과에 따른 입력 데이터의 변화를 감지해야 한다면 시그모이드 함수가 적합하다.
그리고 시그모이드는 실수 값이 0과 1 사이의 값으로 매핑되므로, 특정 클래스에 속할 확률로 해석할 수 있다는 장점이 있다.
데이터가 이진, 범주형이라면 시그모이드 활성화를 사용하면 좋을 것이다.
반면 ReLU의 출력값은 무한 범위다. 즉 연속변수에 적합하고, 회귀 분제에 일반적으로 사용된다. 심층 신경망이나 깊은 네트워크를 학습할 때도 sigmoid와는 달리 gradient 소실 문제가 없으므로 효율적으로 사용할 수 있을 것이다.
즉 연속적이거나 작업에 회귀가 포함되어 있다면 ReLU 활성화를 사용하면 되겠다.
+추가로, 활성화 함수를 왜 비선형 함수로 써야하는지에 대한 이유도 간략히 정리해보자면
신경망에서 선형 함수를 쓰면 층을 아무리 깊게 해도 은닉층이 없는 네트워크와 똑같아져버려서 신경망의 장점을 살릴 수 없게 된다.
즉 층을 쌓기 위해서 비선형 함수를 사용하는 것이다.
++tanh(하이퍼볼릭 탄젠트) 함수에 대해서 생각해보면, -1에서 1 사이의 값으로 0이 중심이 된다.
시그모이드나 ReLU를 활성화 함수로 사용한다면, 가중치 기울기는 항상 0~1 사이가 되므로 0이 중심이 되지 않는다. 즉 기울기를 구하면 둘 다 양수가 된다. 이렇게 기울기의 부호가 똑같다는 말은 최적의 가중치를 찾아가는 데 있어서, 직선(+ -> - )이 아니라 항상 +->+ 혹은 - -> -로 움직여 Zigzag 현상이 발생하므로 업데이트가 느려진다.
tanh 함수는 이 단점을 보완할 수 있다. (다만 기울기 소실 문제는 여전히 가지고 있다)
'Data Science' 카테고리의 다른 글
Attention is all you need 논문 리뷰+코드 실습 (0) | 2023.04.26 |
---|---|
M2 맥북 POSTMAN 설치 다운로드 방법 (0) | 2023.04.13 |
ANN RNN LSTM 딥러닝 알고리즘 모델 구조 설명 (0) | 2023.04.09 |
역전파(back propagation) 알고리즘이란? +미분 수식까지 (0) | 2023.04.05 |
경사하강법 비용함수(cost) 이해하기 (0) | 2023.04.04 |
댓글