Activation Function
활성화 함수
뉴런 출력을 결정하는 함수. ReLU, Sigmoid, Tanh, Softmax가 대표적.
활성화 함수
뉴런 출력을 결정하는 함수. ReLU, Sigmoid, Tanh, Softmax가 대표적.
활성화 함수(Activation Function)는 신경망의 각 뉴런이 입력 신호를 받아 출력 신호로 변환할 때 사용하는 비선형 함수입니다. 입력의 가중합(weighted sum)에 활성화 함수를 적용하여 다음 레이어로 전달할 출력값을 결정합니다. 활성화 함수가 없으면 신경망은 단순한 선형 변환의 연속이 되어 복잡한 패턴을 학습할 수 없습니다.
생물학적 뉴런에서 영감을 받아 1943년 McCulloch-Pitts 모델에서 처음 도입되었습니다. 초기에는 Step Function이 사용되었고, 1980년대 역전파 알고리즘과 함께 Sigmoid가 주류가 되었습니다. 2010년대 들어 ReLU가 등장하며 딥러닝의 급속한 발전을 이끌었습니다.
ReLU(Rectified Linear Unit)는 f(x) = max(0, x)로 계산이 단순하고 기울기 소실 문제를 완화합니다. Sigmoid는 출력을 0~1로 압축하여 확률 해석에 유리하고, Softmax는 다중 클래스 분류의 출력층에서 확률 분포를 만듭니다. Tanh는 -1~1 범위로 Sigmoid보다 중심이 0에 가까워 학습이 빠릅니다.
CNN에서는 ReLU가 기본이며, 음수 영역도 학습하는 Leaky ReLU, PReLU가 대안입니다. Transformer에서는 GELU(Gaussian Error Linear Unit)가 표준으로 자리잡았습니다. 출력층에서는 이진 분류에 Sigmoid, 다중 분류에 Softmax, 회귀에는 활성화 없이(Linear) 사용합니다.
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
import numpy as np
# 주요 활성화 함수 비교
x = torch.linspace(-5, 5, 100)
# 각 활성화 함수 적용
relu = nn.ReLU()(x)
sigmoid = torch.sigmoid(x)
tanh = torch.tanh(x)
leaky_relu = nn.LeakyReLU(0.1)(x)
gelu = nn.GELU()(x)
# 시각화
fig, axes = plt.subplots(2, 3, figsize=(12, 8))
functions = [
(relu, 'ReLU', 'max(0, x)'),
(sigmoid, 'Sigmoid', '1/(1+e^-x)'),
(tanh, 'Tanh', '(e^x-e^-x)/(e^x+e^-x)'),
(leaky_relu, 'Leaky ReLU', 'max(0.1x, x)'),
(gelu, 'GELU', 'x*CDF(x)'),
]
for ax, (y, name, formula) in zip(axes.flatten(), functions):
ax.plot(x.numpy(), y.detach().numpy(), linewidth=2)
ax.axhline(y=0, color='gray', linestyle='--', alpha=0.5)
ax.axvline(x=0, color='gray', linestyle='--', alpha=0.5)
ax.set_title(f'{name}: {formula}')
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# PyTorch 모델에서 활성화 함수 사용
class SimpleNN(nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim):
super().__init__()
self.fc1 = nn.Linear(input_dim, hidden_dim)
self.relu = nn.ReLU() # 은닉층 활성화
self.fc2 = nn.Linear(hidden_dim, output_dim)
# 출력층: 분류면 CrossEntropyLoss가 Softmax 포함
def forward(self, x):
x = self.fc1(x)
x = self.relu(x) # 비선형성 추가
x = self.fc2(x)
return x
model = SimpleNN(784, 256, 10)
print(model)
"은닉층에는 ReLU를 기본으로 쓰고, 출력층은 다중 분류니까 Softmax로 가겠습니다. 혹시 음수 입력도 중요한 특성이면 Leaky ReLU로 바꿔볼 수 있어요."
"ReLU의 Dying ReLU 문제를 설명해주세요. 뉴런이 한번 음수 영역에 빠지면 기울기가 0이 되어 다시는 활성화되지 않는 문제입니다. 이걸 해결하려면 Leaky ReLU나 ELU를 사용합니다."
"출력층에 ReLU 쓰면 안 돼요. 확률을 출력해야 하는데 ReLU는 0~무한대 범위라서요. 이진 분류면 Sigmoid, 다중 분류면 Softmax를 써야 합니다."
학습률이 너무 높으면 뉴런이 음수 영역에 고착되어 영구적으로 비활성화됩니다. 학습률을 낮추거나 Leaky ReLU, PReLU, ELU 등을 사용해 완화할 수 있습니다.
입력이 크거나 작으면 기울기가 거의 0에 가까워져 깊은 네트워크에서 학습이 정체됩니다. 은닉층에서는 ReLU 계열을 사용하고, Sigmoid는 출력층에만 제한적으로 사용하세요.
회귀 문제에 Sigmoid를 쓰면 출력 범위가 제한되고, 분류 문제에 ReLU를 쓰면 확률 해석이 불가능합니다. 문제 유형에 맞는 출력층 활성화 함수를 선택하세요.