신경망을 구부리는 손 — 곡선을 만들고, 깊은 층에서 기울기를 살려내는 작은 함수들을 직접 만져 봐요.
📖 읽는 법: 가로축은 뉴런에 들어온 값 z, 세로축은 함수값이에요. 파란 굵은 선이 함수 f(z), 주황 선이 기울기(도함수) f′(z), 연한 빨간 배경은 |f′(z)|<0.05인 기울기 소실 구역 — 경사하강법이 사실상 멈추는 곳이에요. 아래 슬라이더로 점 ●을 움직이며 두 값을 살펴보세요.
📖 읽는 법: 뉴런 2개짜리 작은 신경망 y = act(w₁x+b₁) + act(−1.5x−1)의 출력이에요 (두 번째 뉴런은 고정). 🎯 관전 포인트: “항등”을 고르면 슬라이더를 아무리 움직여도 결과가 항상 직선이에요 — 직선+직선=직선이니까요. 활성화 함수가 있어야 곡선, 즉 복잡한 패턴을 표현할 수 있어요.
📖 읽는 법: 각 막대는 그 층까지 통과한 뒤 남은 기울기의 크기예요. 층을 하나 지날 때마다 기울기에 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에 가까우면 그 지점에서 학습이 멈춰요. 8층 통과 후 기울기는 f′(1)을 8번 곱한 값 — 0에 가까울수록 앞쪽 층이 배우지 못하는 기울기 소실이에요.
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 계열인지 몸으로 느낄 수 있어요