대학원 일기

[딥러닝과 신경망] 활성화 함수(Activation function) 본문

Computer vision/딥러닝 공부

[딥러닝과 신경망] 활성화 함수(Activation function)

대학원생(노예) 2023. 10. 17. 01:21

활성화 함수(Activation function)

활성화 함수는 인공 신경망의 노드에서 가중 합을 계산한 후, 그 결과를 출력으로 변환하는 함수이다. 활성화 함수는 인공신경망의 비선형성을 부여하며 이를 통해 다양한 패턴을 학습할 수 있다.

활성화 함수의 주요 역할

  • 비선형성 부여: 입력과 출력 간의 비선형 관계를 도입한다. 비선형성을 통해 신경망은 다양한 복잡한 문제를 해결할 수 있다.
  • 출력 범위 제한: 활성화 함수는 뉴런의 출력 범위를 제한한다. 
  • 기울기 전파: 비선형 활성화 함수가 사용되면 역전파(backpropagation) 알고리즘을 통해 신경망을 학습할 때 미분 가능한 함수를 사용하고, 오차를 통해 효과적으로 전파하고 가중치를 조정한다.

좋은 활성화 함수의 조건

  • 희소성(sparsity)을 증가시켜 데이터의 변별력을 높이는 함수
  • 학습변수(파라미터)가 전구간에서 미분 가능한 함수
  • 각 학습변수로 미분할 때 가능하면 모든 영역에서 0이 되지 않는 함수 (경사 소멸 방지)

 

활성화 함수의 종류는 다양하며 각 함수마다 특정 역할을 수행한다. 일반적으로 사용되는 활성화 함수는 다음과 같다. 

 

시그모이드 함수 (Sigmoid): 

  • S자 형태의 곡선을 가진다.
  • 입력을 0과 1 사이의 값으로 압축한다.
  • 이진 분류 문제에서 주로 사용되었으며, 출력은 확률로 해석할 수 있다.
  • 단점: 기울기 소실 문제(Vanishing Gradient Problem)가 있어, 깊은 신경망에서 사용하기 어렵다.

$$ S(x) = \frac{1}{1+e^{-x}} $$

import numpy as np

def sigmoid(x): # sigmoid activation function
    return 1 / (1 + np.exp(-x))
    
def sigmoid_derivative(x): # sigmoid derivative
    return sigmoid(x) * (1 - sigmoid(x))

 

 하이퍼볼릭 탄젠트 함수 (Tanh):

  • S자 형태의 곡선을 가진다.
  • 입력을 -1과 1 사이의 값으로 압축한다.
  • 시그모이드 함수와 유사하지만, 평균이 0이므로 출력 범위가 0을 중심으로 대칭적이다.
  • 순환 신경망(RNN)에서 사용될 때, 그래디언트 소실 문제를 완화할 수 있다.

$$ tanh(x) = \frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} $$

import numpy as np

def tanh(x): # hyperbolic tan activation function
    return np.tanh(x)
    
def tanh_derivative(x): # hyperbolic tan derivative
    return 1 - np.tanh(x)**2

 

렐루 함수 (ReLU - Rectified Linear Unit):

  • 입력이 양수인 경우, 입력을 그대로 출력하고, 음수인 경우 0을 출력한다.
  • 연산이 비선형이며, 계산이 간단하므로 현재 가장 많이 사용되는 활성화 함수 중 하나이다.
  • 그래디언트 소실 문제를 완화하고, 더 빠른 수렴을 가능하게 한다.
  • 단점: 입력이 음수인 경우, 해당 뉴런이 죽을 수 있으며 이를 개선한 변형 함수도 사용된다.

$$ f(x) = max(0, x) $$

import numpy as np

def relu(x):
    return np.maximum(0, x)

def relu_derivative(x):
    return np.where(x > 0, 1, 0)

 

리키 렐루 함수 (Leaky ReLU):

  • 음수 입력에 대한 작은 기울기를 제공하여, 죽은 렐루 문제를 완화한다.
  • ReLU의 장점을 유지하면서, 음수 입력에 대한 더 나은 대응을 한다.

$$ f(x) = x, if x > 0,  else  f(x) = αx $$ (α는 작은 양수 상수)

import numpy as np

def leaky_relu(x, alpha=0.01):  # Alpha는 일반적으로 작은 수
    return np.maximum(alpha * x, x)
    
def leaky_relu_derivative(x, alpha=0.01):
    return np.where(x > 0, 1, alpha)

 

맥스아웃 함수 (Maxout):

  • 두 개 이상의 선형 함수를 비교하여 최댓값을 출력한다.
  • 복잡한 비선형성을 표현할 수 있으며, 다양한 패턴을 학습할 수 있다.
  • 하지만 다른 활성화 함수에 비해 계산 비용이 높다.

$$ f(x) = max(w1x + b1, w2x + b2) $$

import numpy as np

def maxout(x1, x2):
    return np.maximum(x1, x2)
    
def leaky_relu_derivative(x, alpha=0.01):
    return np.where(x > 0, 1, alpha)

 

위 같은 활성화 함수 이외에도 분류기(classfier)라고 불리는 소프트맥스(softmax)가 있다.

소프트맥스(Softmax) 활성화 함수

소프트맥스 함수는 다중 클래스 분류 문제에서 주로 사용되며, 다중 클래스 확률 분포를 생성한다. 즉, 모델의 출력을 다중 클래스 확률 분포로 변환하는데 사용된다. 소프트맥스 함수는 주로 출력 레이어에서 사용된다. 출력값은 항상 0과 1 사이의 값을 가지며 출력값을 모두 합하면 1이 된다. 

$$ softmax(z)_{k} = \frac{e^{z_{k}}}{\sum_{i=1}^{n}e^{z_{i}}} $$

import numpy as np

def softmax(x):
    e_x = np.exp(x - np.max(x))  # 오버플로우 방지를 위해 최대값을 빼줍니다.
    return e_x / e_x.sum(axis=0)

 

Comments