신경망의 활성화 함수

신경망의 활성화 함수
활성화 함수.png
인공지능(AI )의 최근 발전은 특히 이미지 인식, 자연어 처리(NLP), 자율주행차 분야에서 놀라울 정도였습니다. 이러한 성과에 기여한 핵심 요인은 실제 데이터에 자주 존재하는 복잡한 비선형 함수를 추정하는 인공 신경망의 능력입니다. 이 능력은 주로 활성화 함수에 기인하며, 활성화 함수는 신경망에 비선형성을 도입하여 복잡한 관계와 패턴을 모델링할 수 있게 합니다.
활성화 함수를 심층적으로 이해하고, 그 목적, 작동 방식, 그리고 신경망에 왜 중요한지 살펴보겠습니다.
활성화 함수란 무엇인가요?
활성화 함수는 신경망에서 뉴런의 출력을 결정하는 데 사용되는 수학 함수로, 모델에 비선형성을 도입합니다. 활성화 함수는 신경망의 기본 단위인 노드(뉴런)의 입력에 적용되어 노드의 출력을 생성합니다. 신경망은 입력의 가중합을 계산하고, 편향을 더한 다음, 이 합을 활성화 함수에 통과시켜 수정된 값을 출력합니다. 이 값은 다음 네트워크 층으로 전달되거나 최종 출력이 됩니다.
그림- 신경망에서 활성화 함수의 역할. .png
그림: 신경망에서 활성화 함수의 역할. | 출처
비선형성이 중요한 이유는 무엇인가요?
활성화 함수가 왜 필수적인지 이해하려면, 선형 모델에 어떤 한계가 있는지 아는 것이 중요합니다. 선형 모델은 입력과 출력 사이의 직선 관계를 나타냅니다. 이는 단순한 작업에서는 잘 작동하지만, 데이터가 더 복잡하고 비선형 패턴을 가지는 경우에는 실패합니다.
비선형성은 신경망이 직선이 아닌 결정 경계를 만들 수 있게 합니다. 따라서 신경망은 선형 모델로는 표현할 수 없는 데이터의 비선형 패턴을 이해할 수 있습니다.
그림- 함수의 유형.png
그림: 함수의 유형
활성화 함수의 작동 방식
이제 활성화 함수를 소개했으니, 이러한 함수가 수학적으로 어떻게 작동하여 입력 신호를 출력 신호로 변환하는지 살펴보겠습니다. 출력 신호의 범위는 흔히 0과 1 사이 또는 -1과 1 사이입니다. 신경망의 각 뉴런에서 데이터는 다음 단계로 흐릅니다:
입력: 신경망의 각 뉴런은 하나 이상의 입력을 받습니다. 이러한 입력은 네트워크에 공급되는 원본 데이터(입력층의 경우)에서 올 수도 있고, 이전 층 뉴런들의 출력에서 올 수도 있습니다.
가중합 계산: 입력은 중요도를 결정하기 위해 해당 가중치와 곱해집니다. 그런 다음 가중치가 적용된 입력들이 합산되고, 가중합이라고 알려진 단일 값이 반환됩니다.
활성화 함수 적용: 가중합이 계산되면 활성화 함수에 전달되며, 활성화 함수의 결과가 뉴런의 출력이 됩니다.
이 과정은 네트워크 층 전반의 각 뉴런에서 반복되어 데이터를 더 복잡한 방식으로 변화시킵니다.
그림- 신경망 아키텍처, 활성화 함수, 뉴런 가중치 업데이트. .png
그림: 신경망 아키텍처, 활성화 함수, 뉴런 가중치 업데이트.
신경망은 다양한 유형의 활성화 함수를 사용합니다. 각 함수는 고유한 강점을 가지고 있으며 특정 작업에 더 적합합니다. 예를 들어, 시그모이드 함수는 이진 분류 문제에 최적이고, 소프트맥스는 다중 클래스 예측에 유용하며, ReLU는 기울기 소실 문제를 극복하는 데 도움이 됩니다.
적절한 활성화 함수를 선택하면 학습 속도가 빨라지고 성능이 향상됩니다. 이제 일반적인 활성화 함수 몇 가지를 살펴보겠습니다:
시그모이드 활성화
ReLU (Rectified Linear Unit) 활성화
Tanh (쌍곡 탄젠트) 활성화
Leaky ReLU 활성화
시그모이드 활성화
그림- 시그모이드 활성화 함수.png
그림: 시그모이드 활성화 함수
로지스틱 함수라고도 알려진 시그모이드 함수는 가장 초기부터 사용되었고 가장 널리 알려진 활성화 함수 중 하나입니다. 이는 모든 입력값을 0과 1 사이의 범위로 매핑하여 "S"자 형태의 곡선을 생성합니다. 시그모이드 함수의 공식은 다음과 같습니다:
Sigmoid = σ(x) = 1 / (1 + exp(-x))
다음은 Python에서 시그모이드 함수를 정의하는 코드입니다.
import numpy as np
def sigmoid_function(x):
z = (1/(1 + np.exp(-x)))
return z
시그모이드 함수는 출력을 확률로 예측해야 하는 모델에 유용합니다. 예를 들어, 이진 분류 문제에서는 출력이 0과 1 사이의 확률로 해석되기를 원합니다.
그러나 시그모이드는 기울기 소실 문제가 있습니다. 역전파 중(네트워크가 가중치를 업데이트하며 학습할 때) 시그모이드 기울기가 매우 작아져 더 깊은 층에서 학습이 느려집니다.
소프트맥스 활성화
그림- 소프트맥스 활성화 함수.png
그림: 소프트맥스 활성화 함수
소프트맥스 함수는 다중 클래스 분류 문제에서 신경망의 출력층에 일반적으로 사용됩니다. 이는 실수 벡터를 입력으로 받아 클래스들에 대한 확률 분포로 정규화합니다. 각 출력은 0과 1 사이이며, 모든 출력의 합은 1입니다. 소프트맥스 함수의 공식은 다음과 같습니다:
Softmax(x)=f(xi)= exp(x) / sum(exp(x))
이것을 Python으로 코딩해 보겠습니다.
def softmax_function(x):
z = np.exp(x)
z_ = z/z.sum()
return z_
그러나 Softmax는 특히 대규모 네트워크에서 계산 비용이 클 수 있는데, 모든 출력에 대해 지수를 계산하고 이를 정규화해야 하기 때문입니다.
ReLU (Rectified Linear Unit) 활성화
그림- ReLU 활성화 함수.png
그림: ReLU 활성화 함수
ReLU는 고급 신경망에서 가장 널리 사용되는 활성화 함수 중 하나입니다. 음수 입력에 대해서는 0을 반환하고, 양수 값에 대해서는 그 값 자체를 반환합니다. ReLU 함수의 공식은 다음과 같습니다:
ReLU = f(x) = max(0,x)
다음은 ReLU를 위한 Python 함수입니다:
def relu_function(x):
if x<0:
return 0
else:
return x
ReLU는 특히 컴퓨터 비전 작업에서 신경망의 은닉층에 사용됩니다. 지수 연산이나 나눗셈 연산이 없기 때문에 계산 효율이 높습니다. 시그모이드와 비교하면 기울기 소실 문제의 영향을 덜 받습니다. 그러나 ReLU에는 한 가지 단점이 있는데, 바로 “dying ReLU” 문제입니다. 뉴런이 모든 입력에 대해 지속적으로 0을 출력하면 비활성 상태가 되어 더 이상 학습에 기여할 수 없습니다.
Tanh (쌍곡 탄젠트) 활성화
그림- Tanh 활성화 함수 .png
그림: Tanh 활성화 함수
쌍곡탄젠트 함수는 sigmoid 함수와 유사하지만 -1과 1 사이의 값을 출력합니다. Tanh 함수의 공식은 다음과 같습니다:
tanh(x)= f(x)= 2 / (1+exp (−2x ))−1
또는
tanh(x)= f(x)=2sigmoid(2x)-1
동일한 Python 코드는 다음과 같습니다:
def tanh_function(x):
z = (2/(1 + np.exp(-2*x))) -1
return z
쌍곡탄젠트는 신경망의 은닉층, 특히 자연어 처리 (NLP) 작업에서 사용됩니다. sigmoid 함수와 몇 가지 유사점을 공유하지만, 0을 중심으로 한다는 장점이 있어 특정 네트워크에서 학습 속도를 높일 수 있습니다. 그러나 sigmoid 함수와 마찬가지로 tanh 역시 기울기 소실 문제의 영향을 받습니다.
Leaky ReLU 활성화
그림- Leaky ReLU 활성화 함수 .png
그림: Leaky ReLU 활성화 함수
Leaky Rectified Linear Unit, 또는 Leaky ReLU는 평평한 기울기 대신 음수 값에 대해 작은 기울기를 도입하여 “dying ReLU” 문제를 해결하도록 설계된 ReLU의 변형입니다. 이는 뉴런이 영구적으로 비활성화되는 대신 계속 학습하도록 돕습니다. Leaky ReLU 함수의 공식은 다음과 같습니다:
Leaky ReLU = f(x)=max(αx,x)
여기서 𝛼 α는 음수 입력에 대해 뉴런이 0 대신 작은 음수 값을 출력하도록 보장하는 작은 양의 상수(예: 0.01)입니다. Leaky ReLU는 ReLU의 변형이므로, Python 코드는 약간의 수정으로 구현할 수 있습니다.
def leaky_relu_function(x):
if x<0:
return 0.01*x
else:
return x
비교
활성화 함수에 대해 더 나은 이해를 얻기 위해서는 신경망의 다른 핵심 구성 요소와 비교해 보는 것이 도움이 됩니다:
활성화 함수 vs. 손실 함수
활성화 함수는 네트워크의 뉴런이 들어오는 신호에 어떻게 반응하는지를 정의합니다. 뉴런(또는 층)의 출력에 적용되어 비선형성을 도입하며, 이는 네트워크가 데이터의 패턴과 관계를 이해하는 데 도움이 됩니다.
반면, 손실 함수는 신경망의 예측이 실제 목표 값(정답)과 얼마나 잘 일치하는지를 판단하는 데 사용됩니다. 예측 출력과 실제 결과 사이의 오차를 계산합니다. 또한, Optimization 알고리즘은 학습 중에 네트워크의 가중치를 조정하여 이 오차를 최소화합니다. 손실 함수에는 다음이 포함됩니다:
Mean Squared Error (MSE)는 회귀 작업에 일반적으로 사용됩니다.
Cross-entropy loss는 분류 작업에 사용됩니다.
활성화 함수 vs. 정규화
활성화 함수는 데이터가 한 층에서 다른 층으로 이동하는 방식과 입력에 따라 뉴런이 "발화"하는 방식을 제어합니다.
그러나 Batch normalization과 같은 정규화는 학습을 더 효과적으로 만드는 데 도움이 됩니다. 이는 네트워크 학습 속도를 높이고 기울기 소실 또는 폭주를 방지하기 위해 층에 대한 입력의 분포를 수정하는 방식으로 작동합니다. Batch normalization은 각 층에 대한 입력을 일관된 평균과 분산을 갖도록 정규화하고 네트워크 수렴이 더 쉬워지도록 돕습니다. 다른 정규화 기법에는 다음이 포함됩니다:
Layer normalization: 각 층 전반에 걸쳐 정규화합니다.
Instance normalization: 일반적으로 이미지 처리에서 사용되며, 각 인스턴스를 별도로 정규화합니다.
활성화 함수의 이점과 과제
활성화 함수는 신경망에 여러 가지 이점을 제공하지만, 해결해야 할 과제도 제시합니다. 먼저 활성화 함수의 이점에 대해 논의해 보겠습니다.
비선형성: 활성화 함수의 가장 중요한 이점은 네트워크에 비선형성을 도입한다는 것입니다. 이는 네트워크가 데이터의 비선형 패턴을 포착하는 데 도움이 되며, 이미지 인식 및 자연어 이해와 같은 작업에 이상적입니다.
출력 범위: sigmoid 및 softmax와 같은 활성화 함수는 출력을 특정 범위 내로 제한합니다(sigmoid의 경우 0-1, tanh의 경우 -1과 1 사이). 이를 통해 특히 분류 작업에서 출력을 훨씬 더 쉽게 이해할 수 있습니다.
효율적인 계산: ReLU와 같은 일부 함수는 계산 효율이 높아 네트워크를 확장하고 대규모 데이터셋에 적용할 수 있게 합니다.
이제 활성화 함수의 과제에 대해 논의해 보겠습니다.
기울기 소실 문제: 이는 심층 신경망에서 흔히 발생하며, 주로 sigmoid 및 tanh와 같은 활성화 함수를 사용할 때 나타납니다. 역전파 중에 기울기는 여러 네트워크 계층을 통해 전파되면서 매우 작아질 수 있으며, 이로 인해 네트워크의 수렴이 느려져 효과적인 학습이 어려워집니다.
기울기 폭주: 기울기 폭주는 큰 오류 기울기가 누적되어 학습 과정 중 신경망 모델의 가중치에 매우 큰 업데이트가 발생하는 문제입니다. 이로 인해 모델이 불안정해지고 학습 데이터로부터 학습할 수 없게 됩니다.
함수 선택: 작업 또는 신경망에 최적인 활성화 함수를 선택하는 것은 어려울 수 있으며, 일반적으로 어느 정도의 실험이 필요합니다. 이는 우리가 해결하려는 문제의 유형에 따라 달라집니다.
활성화 함수의 사용 사례
활성화 함수는 다양한 작업을 수행하는 여러 신경망 아키텍처의 중요한 구성 요소입니다. 다음은 몇 가지 주요 응용 분야입니다.
이미지 분류: Convolutional Neural Networks (CNNs)는 픽셀 데이터를 처리하기 위해 은닉층에서 ReLU 활성화를 사용하고, 다중 클래스 분류를 위해 출력층에서 softmax를 사용합니다.
자연어 처리 (NLP): Recurrent Neural Networks (RNNs), Long Short-Term Memory (LSTM), 및 Transformers는 순차 데이터를 처리하기 위해 은닉층에서 tanh 또는 ReLU 활성화를 사용합니다.
생성 모델: Generative Adversarial Networks (GANs)는 일반적으로 생성자 네트워크에서 비선형성을 도입하고 현실적인 출력을 생성하기 위해 ReLU 또는 LeakyReLU를 사용하며, 판별자 네트워크에서는 sigmoid를 사용합니다.
TensorFlow 및 PyTorch를 포함한 여러 딥 러닝 프레임워크는 사용자 지정 함수를 만들 수 있도록 다양한 내장 활성화 함수와 구현을 제공합니다.
활성화 함수에 대한 FAQ
- 활성화 함수란 무엇인가요?
활성화 함수는 신경망이 입력 데이터의 복잡한 패턴을 학습할 수 있도록 해주는 기본 구성 요소입니다. 활성화 함수는 노드(뉴런)의 입력 신호를 출력 신호로 변환하며, 이 출력 신호는 다음 신경망 계층으로 전달됩니다.
- ReLU 활성화 함수는 왜 사용되나요?
ReLU 활성화 함수는 신경망에 비선형성을 도입하여 머신 러닝 모델 학습 중 기울기 소실 문제를 줄이는 데 도움이 됩니다.
- 가장 일반적으로 사용되는 활성화 함수는 무엇인가요?
ReLU, Leaky ReLU, Softmax, 및 Swish는 널리 사용되는 활성화 함수입니다.
- 활성화 함수는 무엇에 사용되나요?
활성화 함수의 주요 목적은 노드에서 합산된 가중 입력을 출력값으로 변환하는 것이며, 이 출력값은 다음 은닉층으로 전달되거나 최종 출력으로 사용됩니다.
- 여러 활성화 함수를 사용할 수 있나요?
네, 신경망의 서로 다른 층에서 서로 다른 활성화 함수를 사용하는 것은 일반적입니다. 예를 들어, 표준 구성에서는 다중 클래스 분류 문제를 위해 은닉층에는 ReLU 활성화를 사용하고 출력층에는 softmax를 사용할 수 있습니다.


