신경망에 비선형성을 부여하여 복잡한 패턴을 학습할 수 있게 하는 함수

왜 활성화 함수가 필요한가?

활성화 함수가 없다면?

활성화 함수 없이 여러 층을 쌓으면:

결과: 아무리 많은 층을 쌓아도 단일 선형 변환과 동일!

활성화 함수의 역할

  1. 비선형성 부여: 복잡한 패턴 학습 가능
  2. 층별 독립성: 각 층이 의미 있는 변환 수행
  3. 표현력 증가: 더 복잡한 함수 근사 가능

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. 실전 팁

시작점

  1. 은닉층: ReLU로 시작
  2. 출력층:
    • 이진 분류 → 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 (선형) 또는 범위에 맞는 함수

기억할 것

  • ✅ 활성화 함수는 비선형성을 부여
  • ✅ 층마다 다른 활성화 함수 사용 가능
  • ✅ 은닉층과 출력층의 선택 기준이 다름

다음 학습

활성화 함수를 이해했다면:

  1. 손실_함수와_최적화 - 신경망이 학습하는 방법
  2. 정규화_기법 (Regularization) - 과적합 방지 기법

딥러닝_기초 (Deep Learning Fundamentals)