1. 활성화 함수란?
활성화 함수는 인공 신경망에서 뉴런의 출력 값을 결정하는 함수로, 입력 값에 비선형성을 부여하여 신경망이 복잡한 문제를 학습할 수 있도록 돕습니다. 비선형성을 도입함으로써 신경망은 단순한 선형 모델 이상의 복잡한 패턴을 학습할 수 있습니다. 각 활성화 함수는 고유한 특징과 사용 목적을 가지며, 특정 문제에 적합한 활성화 함수를 선택하는 것이 중요합니다.
2. 활성화 함수의 종류
인공 신경망에서 사용되는 활성화 함수는 여러 가지가 있으며, 각 함수는 특정한 상황에서 더 효과적으로 작동합니다. 주요 활성화 함수로는 렐루(ReLU)와 그 계열, 시그모이드(Sigmoid), 하이퍼볼릭 탄젠트(Tanh), 소프트맥스(Softmax), GELU, Swish 등이 있습니다.
2.1 렐루 (ReLU)와 렐루 계열
2.1.1 ReLU 특징
•
ReLU (Rectified Linear Unit): 음수 입력을 0으로, 양수 입력은 그대로 반환합니다.
•
출력 범위:
•
장점: 계산이 간단하며, 학습 속도가 빠릅니다.
•
단점: 음수 입력에 대해 기울기가 0이 되어 뉴런이 "죽을 수 있음" (Dead Neurons 문제)
ReLU(Rectified Linear Unit)는 딥러닝 모델의 핵심 활성화 함수로, 그 정의는 놀랍도록 단순한 max(0, x) 함수입니다. 이 함수는 입력값이 양수일 때는 해당 값을 그대로 통과시키고, 음수일 때는 0을 출력하는 두 가지 기본 동작을 수행합니다. 이러한 단순성에도 불구하고 ReLU는 현대 딥러닝에서 매우 중요한 역할을 합니다. 특히 단순 비교 연산만으로 구현되어 계산 효율성이 매우 높으며, 음수 영역에서의 0 출력으로 네트워크에 필요한 비선형성을 제공하면서도 양수 영역에서는 선형 특성을 유지합니다. 또한 양수 영역에서 기울기가 1로 일정하기 때문에, 깊은 신경망에서도 기울기가 안정적으로 전파되어 기울기 소실 문제를 크게 완화할 수 있습니다. 이러한 장점들이 결합되어 ReLU는 현대 딥러닝 아키텍처의 표준 활성화 함수로 자리잡게 되었습니다.
2.1.2 ReLU 계열들
ReLU의 성공을 기반으로, 그 한계를 극복하기 위해 다양한 변형 함수들을 개발했습니다. 이러한 변형들은 주로 ReLU의 음수 입력 처리 방식을 개선하는 데 초점을 맞추었습니다. Leaky ReLU는 음수 입력에 대해 작은 기울기를 허용하여 뉴런이 완전히 '죽지' 않도록 하며, ELU(Exponential Linear Unit)는 음수 영역에서 부드러운 곡선을 통해 자연스러운 기울기를 제공합니다. GELU(Gaussian Error Linear Unit)는 입력값의 확률적 특성을 고려한 비선형성을 도입했고, Swish는 시그모이드 함수를 활용하여 음수 영역에서도 부드러운 전이를 가능하게 했습니다. 이러한 변형들은 각각의 장단점을 가지고 있으며, 특정 문제나 아키텍처에 따라 더 나은 성능을 보일 수 있습니다.
1.
Leaky ReLU
•
특징: 음수 입력에 대해 작은 기울기를 부여하여 Dead Neurons 문제를 완화합니다.
•
수식:
•
출력 범위:
Leaky ReLU는 ReLU의 단순성은 유지하면서도 음수 입력에 대한 처리를 개선한 활성화 함수입니다. ReLU가 음수 입력을 완전히 차단하여 발생하는 'Dead Neurons' 문제를 해결하기 위해, 음수 입력에 대해 작은 기울기를 허용합니다. 수식으로는 입력이 양수일 때는 입력값을 그대로 출력하고, 음수일 때는 입력값에 작은 상수(일반적으로 0.01)를 곱하여 출력합니다. 이로 인해 출력 범위는 음의 무한대부터 양의 무한대까지 연속적으로 이어지며, 뉴런이 완전히 비활성화되는 것을 방지할 수 있습니다. 이러한 특성은 깊은 신경망에서 학습의 안정성을 높이는 데 기여합니다.
2.
ELU (Exponential Linear Unit)
•
특징: 음수 입력에 대해 지수 함수를 적용하여 더욱 부드러운 비선형성을 제공합니다.
•
수식:
•
출력 범위:
ELU는 ReLU와 Leaky ReLU의 장점을 결합하면서도 더욱 부드러운 학습 곡선을 제공하는 활성화 함수입니다. 양수 입력에 대해서는 ReLU처럼 선형적인 출력을 유지하지만, 음수 입력에 대해서는 지수 함수를 적용하여 부드러운 곡선을 그립니다. 이러한 특성은 gradient descent 과정에서 더 안정적인 학습을 가능하게 합니다. 수식적으로는 입력이 양수일 때는 입력값을 그대로 출력하고, 음수일 때는 α(exp(x) - 1)을 출력하며, 여기서 α는 보통 1.0의 값을 사용합니다. 이로 인해 출력 범위는 -α부터 양의 무한대까지이며, 음수 영역에서의 부드러운 전이는 노이즈에 대한 강건성을 높이는 데 도움이 됩니다.
3.
GELU (Gaussian Error Linear Unit)
•
특징: 확률적 활성화 함수로, 입력 값의 분포를 고려하여 출력을 결정합니다. 자연스러운 비선형성을 제공합니다.
•
수식:
근사식
•
출력 범위:
GELU는 확률론적 접근을 통해 새로운 형태의 비선형성을 도입한 혁신적인 활성화 함수입니다. 기존의 결정론적 활성화 함수들과 달리, GELU는 입력값의 확률적 특성을 고려하여 출력을 결정합니다. 입력값에 표준 정규 분포의 누적 분포 함수를 곱하는 방식으로 구현되며, 이로 인해 더욱 자연스러운 비선형성을 제공합니다. 실제 구현에서는 계산 효율성을 위해 쌍곡탄젠트 함수를 이용한 근사식이 주로 사용되며, 의 형태를 가집니다. GELU는 특히 BERT나 GPT와 같은 현대적인 트랜스포머 모델에서 뛰어난 성능을 보여주며, 자연어 처리 분야에서 광범위하게 사용되고 있습니다. 출력 범위는 음의 무한대부터 양의 무한대까지이지만, 확률적 특성으로 인해 극단적인 값들이 자연스럽게 제한됩니다.
4.
Swish
•
특징: Self-Gated 활성화 함수로, 학습 가능한 파라미터를 도입하여 유연성을 높였습니다. ReLU보다 부드러운 비선형성을 제공합니다.
•
수식:
•
출력 범위: (−∞,∞)
Swish는 최신 연구에서 제안된 자기 게이팅(self-gated) 활성화 함수로, 신경망의 표현력을 높이는 독특한 특성을 가지고 있습니다. 입력값에 시그모이드 함수를 곱하는 방식으로 작동하며, 이는 입력값이 자신의 활성화 정도를 스스로 조절할 수 있게 합니다. ReLU와 비교했을 때 더욱 부드러운 비선형성을 제공하며, 특히 깊은 신경망에서 더 나은 성능을 보여줍니다. 수식적으로는 f(x) = x · σ(x)로 표현되며, 여기서 σ(x)는 시그모이드 함수 1/(1 + e^(-x))입니다. 이러한 구조는 입력값의 크기에 따라 출력이 자연스럽게 조절되도록 하며, 음수 영역에서도 부드러운 기울기를 제공합니다. 출력 범위는 음의 무한대부터 양의 무한대까지이지만, 시그모이드 함수의 특성으로 인해 극단적인 값들이 자연스럽게 제한됩니다.
Python 코드 및 시각화
import numpy as np
import matplotlib.pyplot as plt
def relu(x):
return np.maximum(0, x)
def leaky_relu(x, alpha=0.01):
return np.where(x > 0, x, alpha * x)
def elu(x, alpha=1.0):
return np.where(x > 0, x, alpha * (np.exp(x) - 1))
def gelu(x):
return 0.5 * x * (1 + np.tanh(np.sqrt(2 / np.pi) * (x + 0.044715 * x**3)))
def swish(x):
return x / (1 + np.exp(-x)) # Equivalent to x * sigmoid(x)
x = np.linspace(-3, 3, 300)
y_relu = relu(x)
y_leaky_relu = leaky_relu(x)
y_elu = elu(x)
y_gelu = gelu(x)
y_swish = swish(x)
plt.figure(figsize=(12, 8))
plt.plot(x, y_relu, label='$ReLU$', color='blue')
plt.plot(x, y_leaky_relu, label='$Leaky\ ReLU$', color='orange')
plt.plot(x, y_elu, label='$ELU$', color='green')
plt.plot(x, y_gelu, label='$GELU$', color='purple')
plt.plot(x, y_swish, label='$Swish$', color='cyan')
plt.title("ReLU and Its Variants")
plt.xlabel("Input")
plt.ylabel("Activation")
plt.legend()
plt.grid(True)
plt.show()
Python
복사
2.2 시그모이드 (Sigmoid)
특징
•
수식:
•
출력 범위:
•
장점: 출력이 확률 값처럼 해석 가능합니다.
•
단점: 큰 입력 값에서 기울기가 매우 작아져 학습 속도가 느려질 수 있습니다 (Vanishing Gradient 문제).
시그모이드는 신경망의 초기부터 사용된 대표적인 활성화 함수입니다. 이 함수는 모든 실수 입력값을 0과 1 사이의 값으로 매끄럽게 변환하는 특성을 가지고 있으며, 이는 마치 확률값처럼 해석할 수 있어 이진 분류 문제의 출력층에서 특히 유용합니다. 수학적으로는 로 표현되며, 이 함수는 입력값이 증가함에 따라 S자 형태의 부드러운 곡선을 그립니다. 하지만 시그모이드 함수는 입력값이 매우 크거나 작을 때 기울기가 거의 0에 가까워지는 특성이 있어, 심층 신경망에서 기울기 소실(Vanishing Gradient) 문제를 일으킬 수 있다는 단점이 있습니다. 이러한 한계로 인해 은닉층의 활성화 함수로는 ReLU와 같은 다른 함수들이 더 선호되고 있습니다.
Python 코드 및 시각화
def sigmoid(x):
return 1 / (1 + np.exp(-x))
x = np.linspace(-10, 10, 400)
y_sigmoid = sigmoid(x)
plt.figure(figsize=(10, 6))
plt.plot(x, y_sigmoid, label='$Sigmoid$', color='blue')
plt.title("Sigmoid Function")
plt.xlabel("Input")
plt.ylabel("Activation")
plt.grid()
plt.legend()
plt.show()
Python
복사
2.3 하이퍼볼릭 탄젠트 (Tanh)
특징
•
수식:
•
출력 범위:
•
장점: 중심이 0이어서 시그모이드보다 학습이 잘 이루어질 수 있습니다.
•
단점: 여전히 큰 입력 값에서 Vanishing Gradient 문제가 발생할 수 있습니다.
하이퍼볼릭 탄젠트는 시그모이드 함수를 변형한 형태로, 출력값을 -1과 1 사이로 정규화하는 활성화 함수입니다. 수학적으로는 로 표현되며, 이는 입력값에 대해 0을 중심으로 대칭적인 S자 곡선을 그립니다. 시그모이드와 비교했을 때 출력의 중심이 0이라는 특징 덕분에 평균이 0에 가까운 데이터 분포를 만들어내어, 다음 층에서의 학습을 보다 효과적으로 만듭니다. 이러한 장점으로 인해 시그모이드보다 실제 적용에서 더 나은 성능을 보여주는 경우가 많습니다. 하지만 시그모이드와 마찬가지로 입력값이 매우 크거나 작을 때 기울기가 0에 가까워지는 기울기 소실 문제에서 자유롭지 못하다는 한계가 있습니다. 이로 인해 최근의 심층 신경망에서는 주로 ReLU 계열의 활성화 함수가 선호되고 있습니다.
Python 코드 및 시각화
def tanh(x):
return np.tanh(x)
x = np.linspace(-5, 5, 400)
y_tanh = tanh(x)
plt.figure(figsize=(10, 6))
plt.plot(x, y_tanh, label='$Tanh$', color='green')
plt.title("Tanh Function")
plt.xlabel("Input")
plt.ylabel("Activation")
plt.grid()
plt.legend()
plt.show()
Python
복사
2.4 소프트맥스 (Softmax)
특징
•
수식:
여기서, KK는 클래스의 수입니다.
•
출력 범위: 모든 출력의 합이 1로 정규화됩니다, 즉, 각 출력은 (0,1)(0, 1) 범위 내의 확률 값입니다.
•
용도: 주로 다중 클래스 분류 문제에서 사용됩니다.
•
소프트맥스는 다중 클래스 분류 문제에서 핵심적인 역할을 하는 활성화 함수입니다. 여러 개의 실수값을 입력받아 각각을 0과 1 사이의 값으로 변환하며, 모든 출력의 합이 1이 되도록 정규화합니다. 이는 각 클래스에 속할 확률로 자연스럽게 해석될 수 있습니다. 수학적으로는 각 클래스에 대한 출력값을 지수함수로 변환한 후, 모든 클래스의 지수함수 합으로 나누는 형태를 가집니다. 이러한 방식으로 계산된 확률값들은 항상 양수이며 총합이 1이 되는 특성을 가지게 됩니다. 예를 들어, 이미지 분류에서 고양이, 강아지, 새를 구분하는 문제라면, 소프트맥스는 주어진 이미지가 각 동물일 확률을 계산해주며, 이 확률들의 합은 정확히 1이 됩니다. 이러한 특성으로 인해 소프트맥스는 신경망의 마지막 층에서 특히 유용하게 사용됩니다.
Python 코드 및 시각화
def softmax(x):
exp_x = np.exp(x - np.max(x)) # Stability trick to prevent overflow
return exp_x / exp_x.sum(axis=0)
x = np.array([1, 2, 3, 6])
y_softmax = softmax(x)
plt.figure(figsize=(10, 6))
plt.bar(range(len(x)), y_softmax, color='orange')
plt.title("Softmax Outputs")
plt.xlabel("Class")
plt.ylabel("Probability")
plt.xticks(range(len(x)), [f"Class {i}" for i in range(1, len(x)+1)])
plt.show()
Python
복사
2.5 GELU (Gaussian Error Linear Unit)
특징
•
수식:
여기서, 는 표준 정규 분포의 누적 분포 함수입니다. 근사식으로는 다음과 같이 표현할 수 있습니다:
•
출력 범위: (−∞,∞)
•
장점: 부드러운 비선형성을 제공하여 모델의 표현력을 향상시킵니다.
•
단점: 계산이 ReLU보다 복잡하고 비용이 높을 수 있습니다.
Python 코드 및 시각화
def gelu(x):
return 0.5 * x * (1 + np.tanh(np.sqrt(2 / np.pi) * (x + 0.044715 * x**3)))
x = np.linspace(-5, 5, 400)
y_gelu = gelu(x)
plt.figure(figsize=(10, 6))
plt.plot(x, y_gelu, label='$GELU$', color='purple')
plt.title("GELU Function")
plt.xlabel("Input")
plt.ylabel("Activation")
plt.grid()
plt.legend()
plt.show()
Python
복사
2.6 Swish
특징
•
수식:
여기서,는 시그모이드 함수입니다.
•
출력 범위: (−∞,∞)
•
장점: ReLU보다 부드러운 비선형성을 제공하여 학습 과정에서 더 나은 성능을 보이는 경우가 많습니다.
•
단점: 계산이 ReLU보다 복잡하며, 일부 경우 과적합을 초래할 수 있습니다.
Python 코드 및 시각화
def swish(x):
return x / (1 + np.exp(-x)) # Equivalent to x * sigmoid(x)
x = np.linspace(-5, 5, 400)
y_swish = swish(x)
plt.figure(figsize=(10, 6))
plt.plot(x, y_swish, label='$Swish$', color='cyan')
plt.title("Swish Function")
plt.xlabel("Input")
plt.ylabel("Activation")
plt.grid()
plt.legend()
plt.show()
Python
복사
3. 정리
다양한 활성화 함수는 각기 다른 특징과 장단점을 가지고 있어, 신경망의 구조과 문제의 특성에 따라 적절히 선택되어야 합니다. 아래 표는 주요 활성화 함수들의 특징을 요약한 것입니다.
활성화 함수 | 수식 | 출력 범위 | 주요 특징 | 장점 | 단점 |
ReLU | f(x)=max(0,x)f(x) = \max(0, x) | [0,∞)[0, \infty) | 음수를 0으로, 양수를 그대로 반환 | 계산 효율성 | Dead Neurons 문제 |
Leaky ReLU | f(x)={xif x>0αxotherwisef(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha x & \text{otherwise} \end{cases} | (−∞,∞)(-\infty, \infty) | 음수에 작은 기울기 추가 | Dead Neurons 완화 | 추가 매개변수 필요 |
ELU | f(x)={xif x>0α(exp(x)−1)otherwisef(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha (\exp(x) - 1) & \text{otherwise} \end{cases} | (−α,∞)(-\alpha, \infty) | 음수에 지수 함수 적용 | 더 부드러운 비선형성 | 계산 복잡도 증가 |
GELU | f(x)=0.5x[1+tanh(2π(x+0.044715x3))]f(x) = 0.5x \left[1 + \tanh\left(\sqrt{\frac{2}{\pi}} \left(x + 0.044715x^3\right)\right)\right] | (−∞,∞)(-\infty, \infty) | 확률적 활성화 | 부드러운 비선형성 제공 | 계산 비용 증가 |
Swish | f(x)=x⋅11+e−xf(x) = x \cdot \frac{1}{1 + e^{-x}} | (−∞,∞)(-\infty, \infty) | Self-Gated 활성화 | 더 나은 학습 성능 가능 | 계산 복잡도 증가, 과적합 가능성 |
Sigmoid | f(x)=11+e−xf(x) = \frac{1}{1 + e^{-x}} | (0,1)(0, 1) | 출력이 확률 값처럼 해석 가능 | 확률적 해석 가능 | Vanishing Gradient 문제 |
Tanh | f(x)=tanh(x)=ex−e−xex+e−xf(x) = \tanh(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}} | (−1,1)(-1, 1) | 중심이 0 | 학습 효율성 향상 | Vanishing Gradient 문제 |
Softmax | fi(x)=exi∑j=1Kexjf_i(x) = \frac{e^{x_i}}{\sum_{j=1}^{K} e^{x_j}} | (0,1)(0, 1), 합=1 | 다중 클래스 정규화 | 클래스 확률 계산 | 지수 함수로 인해 계산 비용 증가 |
적절한 활성화 함수를 선택하여 신경망의 성능을 극대화하세요! 문제의 특성과 데이터의 분포에 따라 다양한 활성화 함수를 실험해보는 것이 중요합니다.
참고 자료