← AI 놀이터 홈으로

⚡ 활성화 함수 실험실 (Activation Functions)

신경망을 구부리는 손 — 곡선을 만들고, 깊은 층에서 기울기를 살려내는 작은 함수들을 직접 만져 봐요.

📖 따라하기 가이드 — 1 / 7 단계

Step 1. 신경망을 구부리는 손

신경망 놀이터에서 tanh를 골라 결정 경계를 구부렸던 것, 기억나나요? 그 구부리는 손이 바로 활성화 함수(activation function)예요. 뉴런의 선형 계산 결과 z를 받아 한 번 비틀어 내보내는 작은 함수죠. 화면 읽는 법: 구역 1의 파란 굵은 선이 함수 f(z), 주황 선이 기울기(도함수) f′(z), 연한 빨간 배경은 기울기가 거의 0이 되는 구역이에요.

🔍 구역 1 — 함수 돋보기

📖 읽는 법: 가로축은 뉴런에 들어온 값 z, 세로축은 함수값이에요. 파란 굵은 선이 함수 f(z), 주황 선이 기울기(도함수) f′(z), 연한 빨간 배경은 |f′(z)|<0.05인 기울기 소실 구역 — 경사하강법이 사실상 멈추는 곳이에요. 아래 슬라이더로 점 ●을 움직이며 두 값을 살펴보세요.

🎨 구역 2 — 왜 필요할까: 구부리기 데모

📖 읽는 법: 뉴런 2개짜리 작은 신경망 y = act(w₁x+b₁) + act(−1.5x−1)의 출력이에요 (두 번째 뉴런은 고정). 🎯 관전 포인트: “항등”을 고르면 슬라이더를 아무리 움직여도 결과가 항상 직선이에요 — 직선+직선=직선이니까요. 활성화 함수가 있어야 곡선, 즉 복잡한 패턴을 표현할 수 있어요.

🏔️ 구역 3 — 깊은 신경망에서의 생존율

📖 읽는 법: 각 막대는 그 층까지 통과한 뒤 남은 기울기의 크기예요. 층을 하나 지날 때마다 기울기에 f′(1)이 곱해진다고 본 대략적인 감각을 위한 단순화예요 (시그모이드 ≈0.20, tanh ≈0.42, ReLU·Leaky·항등 = 1). 값이 1e-4보다 작아지면 💀 — 그 층은 사실상 아무것도 못 배워요. 회색 점선은 ReLU의 누적값(항상 1) 참조선이에요. 한편 ReLU는 z<0이면 기울기가 0이라 한 번 음수 쪽에 갇힌 뉴런이 영영 안 깨어나는 죽은 뉴런(dying ReLU) 문제가 있고, Leaky ReLU는 음수 쪽에도 0.1배 기울기를 남겨 이걸 보완해요.

📊 지금 상태

선택 함수
σ 시그모이드
출력 f(z)
0.731
기울기 f′(z)
0.197
8층 통과 후 기울기
2.23e-6
기울기 반감 층 수
약 0.4층

f′(z)가 0에 가까우면 그 지점에서 학습이 멈춰요. 8층 통과 후 기울기는 f′(1)을 8번 곱한 값 — 0에 가까울수록 앞쪽 층이 배우지 못하는 기울기 소실이에요.

🗂️ 함수 한눈에 보기

  • 시그모이드 (Sigmoid) — 출력을 0~1 사이로 눌러 담아요. 확률처럼 읽기 좋지만 양끝에서 기울기가 거의 0이 돼요.
  • 하이퍼볼릭 탄젠트 (tanh) — −1~1 사이로 눌러 담아요. 0을 중심으로 대칭이라 시그모이드보다 낫지만 역시 양끝이 평평해요.
  • 렐루 (ReLU) — 음수는 0으로 끄고 양수는 그대로 통과. 양수 쪽 기울기가 항상 1이라 깊은 신경망의 표준이 됐어요.
  • 리키 렐루 (Leaky ReLU) — 음수 쪽도 0.1배로 살짝 통과시켜요. ReLU의 죽은 뉴런 문제를 보완한 버전이에요.
  • 항등 (활성화 없음) — 들어온 값을 그대로 내보내요. 이걸 쓰면 아무리 층을 쌓아도 직선(선형)만 만들 수 있어요.

🧮 수식과 파이썬

ReLU(z) = max(0, z)
음수는 0으로 끄고, 양수는 그대로 통과. 이 단순함이 딥러닝을 살렸어요
σ(z) = 1 / (1 + e⁻ᶻ)
출력을 0~1 사이로 눌러 담는 S자 곡선 — 확률처럼 읽기 좋지만 양끝에서 기울기가 죽어요
🐍 파이썬 코드로 보면? (펼치기)
import torch.nn as nn

# 활성화 함수만 갈아 끼우면 신경망의 성격이 달라져요
act = nn.ReLU()            # nn.Sigmoid() / nn.Tanh() / nn.LeakyReLU(0.1)

model = nn.Sequential(
    nn.Linear(2, 16),      # 선형 계산: 입력 2개 → 뉴런 16개
    act,                   # ← 구부리는 손! 여기서 직선이 곡선이 돼요
    nn.Linear(16, 16),
    act,                   # ← 이 act 줄들을 주석 처리해서 빼 보세요:
    nn.Linear(16, 1),      #    아무리 층을 쌓아도 선형 모델 하나와 같아져요
)

# act를 바꿔 가며 학습 속도를 비교해 보면
# 왜 요즘 기본값이 ReLU 계열인지 몸으로 느낄 수 있어요