본문 바로가기
C.W.K.
Stream
Lesson 05 of 08 · published

활성화 함수

~22 min · relu, gelu, softmax

Level 0호기심
0 XP0/73 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

이유가 분명한 활성화 함수 선택법

ReLUmax(0, x). 2012년 이후 CNN과 대부분의 MLP 은닉층에서 기본값으로 쓰여. 계산이 싸고 활성값이 희소하며, 기울기가 1 아니면 0이라 역전파도 쉬워. 실패 모드는 죽은 뉴런이야. 편향값이 무너지면 유닛이 영원히 0에 갇혀.

GELU — 가우시안 오차 선형 유닛으로, ReLU보다 0 부근이 부드러워. Transformer(BERT, GPT, ViT)의 기본값이야. 계산 비용은 조금 더 들지만 규모가 커질수록 더 잘 학습돼. x * Φ(x).

SiLU / Swishx * sigmoid(x). EfficientNet, LLaMA, 현대 이미지 생성 모델에 쓰여. GELU처럼 부드러우면서 계산 비용은 약간 더 낮아.

Sigmoid — 값을 (0,1) 범위로 눌러 줘. BCE 손실과 짝지어 이진 분류의 출력 활성화로 쓰는 건 괜찮아. 깊은 신경망의 은닉층 활성화로는 좋지 않아. 기울기가 포화되어 학습이 멈춰.

Tanh — 값을 (-1, 1) 범위로 눌러 주며, 중심이 0이야. RNN(LSTM, GRU) 내부에서 쓰여. 깊은 스택에서는 시그모이드와 같은 포화 문제가 생겨.

소프트맥스 — 로짓 벡터를 확률 분포로 바꿔. 거의 항상 교차 엔트로피 손실 직전에 적용하는 마지막 단계야. PyTorch의 CrossEntropyLoss에는 수치적으로 안정적인 소프트맥스 처리가 이미 들어 있으니 따로 겹쳐 넣지 마.

팁: 은닉층은 ReLU를 기본으로 쓰고, Transformer라면 GELU를 써. Sigmoid는 이진 출력에만, 소프트맥스는 최종 분류기에만 써. 이 3줄 규칙이면 아키텍처의 90%를 다룰 수 있어.

활성화 함수가 왜 학습 가능성을 좌우할까

활성화 함수는 기울기의 흐름을 통제해. ReLU는 활성화된 곳마다 기울기 1을 전달하고, 나머지에서는 0을 전달해 깊은 스택도 학습 가능한 상태로 유지해. Sigmoid와 tanh는 양끝에서 포화되어 기울기를 죽여. 활성화 함수를 잘못 고르는 건 교과서대로 만든 아키텍처가 실제 데이터셋에서 아무것도 학습하지 못하는 가장 흔한 이유야.

원칙: 신경망이 학습을 거부한다면 데이터 로더 다음으로 활성화 함수부터 확인해. Tanh를 ReLU로 바꾸고 어떤 일이 일어나는지 봐.

Code

활성화 함수 둘러보기·python
import torch, torch.nn.functional as F
import matplotlib.pyplot as plt

x = torch.linspace(-5, 5, 200)
acts = {
    "ReLU":    F.relu(x),
    "GELU":    F.gelu(x),
    "SiLU":    F.silu(x),
    "Sigmoid": torch.sigmoid(x),
    "Tanh":    torch.tanh(x),
}
for name, y in acts.items():
    plt.plot(x, y, label=name)
plt.legend(); plt.grid(True); plt.show()
소프트맥스는 맨 마지막에·python
import torch, torch.nn as nn
logits = torch.randn(4, 10)
probs  = torch.softmax(logits, dim=-1)
print(probs.sum(dim=-1))  # tensor([1., 1., 1., 1.])

# DO NOT do softmax + CrossEntropyLoss. The loss already includes it.
loss = nn.CrossEntropyLoss()(logits, torch.tensor([3, 0, 9, 5]))
print(loss.item())

External links

Exercise

같은 2층 MLP를 ReLU, GELU, tanh 활성화 함수로 바꿔 가며 MNIST에 학습해. 각각의 학습 손실을 그리고, 어느 함수가 가장 빨리 수렴하는지와 각 함수가 실제로 학습되기는 하는지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.