활성화 함수: 딥러닝 기초 시리즈 2

이전 글에서는 퍼셉트론에 대해서 알아 보았습니다.

퍼셉트론을 다룬 글에서도 포함되어 있는 계단함수는 활성화 함수 중에 하나입니다.

이 글에서는 이 활성화함수의 종류에대해 알아보고, 파이썬 코드로 구현해 보겠습니다.


목차

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

참고 문헌 및 참고자료: 밑바닥부터 시작하는 딥러닝


활성화 함수란?

활성화 함수란?

활성화 함수는 인공 뉴런에게 얼마나 활발하게 일해야 할지를 가르쳐줍니다. 예를 들어, 너무 많이 활발하게 일하면 안 되고, 너무 조용하게 있으면 안 됩니다. 활성화 함수는 이런 규칙을 정해주는 역할을 합니다.

인공 신경망은 다양한 문제를 해결하는 데 사용됩니다. 데이터를 이해하고 처리하는 데 도움을 줍니다. 간단히 말하면, 활성화 함수는 인공 뇌의 일부분처럼 동작하여 입력된 정보를 적절하게 처리하고 다음 단계로 전달하는 역할을 합니다.

즉 신호의 총합이 활성화를 일으키는지 결정하는 역할을 합니다.

y=h(a)

  • y는 최종 신호값을 나타냅니다.
  • a는 이전 신호의 결과 또는 퍼셉트론의 출력을 나타냅니다.
  • h( )는 활성화 함수를 나타냅니다. 이 함수는 a를 입력으로 받아서 y를 계산하는 과정을 나타냅니다.

활성화 함수 종류 및 코드 구현

계단함수 (Step Function)

계단함수는 x가 0보다 작을 때는 0을 출력하고, 0보다 크거나 같을 때는 1을 출력하는 함수입니다. 이 함수는 이진 분류 ( 양자 택일 ) 문제에 사용될 수 있으며 간단한 결정을 내리는 함수입니다.

계단함수 (Step Function) 공식과 코드 구현

계단함수의 식은 아래와 같습니다.

h(x)=\left\{\begin{matrix} 0 \ \text{if} \ (x\leqslant 0) \\ 1 \ \text{if} \ (x > 0) \end{matrix}\right.

코드로 구현하면 아래와 같습니다.

Python
import numpy as np
import matplotlib.pyplot as plt

def step_f(x):
    return 1 if x > 0 else 0

x = np.arange(-5, 5, 0.1)

# 각 요소에 대한 함수를 계산하여 결과를 변수에 저장
y = np.array([step_f(val) for val in x])

# 그래프 그려주는 코드
plt.plot(x, y)
plt.title('Step Function')
plt.xlabel('Input (x)')
plt.ylabel('Output (y)')
plt.show()
활성화 함수: 계단함수 그래프

그래프를 그려보면 위와같이 나오게 됩니다.

시그모이드 함수 (Sigmoid Function)

시그모이드 함수(Sigmoid Function)는 비선형 활성화 함수 중 하나로, 그래프가 S 모양을 갖는 함수입니다. 주로 이진 분류(binary classification) 문제에서 사용되며, 입력값을 확률값으로 변환하는 데에 널리 사용됩니다. 시그모이드 함수의 일반적인 수식은 다음과 같습니다

시그모이드 함수는 항상 0과 1 사이의 값을 출력합니다. 따라서 출력값은 확률로 해석될 수 있습니다. 계단함수와 같이가장 일반적으로 이진 분류 문제에서 사용됩니다. 모델의 출력을 확률로 변환하여 어떤 클래스에 속할 확률을 예측합니다.

계단함수와 비슷하게 그래프는 0과 1사이의 값을 가지며 S 곡선을 이루기 때문에 시그모이드라는 이름이 붙었습니다.

시그모이드 함수는 입력이 크거나 작을 때 미분 값이 매우 작아질 수 있어, 역전파(backpropagation) 과정에서 그래디언트 소실 문제가 발생할 수 있습니다. 이 문제는 렐루와 같은 다른 활성화 함수를 사용하여 완화할 수 있습니다.

딥러닝에서의 미분:

딥러닝의 최적화 과정은 주로 산에서 내려가는 것과 비교합니다.
여기서 산은 손실 함수의 공간입니다. 손실 함수는 모델의 예측이 얼마나 나쁜지를 나타냅니다.
여기서 사용되는 미분값은 산 그래프에서의 기울기값, 즉 얼마나 가파른가를 알려주는 척도입니다.

더 정확하게, 미분을 통해 어떤 방향으로 가야 손실을 최소화할 수 있는지 알아내고, 그 방향으로 조금씩 내려갑니다.

손실 함수의 공간에서 가장 낮은 지점(최적점)을 찾아가는 것은 딥러닝 모델의 학습 목표입니다.
그래디언트 소실 문제(Gradient Vanishing Problem):
역전파 과정에서, 모델의 가중치(weight)를 업데이트하기 위해 그래디언트(기울기)를 계산하는데, 이때 시그모이드 함수가 사용되면 문제가 발생할 수 있습니다.

시그모이드 함수는 입력값이 크거나 작을 때, 함수의 그래디언트가 매우 작아집니다. 예를 들어, 시그모이드 함수의 그래프를 보면 입력이 매우 크거나 작을 때, 그래프의 기울기가 거의 0에 가까워집니다. 이것은 역전파 과정에서 그래디언트를 전파할 때, 이 작은 그래디언트가 이전 레이어로 거의 전달되지 않는다는 것을 의미합니다. 그 결과 뉴런 층이 깊을수록 신호값이 옅어져 거의 사라지게 됩니다.

시그모이드 함수 (Sigmoid Function) 공식과 코드 구현

시그모이드 공식은 아래와 같습니다.

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

이제 파이썬 코드로 한번 구현해 봅시다.

Python
import numpy as np
import matplotlib.pyplot as plt

def sigmoid(x):
    return 1/(1+np.exp(-x))

x = np.arange(-20, 20, 0.1)

# 각 요소에 대한 함수를 계산하여 결과를 변수에 저장
y = np.array([sigmoid(val) for val in x])

# 그래프 그려주는 코드
plt.plot(x, y)
plt.title('sigmoid')
plt.xlabel('Input (x)')
plt.ylabel('Output (y)')
plt.show()
활성화 함수: 시그모이드 함수 그래프

위의 결과 그래프를 보면 알 수 있듯이 계단함수의 출력값과 비슷하게 출력은 0과 1사이의 값을 가지며 x의 값이 너무 커지거나, 너무 작아질때 기울기 값이 0에 가까워 지는 것을 알 수 있습니다.

렐루 함수 (Rectified Linear Unit, ReLU)

ReLU함수는 입력값 x의 값이 0이하일때는0을 출력하고, 0이상일때는 자기 자신을 그대로 출력합니다.

  1. 비선형성(Non-linearity): ReLU 함수는 비선형성을 가지고 있어서 딥러닝 모델이 다양한 함수를 근사할 수 있도록 도와줍니다. 이것은 모델이 복잡한 데이터 패턴을 학습하는 데 중요합니다.
  2. 그래디언트 소실 방지: ReLU 함수는 입력이 양수인 경우, 그래디언트를 적절하게 전달합니다. 이로써 역전파 과정에서 그래디언트 소실 문제를 완화시킵니다.
  3. 계산 효율성: 계산상의 효율성을 가지고 있어 빠른 학습을 가능하게 합니다.

하지만 ReLU 함수의 주요 단점은 입력값이 음수인 경우, 그래디언트가 0이 되기 때문에 해당 뉴런은 학습 과정에서 업데이트되지 않을 수 있습니다. 이것을 “죽은 렐루(dying ReLU)”라고 부르며, 이를 해결하기 위해 변형된 활성화 함수인 Leaky ReLU와 Parametric ReLU가 등장하기도 합니다.

렐루 함수 (Rectified Linear Unit, ReLU) 공식과 코드 구현

기본 렐루 함수의 공식은 다음과 같이 표현됩니다.

h(x)=max(0,x)

코드를 살펴 봅시다.

Python
import numpy as np
import matplotlib.pyplot as plt

def ReLU(x):
    return x if x > 0 else 0

x = np.arange(-20, 20, 0.1)

# 각 요소에 대한 함수를 계산하여 결과를 변수에 저장
y = np.array([ReLU(val) for val in x])

# 그래프 그려주는 코드
plt.plot(x, y)
plt.title('ReLU')
plt.xlabel('Input (x)')
plt.ylabel('Output (y)')
plt.show()
활성화 함수: 렐루 함수 그래프

그래프를 그려보면 위와같이 나오게 됩니다.

소프트맥스 함수 (Softmax Function)

소프트맥스 함수는 주로 다중 클래스 분류(classification) 문제에서 출력 레이어에서 사용됩니다. 소프트맥스 함수는 입력값을 0과 1 사이의 확률로 변환하며, 이 확률 값은 다중 클래스 중 어떤 클래스에 속할 확률을 나타냅니다.

소프트맥스 함수의 주요 특징은 입력값을 확률 분포로 변환하며, 이 확률 분포는 모든 클래스에 대한 확률의 합이 1이 됩니다. 이것은 다중 클래스 분류에서 클래스를 선택하는 데 사용됩니다.

예를 들어 10지선다의 문제가 있다면 10개중에 가장 답이 될 확률이 높은 것을 확률로 예측 합니다. 또한 모든 요소들의 나올 확률을 더하면 최종 적으로 1이 됩니다.

소프트맥스 함수 (Softmax Function)공식과 코드구현

input \ x = (x_1, x_2, x_3 ... x_k) h(x_1)= \frac{e^{x_1}}{e^{x_1}+e^{x_2}+e^{x_3}+...e^{x_k}}

즉 일반식으로 표현하면 h(x_i)= \frac{e^{x_i}}{\sum_{k=1}^{n} e^{x_k}}

코드로 구현해 보자면 아래와 같습니다.

Python
import numpy as np
import matplotlib.pyplot as plt

def softmax(x):
    #exp_sum = np.sum(np.fromiter((np.exp(val) for val in x), dtype=np.float32)) 한줄로 된 코드
    exp_sum = 0
    for x_k in x:
        exp_sum += np.exp(x_k)

    return np.exp(x)/exp_sum

x = np.random.randint(0,10,size=10)
print("랜덤으로 배열이 된 x 입력값:",x)

# 출력 포맷 설정
np.set_printoptions(precision=2, suppress=True)

y = softmax(x)
print("y값: ",y)
print("모든 요소들의 합",sum(y))

결과는 아래와 같이 나왔습니다.

Python
랜덤으로 배열이 된 x 입력값: [9 5 1 2 0 9 1 8 3 3]
y값:  [0.42 0.01 0.   0.   0.   0.42 0.   0.15 0.   0.  ]
모든 요소들의 합 1.0

결론

“이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.”

이 글에서는 활성화 함수에 대한 설명과 각 활성화 함수의 종류에 대한 코드 구현을 다뤘습니다.

활성화 함수는 인공 뉴런의 동작을 결정하는 중요한 역할을 합니다. 이 함수들은 뉴런이 얼마나 활발하게 일할지를 조절하며, 딥러닝 모델이 다양한 문제를 해결하는 데 도움을 줍니다.

계단 함수(Step Function)는 이진 분류 문제에 사용되며, 입력값이 0보다 작을 때는 0을 출력하고, 0보다 크거나 같을 때는 1을 출력합니다.

시그모이드 함수(Sigmoid Function)는 주로 이진 분류 문제에서 사용되며, 입력값을 확률값으로 변환합니다. 하지만 그래디언트 소실 문제가 발생할 수 있으므로 주의가 필요합니다.

렐루 함수(ReLU)는 비선형성을 가지며, 다중 클래스 분류 문제에 주로 사용됩니다. 이 함수는 입력값이 양수인 경우에는 그래디언트를 적절하게 전달하여 그래디언트 소실 문제를 완화시킵니다.

소프트맥스 함수(Softmax Function)는 다중 클래스 분류 문제에서 출력 레이어에서 사용되며, 입력값을 확률 분포로 변환합니다. 이 함수는 모든 클래스에 대한 확률의 합이 1이 되도록 만들어주므로 다중 클래스 분류에서 클래스를 선택하는 데 사용됩니다.

딥러닝에서의 미분은 최적화 과정을 통해 손실을 최소화하는 역할을 합니다. 그래디언트는 손실 함수의 기울기를 나타내며, 이를 통해 모델의 가중치를 업데이트하여 최적화를 수행합니다.

그래디언트 소실 문제는 시그모이드 함수와 같은 활성화 함수를 사용할 때 발생할 수 있으며, 이 문제는 렐루와 같은 다른 활성화 함수를 사용하여 해결할 수 있습니다.

딥러닝은 데이터를 이해하고 처리하는 데 도움을 주는 강력한 도구이며, 활성화 함수는 이러한 모델의 핵심 구성 요소 중 하나입니다. 각 활성화 함수의 특징과 용도를 이해하고 적절히 선택하는 것은 딥러닝 모델을 효과적으로 구성하는 데 중요합니다.

5 thoughts on “활성화 함수: 딥러닝 기초 시리즈 2”

Leave a Comment