Activation Function이란?
신경망에서 ReLU, Sigmoid, Tanh, GELU, SiLU, SwiGLU 같은 이름을 자주 만난다.
이 함수들은 모두 Activation Function, 즉 활성화 함수다.
활성화 함수는 신경망에 비선형성을 넣어 복잡한 패턴을 표현하게 하고, 역전파에서 gradient가 흐르는 방식을 조절한다.
1. Activation Function의 기본 구조
신경망의 한 층은 먼저 선형 계산을 한다.
z = Wx + b
여기에 activation을 적용하면 다음과 같다.
a = f(z) = f(Wx + b)
여기서 f가 활성화 함수다.
2. 왜 필요한가?
활성화 함수 없이 선형층만 쌓으면 다음과 같이 계산된다.
h₁ = W₁x + b₁
h₂ = W₂h₁ + b₂
여러 선형층을 합치면 결국 하나의 선형 변환인 W'x + b'로 정리할 수 있다.
따라서 층을 많이 쌓아도 복잡한 곡선과 패턴을 표현하는 데 한계가 있다.
활성화 함수를 넣으면 각 층마다 비선형 변환이 일어난다.
그 결과 신경망은 이미지의 edge·모양·물체, 언어의 단어 의미·문법·문맥처럼 단계적인 표현을 학습할 수 있다.
3. Gradient와의 관계
역전파(Backpropagation)에서는 activation의 derivative가 gradient에 곱해진다.
그러므로 activation의 모양은 학습 안정성에 직접 영향을 준다.
- Sigmoid·Tanh: 큰 값에서 derivative가 작아져 vanishing gradient가 생길 수 있다.
- ReLU: 양수에서는 gradient가 잘 흐르지만 음수에서는 0이 될 수 있다.
- Leaky ReLU: 음수에서도 작은 gradient를 통과시킨다.
- GELU·SiLU: 값을 부드럽게 조절해 smooth한 gradient를 만든다.
- SwiGLU: gate를 이용해 정보의 통과 정도를 학습한다.
4. 대표적인 Activation Function
Step Function
step(x) = 0 (x < 0), 1 (x ≥ 0)
threshold를 넘으면 값이 갑자기 바뀐다. 퍼셉트론을 이해하기에는 좋지만 대부분의 구간에서 gradient가 0이므로 gradient descent 학습에는 적합하지 않다.
Sigmoid
σ(x) = 1 / (1 + exp(-x))
출력 범위가 (0, 1)이어서 확률처럼 해석할 수 있다.
이진 분류의 출력층과 LSTM·GRU의 gate에 적합하다.
다만 큰 양수·음수에서 saturation이 발생해 hidden layer에서는 gradient가 약해질 수 있다.
Tanh
tanh(x)의 출력 범위는 (-1, 1)이다. Sigmoid와 달리 0을 중심으로 하므로 초기 RNN의 hidden state 등에 사용됐다. 하지만 큰 절댓값에서 saturation이 발생한다.
ReLU
ReLU(x) = max(0, x)
양수는 그대로 통과시키고 음수는 0으로 만든다. 계산이 빠르고 양수 영역에서 gradient가 잘 흐르기 때문에 CNN과 MLP의 대표적인 기본 activation이다.
단점은 음수 입력이 계속되면 출력과 gradient가 0이 되는 dying ReLU 문제다.
Leaky ReLU와 PReLU
Leaky ReLU는 음수에서도 작은 기울기 α를 통과시킨다.
LeakyReLU(x) = x (x ≥ 0), αx (x < 0)
PReLU는 이 α를 고정하지 않고 학습한다. 둘 다 ReLU의 dying 문제를 완화하지만 PReLU는 추가 parameter가 필요하다.
ELU와 SELU
ELU는 음수 영역을 exponential 곡선으로 부드럽게 만든다. ReLU보다 음수 출력과 부드러운 gradient를 제공하지만 계산량이 많다.
SELU는 ELU에 고정된 scale과 alpha를 적용한다. 특정 초기화와 구조 조건에서 self-normalizing 특성을 목표로 하므로 아무 모델에나 무조건 사용하는 함수는 아니다.
Softplus
Softplus(x) = log(1 + exp(x))
ReLU의 부드러운 버전이다. 모든 지점에서 미분 가능하지만 ReLU보다 계산 비용이 크다. Softplus의 derivative는 Sigmoid와 같다.
GELU
GELU(x) = x · Φ(x)
여기서 Φ(x)는 표준정규분포의 누적분포함수다. 입력을 단순히 0 기준으로 자르지 않고 크기에 따라 부드럽게 통과시킨다. BERT와 Transformer 계열에서 많이 사용된다.
SiLU / Swish
SiLU(x) = x · Sigmoid(x)
Sigmoid를 gate처럼 사용해 입력을 부드럽게 조절한다. SiLU는 보통 Swish-1, 즉 x · Sigmoid(x)를 의미한다. 넓은 의미의 Swish는 x · Sigmoid(βx)처럼 β를 둘 수도 있다. Modern CNN, diffusion model, Transformer 등에서 대표적으로 사용된다.
Mish
Mish(x) = x · tanh(Softplus(x))
SiLU와 비슷한 smooth self-gating activation이다. 음수 영역도 부드럽게 처리하지만 ReLU보다 계산이 복잡하다.
Softsign
Softsign(x) = x / (1 + |x|)
출력이 부드럽게 -1과 1에 접근한다. Tanh보다 계산 방식은 단순하지만 현대 딥러닝의 기본값으로 자주 사용되지는 않는다.
Maxout
Maxout(x₁, ..., xₖ) = max(x₁, ..., xₖ)
여기서 x₁, ..., xₖ는 보통 서로 다른 affine 변환의 결과다. 여러 후보 중 최댓값을 선택하기 때문에 학습된 piecewise-linear 함수를 만들 수 있지만 parameter와 계산량이 증가한다.
GLU 계열
GLU는 하나의 scalar 입력에 적용하는 일반 activation이라기보다, 두 개의 projection 결과를 value와 gate로 나누어 정보를 조절하는 gated feed-forward 구조에 가깝다.
GLU(a, b) = a · Sigmoid(b)ReGLU(a, b) = a · ReLU(b)GEGLU(a, b) = a · GELU(b)SwiGLU(a, b) = a · SiLU(b)
GLU 계열은 일반 activation 하나를 적용하는 구조보다 복잡하지만, 어떤 정보를 얼마나 통과시킬지 gate가 학습한다. 실제 Transformer에서는 보통 a와 b를 각각 Linear projection으로 만든 뒤 gate 연산을 하고, 마지막에 다시 output projection을 적용한다. 특히 SwiGLU는 많은 현대 LLM의 feed-forward block에서 사용되는 대표적인 구조다.
5. 출력층 Activation
Hidden layer의 activation은 복잡한 표현을 만드는 역할을 하고, 출력층의 activation은 모델의 마지막 숫자를 문제에 맞는 의미로 변환하는 역할을 한다.
먼저 모델이 마지막 Linear layer에서 내놓는 값을 생각해보자.
logits = Wx + b
이 logits는 아직 확률이나 최종 예측값이 아닐 수 있다. 문제의 종류에 따라 마지막에 적절한 output activation을 적용한다.
5.1 회귀: Linear
집값, 온도, 속도처럼 정답이 제한되지 않은 실수값이라면 출력층에 별도의 activation을 적용하지 않는다.
prediction = logits
예를 들어 모델이 다음 값을 출력했다고 하자.
prediction = 37.4
온도 예측에서 37.4는 그대로 최종 예측값이 된다. 이런 방식을 Linear activation 또는 identity activation이라고 부른다.
사용 예: 집값 예측, 수요량 예측, 온도 예측
대표 loss: MSE, MAE, Huber Loss
Sigmoid를 회귀 출력에 사용하면 결과가 항상 0과 1 사이에 갇히기 때문에 일반적인 실수값 예측에는 적합하지 않다.
5.2 이진 분류: Sigmoid
고양이/고양이 아님, 합격/불합격처럼 class가 두 개일 때 사용한다.
모델의 raw output이 2.0이라고 하자.
logit = 2.0
sigmoid(2.0) ≈ 0.881
이 값은 양성 class일 확률이 약 88.1%라는 뜻으로 해석할 수 있다.
확률 ≥ 0.5 → 양성 class
확률 < 0.5 → 음성 class
사용 예: 스팸/정상, 질병/정상, 합격/불합격
대표 loss: Binary Cross-Entropy
중요한 점은 Sigmoid가 보통 마지막 출력 하나에 적용된다는 것이다.
입력 feature → hidden layers → logit 1개 → Sigmoid → 확률 1개
5.3 다중 분류: Softmax
고양이·개·말처럼 여러 class 중 정확히 하나를 선택하는 문제에서는 Softmax를 사용한다.
모델이 다음 logits를 출력했다고 하자.
logits = [2.0, 1.0, 0.1]
Softmax는 이를 다음과 같은 확률 분포로 변환한다.
probabilities ≈ [0.659, 0.242, 0.099]
확률의 합은 항상 1이다.
0.659 + 0.242 + 0.099 = 1.0
가장 높은 확률을 가진 첫 번째 class를 최종 예측으로 선택한다.
사용 예: 숫자 0~9 분류, 동물 종류 분류, 문서 category 분류
대표 loss: Categorical Cross-Entropy
Softmax는 다음 식으로 계산한다.
Softmax(zᵢ) = exp(zᵢ) / Σⱼ exp(zⱼ)
실제 구현에서는 exp가 너무 커지는 것을 막기 위해 logits에서 최댓값을 먼저 빼는 수치 안정화 방법을 사용한다.
5.3.1 실제 학습 코드에서의 주의점
개념적으로는 Softmax → Cross-Entropy와 Sigmoid → Binary Cross-Entropy 순서로 이해하면 된다. 하지만 PyTorch 같은 프레임워크에서는 수치 안정성을 위해 보통 activation을 직접 적용하지 않고 logits를 loss에 바로 전달한다.
# 다중 분류: model이 logits를 반환
loss = CrossEntropyLoss()(logits, labels)
# 이진 분류: model이 logit 하나를 반환
loss = BCEWithLogitsLoss()(logit, labels)
즉 CrossEntropyLoss 안에는 Softmax와 log 계산이 결합되어 있고, BCEWithLogitsLoss 안에는 Sigmoid와 Binary Cross-Entropy가 결합되어 있다. 이미 logits를 받는 loss에 Softmax나 Sigmoid를 한 번 더 적용하면 학습이 불안정해질 수 있다. 추론 때 확률을 보고 싶을 때만 Softmax나 Sigmoid를 적용한다.
5.4 다중 label 분류: Sigmoid 여러 개
여기서 다중 분류와 다중 label 분류를 구분해야 한다.
한 이미지에 고양이와 자동차가 동시에 있을 수 있다면, class끼리 서로 배타적이지 않다. 이때는 Softmax 하나가 아니라 각 class에 Sigmoid를 따로 적용한다.
cat → 0.91
car → 0.82
tree → 0.07
이 확률들의 합이 1일 필요는 없다. 여러 class가 동시에 참일 수 있기 때문이다.
단일 선택 문제 → Softmax
여러 개 동시 선택 → Sigmoid 여러 개
5.5 출력층 선택표
| 문제 | 출력 개수 | 출력층 | 대표 loss |
|---|---|---|---|
| 회귀 | 1개 이상 | Linear | MSE·MAE |
| 이진 분류 | 1개 | Sigmoid | Binary Cross-Entropy |
| 다중 분류 | class 수 | Softmax | Cross-Entropy |
| 다중 label 분류 | class 수 | Sigmoid 여러 개 | Binary Cross-Entropy |
5.6 Hidden activation과의 차이
다음처럼 생각하면 된다.
Hidden activation
→ 내부 표현을 복잡하게 만든다.
Output activation
→ 마지막 숫자를 문제의 의미에 맞게 해석한다.
예를 들어 고양이·개·말 분류 모델은 다음과 같은 구조를 가진다.
이미지
↓
CNN + ReLU/GELU
↓
class별 logits
↓
Softmax
↓
고양이 0.70, 개 0.20, 말 0.10
Softmax도 넓은 의미에서는 activation으로 볼 수 있지만, 보통은 hidden layer activation과 구분해 출력 확률 변환 함수라고 설명한다.
6. 실전에서의 선택과 핵심 정리
모든 activation이 항상 같은 깊이로 필요한 것은 아니다. 공부 흐름으로는 다음 연결을 중심으로 이해하면 충분하다. 이 순서가 모든 모델의 정확한 역사적 순서를 의미하는 것은 아니다.
ReLU → GELU → SiLU/Swish → SwiGLU
- ReLU: 음수를 자르고 양수를 통과시킨다.
- GELU: 입력 크기에 따라 부드럽게 통과시킨다.
- SiLU: 자기 자신의 Sigmoid gate로 값을 조절한다.
- SwiGLU: 두 projection 중 하나를 gate로 사용해 정보를 선택한다.
용도별로 보면 다음과 같다.
| 위치·모델 | 대표 함수 |
|---|---|
| 초기 신경망·RNN | Sigmoid, Tanh |
| CNN·일반 딥러닝 | ReLU, Leaky ReLU, ELU |
| Transformer·LLM | GELU, SiLU, GEGLU, SwiGLU |
| 이진 분류 출력층 | Sigmoid |
| 다중 분류 출력층 | Softmax |
| 회귀 출력층 | Linear |
7. 마무리
Activation Function의 핵심 역할은 두 가지다.
- 선형층만으로 표현할 수 없는 복잡한 패턴을 표현하도록 비선형성을 추가한다.
- 역전파 과정에서 gradient가 흐르는 방식을 조절한다.
한 문장으로 정리하면 다음과 같다.
Activation Function은 신경망이 복잡한 표현을 만들 수 있게 하고, 동시에 학습이 잘 되도록 gradient 흐름을 조절하는 함수다.