컴퓨터 공학 분야 별 지식/딥러닝 및 머신러닝

[AI, 딥러닝] 활성화 함수(Activation Function) 정리

N돌핀 2022. 7. 13. 01:40

활성화 함수 정리(Activation Function)

계단함수

퍼셉트론에서 출력값이 0이 될지, 1이 될지를 결정해주었던 함수

  • 계단함수는 활성화 함수들 중 한 종류

활성화 함수의 특징

비선형

선형 함수는 출력이 입력의 상수배만큼 변하는 함수. 시각화하면 직선이 됨

비선형 함수는 직선으로 그릴 수 없는 함수.

활성화 함수에서 비선형 함수를 쓰는 이유는 선형 함수의 경우 아무리 층을 많이 쌓아도 결국 곱해진 각층에서 곱해진 가중치들을 모두 묶어 하나의 가중치라 생각해버리면 1회짜리가 되어버리기 때문

  • 선형 함수 층의 사용

비선형 층들과 함께 인공 신경망의 일부로 추가하면 학습 가능한 가중치가 새로 생기는 의미를 가짐

주로 선형층, 투사층 등으로 부름

활성화 함수의 종류

(1) 계단함수(Step Function)

import numpy as np
import matplotlib.pyplot as plt

# 계단 함수
def step(x):
    return np.array(x > 0, dtype=np.int)
x = np.arange(-5.0, 5.0, 0.1) # -5.0부터 5.0까지 0.1 간격 생성
y = step(x)
plt.title('Step Function')
plt.plot(x,y)
plt.show()

(2) 시그모이드 함수(Sigmoid Function)

# 시그모이드 함수
def sigmoid(x):
    return 1/(1+np.exp(-x))

x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)

plt.plot(x, y)
plt.plot([0,0],[1.0,0.0], ':') # 가운데 점선 추가
plt.title('Sigmoid Function')
plt.show()
  • 인공 신경망의 학습 과정
  1. 입력에 대해 순전파 연산
  2. 순전파 연산을 통해 나온 예측값과 실제값의 오차를 손실 함수를 통해 계산
  3. 손실을 미분을 통해서 기울기를 구함
  4. 기울기를 이용해 출력층에서 입력층 방향으로 가중치와 편향을 업데이트하는 역전파 수행

기울기 소실 문제(Vanishing Gradient)

현재 그래프의 미분 최대값이 0.25임

시그모이드 함수를 활성화 함수로 여러 층을 쌓으면 0에 가까운 값이 누적해서 곱해지므로 앞단에 기울기가 거의 전달되지 않고 매개변수 w가 업데이트 되지 않음

  • 순전파(foward propagation): 입력층에서 은닉층 방향으로 이동하는 것
  • 역전파(back propagation): input과 output 값을 알고 있는 상태에서 신경망을 학습시키는 것

지도학습에서 쓰임. 오차를 보정하는 것을 말한다. 경사 하강법 이용

(3) 하이퍼볼릭탄젠트 함수(Hyperbolic tangent function)

# tanh
x = np.arange(-5.0, 5.0, 0.1) # -5.0부터 5.0까지 0.1 간격 생성
y = np.tanh(x)

plt.plot(x, y)
plt.plot([0,0],[1.0,-1.0], ':')
plt.axhline(y=0, color='orange', linestyle='--')
plt.title('Tanh Function')
plt.show()

시그모이드 함수가 -1~1까지로 확장된것과 비슷하다.

기울기 소실 현상이 줄지만 여전히 문제가 남아있다.

(4) 렐루 함수(ReLU)

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

x = np.arange(-5.0, 5.0, 0.1)
y = relu(x)

plt.plot(x, y)
plt.plot([0,0],[5.0,0.0], ':')
plt.title('Relu Function')
plt.show()

수식: f(x) = max(0, x)

음수를 입력하면 0, 양수를 입력하면 입력값을 그대로 반환

  • 특징
  1. 특정 양수값에 수렴하지 않고 미분값도 1이라 시그모이드보다 깊은 은닉층에서 잘 작동
  2. 단순 임계값이므로 연산 속도도 빠름
  • 죽은 렐루

입력값이 음수면 미분값이 0 이됨. 이 뉴런은 다시 회생하는 것이 매우 어려움

(5) 리키 렐루(Leaky ReLU)

a = 0.1

def leaky_relu(x):
    return np.maximum(a*x, x)

x = np.arange(-5.0, 5.0, 0.1)
y = leaky_relu(x)

plt.plot(x, y)
plt.plot([0,0],[5.0,0.0], ':')
plt.title('Leaky ReLU Function')
plt.show()

음수일 경우 매우 작은 값(a)을 기울기로 반환하도록 하여 마치 새는(leaky)효과를 줌

음수가 되더라도 ReLU가 죽지 않음.

(6) 소프트맥스 함수(Softamx function)

x = np.arange(-5.0, 5.0, 0.1) # -5.0부터 5.0까지 0.1 간격 생성
y = np.exp(x) / np.sum(np.exp(x))

plt.plot(x, y)
plt.title('Softmax Function')
plt.show()

은닉층에서는 ReLU종류의 함수들을 사용하는 것이 일반적.

소프트 맥스 함수는 출력층에서 시그모이드 대신 사용됨

이진분류 → 시그모이드 함수 → 로지스틱 회귀

다중 클래스 분류 (세 가지 이상의 선택지 중 고름) → 소프트맥스 함수 → 소프트맥스 회귀

 

참고 및 더 자세한 설명: https://wikidocs.net/24987