신경망에 비선형성을 부여하여 복잡한 패턴을 학습할 수 있게 하는 함수
왜 활성화 함수가 필요한가?
활성화 함수가 없다면?
활성화 함수 없이 여러 층을 쌓으면:
결과: 아무리 많은 층을 쌓아도 단일 선형 변환과 동일!
활성화 함수의 역할
- 비선형성 부여: 복잡한 패턴 학습 가능
- 층별 독립성: 각 층이 의미 있는 변환 수행
- 표현력 증가: 더 복잡한 함수 근사 가능
1. Sigmoid (시그모이드)
특징
- 출력 범위: (0, 1)
- S자 모양 곡선
- 확률로 해석 가능
그래프
σ(z)
1 | ___________
| /
0.5| /
| /
0 |______/
|
+----------------------- z
-6 -3 0 3 6
장점
- ✅ 부드러운 기울기
- ✅ 이진 분류의 출력층에 적합
- ✅ 확률값으로 해석 가능
단점
- ❌ 기울기 소실 (Vanishing Gradient): z가 크거나 작을 때 기울기가 거의 0
- ❌ 출력이 0 중심이 아님 (평균이 0.5)
- ❌ 지수 함수로 계산 비용이 높음
미분
사용 시기
- ✅ 이진 분류 출력층
- ❌ 은닉층 (거의 사용 안 함)
코드 구현
import numpy as np
def sigmoid(z):
return 1 / (1 + np.exp(-z))
def sigmoid_derivative(z):
s = sigmoid(z)
return s * (1 - s)
2. Tanh (하이퍼볼릭 탄젠트)
특징
- 출력 범위: (-1, 1)
- 0 중심 출력
- Sigmoid보다 강한 기울기
그래프
tanh(z)
1 | ___________
| /
0 |________/
| /
-1 |______/
|
+----------------------- z
-6 -3 0 3 6
장점
- ✅ 0 중심이라 학습이 더 빠름
- ✅ Sigmoid보다 나은 성능
- ✅ 더 강한 기울기 (-1 ~ 1)
단점
- ❌ 여전히 기울기 소실 문제 존재
- ❌ 계산 비용이 높음
미분
사용 시기
- ✅ RNN의 은닉층
- ✅ 일부 은닉층 (하지만 ReLU가 더 선호됨)
코드 구현
def tanh(z):
return np.tanh(z)
def tanh_derivative(z):
return 1 - np.tanh(z) ** 2
3. ReLU (Rectified Linear Unit)
특징
- 출력 범위: [0, ∞)
- 매우 간단한 계산
- 가장 널리 사용됨
그래프
ReLU(z)
| /
| /
| /
| /
|____/
|
+-------------- z
0
장점
- ✅ 계산이 매우 빠름 (max 연산만)
- ✅ 기울기 소실 문제 완화 (양수 영역에서 기울기 1)
- ✅ 희소성 (Sparsity) 제공 (일부 뉴런이 0)
- ✅ 생물학적 뉴런과 유사
단점
- ❌ Dying ReLU 문제: 음수 입력시 기울기 0 → 뉴런이 죽음
- ❌ 0 중심이 아님
Dying ReLU 문제
만약 가중치 업데이트로 인해 z < 0이 계속되면:
→ ReLU(z) = 0
→ 기울기 = 0
→ 가중치 업데이트 안 됨
→ 뉴런이 영구적으로 죽음 💀
미분
사용 시기
- ✅ CNN의 은닉층
- ✅ 대부분의 딥러닝 모델 은닉층
- ✅ 기본 선택으로 추천
코드 구현
def relu(z):
return np.maximum(0, z)
def relu_derivative(z):
return (z > 0).astype(float)
# PyTorch/TensorFlow에서
import torch.nn as nn
relu = nn.ReLU()
4. Leaky ReLU
보통 (하이퍼파라미터)
그래프
LeakyReLU(z)
| /
| /
| /
| /
|____/
| /
+-------------- z
0
장점
- ✅ Dying ReLU 문제 해결
- ✅ ReLU의 장점 유지
- ✅ 음수 영역에서도 작은 기울기 존재
사용 시기
- ✅ ReLU가 잘 작동하지 않을 때
- ✅ Dying ReLU 문제가 발생할 때
코드 구현
def leaky_relu(z, alpha=0.01):
return np.where(z > 0, z, alpha * z)
# PyTorch
import torch.nn as nn
leaky_relu = nn.LeakyReLU(negative_slope=0.01)
5. ELU (Exponential Linear Unit)
보통
장점
- ✅ 0에 가까운 평균 출력
- ✅ Dying ReLU 없음
- ✅ 더 부드러운 출력 (음수 영역)
- ✅ ReLU보다 빠른 수렴
단점
- ❌ 지수 함수로 계산 비용 높음
코드 구현
def elu(z, alpha=1.0):
return np.where(z > 0, z, alpha * (np.exp(z) - 1))
# PyTorch
import torch.nn as nn
elu = nn.ELU(alpha=1.0)
6. Softmax
특징
- 출력 범위: (0, 1)
- 모든 출력의 합: 1
- 확률 분포로 해석
예시
z = [2.0, 1.0, 0.1]
softmax(z) = [0.659, 0.242, 0.099]
# 합 = 1.0
사용 시기
- ✅ 다중 클래스 분류의 출력층
- ✅ K개 클래스 중 하나를 선택
코드 구현
def softmax(z):
# 수치 안정성을 위해 최대값 빼기
exp_z = np.exp(z - np.max(z))
return exp_z / np.sum(exp_z)
# PyTorch
import torch.nn as nn
softmax = nn.Softmax(dim=1)
7. 활성화 함수 선택 가이드
은닉층 (Hidden Layer)
상황 | 추천 활성화 함수 |
---|---|
기본 선택 | ReLU |
Dying ReLU 문제 | Leaky ReLU, ELU |
더 부드러운 출력 필요 | ELU |
RNN 은닉층 | Tanh |
계산 속도 중요 | ReLU |
출력층 (Output Layer)
문제 유형 | 추천 활성화 함수 |
---|---|
이진 분류 | Sigmoid |
다중 클래스 분류 | Softmax |
회귀 (범위 제한 없음) | None (선형) |
회귀 (양수만) | ReLU |
회귀 (0~1 범위) | Sigmoid |
회귀 (-1~1 범위) | Tanh |
8. 비교표
활성화 함수 | 범위 | 장점 | 단점 | 주 사용처 |
---|---|---|---|---|
Sigmoid | (0, 1) | 확률 해석 | 기울기 소실 | 이진 분류 출력 |
Tanh | (-1, 1) | 0 중심 | 기울기 소실 | RNN 은닉층 |
ReLU | [0, ∞) | 빠름, 간단 | Dying ReLU | 대부분의 은닉층 |
Leaky ReLU | (-∞, ∞) | Dying 해결 | - | ReLU 대체 |
ELU | (-α, ∞) | 0 중심, 부드러움 | 계산 비용 | 성능 중시 |
Softmax | (0, 1), 합=1 | 확률 분포 | - | 다중 분류 출력 |
9. 실전 팁
시작점
- 은닉층: ReLU로 시작
- 출력층:
- 이진 분류 → Sigmoid
- 다중 분류 → Softmax
- 회귀 → None (선형)
문제가 생기면
- 학습이 안 됨: 다른 활성화 함수 시도 (Leaky ReLU, ELU)
- 기울기 소실: ReLU 계열 사용
- Dying ReLU: Leaky ReLU, ELU 사용
코드 예시 (Keras)
from tensorflow.keras import layers
model = keras.Sequential([
layers.Dense(128, activation='relu'), # 은닉층 1
layers.Dense(64, activation='relu'), # 은닉층 2
layers.Dense(10, activation='softmax') # 출력층 (10-class)
])
코드 예시 (PyTorch)
import torch.nn as nn
model = nn.Sequential(
nn.Linear(784, 128),
nn.ReLU(), # 은닉층 1
nn.Linear(128, 64),
nn.ReLU(), # 은닉층 2
nn.Linear(64, 10),
nn.Softmax(dim=1) # 출력층
)
핵심 요약
은닉층 선택
- 🥇 1순위: ReLU (기본 선택)
- 🥈 2순위: Leaky ReLU (Dying ReLU 시)
- 🥉 3순위: ELU (더 나은 성능 원할 때)
출력층 선택
- 이진 분류: Sigmoid
- 다중 분류: Softmax
- 회귀: None (선형) 또는 범위에 맞는 함수
기억할 것
- ✅ 활성화 함수는 비선형성을 부여
- ✅ 층마다 다른 활성화 함수 사용 가능
- ✅ 은닉층과 출력층의 선택 기준이 다름
다음 학습
활성화 함수를 이해했다면:
- 손실_함수와_최적화 - 신경망이 학습하는 방법
- 정규화_기법 (Regularization) - 과적합 방지 기법