활성화 함수에 대해 알아봅시다.
활성화 함수(Activation Function)란 무엇일까?
딥러닝을 구성하는 요소 중 하나인 활성화 함수는 뉴런에 들어온 신호의 총합을 바탕으로 최종 출력 신호를 결정하는 함수입니다.
활성화 함수는 왜 사용해야 하는가?
모델의 비선형성 부여
여러 번 수행된 선형 변환은 다시 하나의 선형 변환으로 표현 할 수 있습니다.
활성화 함수 없이 쌓은 딥러닝 모델은, 하나의 선형 변환으로 표현할 수 있으며, 단일 신경망과 완전히 동일해 질 수 있습니다.
이는 복잡한 패턴을 학습할 수 없음을 의미합니다.
모델의 목적에 맞는 출력값 생성
분류화 회귀 등 출력값의 범위를 조절하여 모델의 목적에 맞는 응답값을 주도록 할 수 있습니다.
활성화 함수는 왜 알아야 하는가?
활성화 함수 종류에 따라 모델의 성능, 학습 속도, 역전파 과정이 크게 달라집니다. 예를 들어, Sigmoid, Tanh 함수는 Vanishing Gradient 문제가 있으나, ReLU 계열은 이를 완화할 수 있습니다.
활성화 함수 목록
1. 시그모이드 (Sigmoid)
로지스틱 함수라고도 불리며, 출력을 (0, 1) 사이로 압축합니다.
- 이진 분류 모델의 출력층에 주로 사용됩니다.
- 은닉층에서는 그래디언트 소실 문제 때문에 거의 사용하지 않습니다.
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
s = sigmoid(x)
return s * (1 - s)
2. 하이퍼볼릭 탄젠트 (Tanh)
출력을 (-1, 1) 사이로 압축하며, 함수의 중심이 0입니다.
- Sigmoid보다 중앙 집중화(zero-centered)되어 학습이 다소 효율적일 수 있으나, 여전히 그래디언트 소실 문제가 존재합니다.
import numpy as np
def tanh(x):
return np.tanh(x)
def tanh_derivative(x):
return 1 - np.tanh(x)**2
3. ReLU (Rectified Linear Unit)
현대 딥러닝에서 가장 표준적으로 사용되는 활성화 함수입니다.
- 계산이 매우 빠르고 그래디언트 소실 문제를 해결했습니다.
- 가중치 업데이트로 인해 입력이 0 이하가 되면 그 이후에는 학습을 해도 뉴련이 항상 0만 출력하게 되는 'Dying ReLU' 문제가 발생할 수 있습니다.
import numpy as np
def relu(x):
return np.maximum(0, x)
def relu_derivative(x):
return np.where(x > 0, 1, 0)
4. Leaky ReLU
'Dying ReLU' 문제를 해결하기 위해 음수 입력에 작은 기울기를 부여합니다.
- ReLU의 장점을 대부분 유지하면서 'Dying ReLU' 문제를 예방합니다..
import numpy as np
def leaky_relu(x, alpha=0.01):
return np.where(x > 0, x, x * alpha)
def leaky_relu_derivative(x, alpha=0.01):
return np.where(x > 0, 1, alpha)
5. GeLU (Gaussian Error Linear Unit)
BERT, GPT 등 최신 Transformer 모델에서 표준으로 자리 잡은 함수입니다.
- ReLU처럼 작동하지만 경계가 부드러우며, 확률적 정규화 효과를 가집니다.
- ReLU보다 더 복잡한 패턴을 학습할 수 있다고 알려져 있습니다.
import numpy as np
def gelu(x):
return 0.5 * x * (1 + np.tanh(np.sqrt(2 / np.pi) * (x + 0.044715 * x**3)))
def gelu_derivative(x):
# 복잡한 미분식 대신 근사치를 사용하거나, 자동 미분 라이브러리를 활용하는 것이 일반적입니다.
# 아래는 근사식의 미분 결과입니다.
sech_arg = np.sqrt(2 / np.pi) * (x + 0.044715 * x**3)
sech_val = 1 / np.cosh(sech_arg)
term1 = 0.5 * (1 + np.tanh(sech_arg))
term2 = 0.5 * x * (sech_val**2) * np.sqrt(2 / np.pi) * (1 + 3 * 0.044715 * x**2)
return term1 + term2
6. Softmax
다중 클래스 분류 문제의 출력층에 사용되는 함수입니다.
- 모델의 최종 출력(Logits)을 각 클래스에 대한 확률 분포로 변환합니다. 모든 출력의 합은 1이 됩니다.
import numpy as np
def softmax(x):
# 오버플로우 방지를 위한 안정화 기법
e_x = np.exp(x - np.max(x))
return e_x / e_x.sum(axis=0)
어떤 활성화 함수를 선택해야 할까?
1. 출력층
풀고자 하는 문제의 종류에 따라 선택을 합니다.
이진 분류
학습 결과가 (0, 1) 사이의 확률 값을 만들기 위해 Sigmoid 함수를 사용합니다.
다중 클래스 분류
K개의 클래스에 대한 확률 분포를 만들어 주기 위해 Softmax 함수를 사용합니다.
다중 레이블 분류
K개의 클래스에 대해 독립적인 확률을 가져야 하므로, K개의 Sigmoid 함수를 갖도록 합니다.
2. 은닉층
일단 ReLU를 사용합니다.
- ReLU는 대부분의 문제에서 준수한 성능을 보입니다.
- 계산이 매우 빨라서 모델의 학습과 추론 속도를 빠르게 합니다.
- 구현이 간단하고 직관적입니다.
학습이 불안정하거나, 뉴런이 죽는 현상이 발생하는것 같으면, Leaky ReLU 또는 PReLU 함수를 사용합니다.
'Machine Learning > 기본' 카테고리의 다른 글
ML Engineer를 위한 최적화 함수 정리 (1) | 2025.08.23 |
---|