인공지능 관련

활성화 함수(activation function) 종류와 정리

PGNV 2021. 5. 6. 11:45

활성화 함수(activation function)

다양한 뉴런에서 데이터를 연산하고 다음 뉴런로 값을 전달해주며, 이 데이터들을 연산하면서 정리해주는 함수

입력 받은 신호를 얼마나 출력할지 결정하고 Network에 층에 쌓아 비선형성(non-linear)을 표현 할 수 있도록 해줌

※활성화 함수를 이용하여 비선형 시스템인 MLP(Multiple Layer Perceptron)를 이용하여, XOR은 해결했지만, 파라미터 개수가 점점 많아지면서 각각의 가중치(weight)와 편향(bias)를 학습시키는 것이 매우 어려워 다시 한 번 침체기를 겪게 됨.

하지만 역전파(Back Propagation)으로 해결함

 

 

 

 

 

 

 

 

 

 

계단함수 (Step function) 

import numpy as np
import matplotlib.pyplot as plt

def step_function(x, threshold=0):
  return np.where(x<= threshold, 0, 1)

x = np.linspace(-5, 5)
y = step_function(x, threshold=0.5)
plt.plot(x,y)
plt.title("Step Function")

계단함수 (Step function) : 이진 분류를 나타내는 함수로 1아니면 0을 출력

 

장점

1) 단순한 구조

 

단점

1) 다중 출력이 불가능

2) 합산된 값이 0.1이든 1.0이든 모두 무시하고 1로 전달하므로 출력되는 결과값이 너무 희석됨

 

 

사용하는곳 - 퍼셉트론

 

 

 

 

 

 

 

 

 

 

시그모이드(Sigmoid)함수

import numpy as np
import matplotlib.pyplot as plt

def sigmoid_function(x):
  return 1/(1+np.exp(-x))
sigmoid_y = sigmoid_function(x)
plt.plot(x, sigmoid_y)
plt.title("Sigmoid Function")

시그모이드(Sigmoid) : 여러 뉴런에서 들어온 신호 세기를 모아서 그 값이 0보다 클수록 1에 가까운 숫자로 바꿔 주고, 반대로 신호 세기가 0보다 작을 수 록 0에 가까운 숫자로 바꾸어 주는 특징을 가진 활성화 함수

※0~1까지의 비선형 형태로 변경하기 위한 함수

※딥러닝 실무에서는 기울기 소실(Gradient vanishing) 떄문에 사용하지 않지만 입문 과정에 꼭 다루는 함수

 

장점

1) 뇌의 뉴런과 유사함

2)출력 값의 범위가 0~1사이고, 매우 매끄러운 곡성 가지며, 기울기가 급격하게 변해서 발생하는 기울기 폭주(Gradient Exploding)이 발생하지 않음

3)어느 분류에  속하는지 쉽게 알 수 있다.

 

단점

1) 아무리 큰 값이 들어와도 0~1사이 값만 반환함(일정한 비율로 줄어들어 값의 왜곡이라 할수 없으나 현저하게 줄어듬)

2) 출력 값이 중앙값이 0이 아닌 0.5이며, 모두 양수기 때문에 출력의 가중치 합이 입력의 가중치 합보다 커짐 (편향 이동)

3) 신호가 각레이어를 통과할 때마다 분산이 계속 커지게 되어, 활성화 함수의 출력이 최댓값과 최솟값인 0과 1에 수렴

4) 위에 보이는게 시그모이드 함수의 도함수인데 함수의 값이 0이나 1에 가까울수록 출력되는 값이 0에 가까워진다.

(0에 가까워지면 신경망이 잘 학습하지 못하는 한계점이 있음)

5) 4번의 이유 떄문에 뉴런의 기울기(Grandient) 값이 0이 되고, 역전파 시 0이 곱해져서 기울기 소실(Gradient vanishing)

(역전파가 진행될수록 아래층에 아무런 신호가 전달되지 않음)

6) 5번이유 때문에 모델의 깊이가 깊을 수록 기울기 소실(Gradient vanishing)이 일어나서 학습이 잘 되지 않음

7) 은닉층에는 선형함수와 시그모이드(Sigmoid)함수를 사용하지 않는게 좋다

8) 출력값이 모두 양수기 때문에 경사하강법을 진행할 때, 기울기가 모두 양수거나 음수가 된다.

(결과로 기울기 업데이트가 지그재그로 변동하는 결과를 가지고 오게되어 학습 효율성을 감소시켜 학습에 더 많은 시간이 들어감)

9) 출력값이 너무 작아 제대로 학습이 안되는데다가 시간도 많이 잡아 먹음

 

 

 

 

사용하는곳 - 신경망, 로지스틱 회귀, 분류 문제의 가설과 비용함수,  반환 값은 확률형태이기 때문에 결과 확률 해석, 이진 분류를 하고자하는 경우 출력층에만 사용

 

 

 

 

 

 

 

 

 

 

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

import numpy as np
import matplotlib.pyplot as plt

def tanh_function(x):
  return np.tanh(x)

tanh_y = tanh_function(x)
plt.plot(x, tanh_y)
plt.title("Hyperbolic Tangent")

하이퍼볼릭탄젠트(Tanh, Hyperbolic Tangent) : 시그모이드(Sigmoid) 함수의 함계점을 보완하고, 크기와 위치를 조절한 함수

※-1~1사이의 비선형 형태로 변경하기 위한 함수

 

장점

1) 중앙값이 0(Zero-centered)이기 때문에, 경사하강법 사용시 편향 이동이 일어나지 않음

2) 출력값(Output layer) 데이터의 평균이 0으로써 시그모이드(Sigmoid) 보다 대부분의 경우에서 학습이 더 잘됨

3) 기울기가 양수, 음수 모두 나올 수 있기 때문에 시그모이드 함수보다 학습 효율성이 좋다

4) 시그모이드 함수보다 범위가 넓기 때문에 출력값의 변화 폭이 더 크고, 기울기 소실(Gradient vanishing) 증상이 더 적다

5) 은닉층에서 레이어를 쌓을때, 시그모이드 함수보다 하이퍼볼릭 탄젠트가 효율적이다.

 

단점

1) 여전히 기울기소실(Gradient Vanishing) 현상이 일어남

2) 은닉층에 사용될 때, 여전히 조심해야할 함수

 

사용하는곳 - 시그모이드함수와 비슷한곳에 사용

 

 

 

 

렐루(Rectified Linear Unit, ReLU) 함수

import numpy as np
import matplotlib.pyplot as plt


def relu_function(x):
  return np.where(x <= 0, 0, x)

relu_y = relu_function(x)
plt.plot(x, relu_y)
plt.title("Telu Function")

 

렐루(Rectified Linear Unit, ReLU) : 입력이 0이상이면 입력을 그대로 출력하고, 0 이하이면 0을 출력하는 함수

 

 

장점

1) 다른 활성화 함수보다 학습이 빠르다. (tanh함수 대비 6배 빠른 학습속도)

2) 기울기 소실(Gradient Vanishing)문제가 발생하지 않음 (은닉층에 많이 사용되는 이유)

3) 학습을 느리게하는 원인이 기울기(gradient) 0이 되는 것을 막아줌

4) 가중치 업데이트 속도가 매우 빠르다

5) 가장 많이 사용하는 활성화 함수(activation function)

 

단점

1) 음수 값을 입력 받으면 항상 0으로 반환

2) 입력값이 음수인 경우 기울기가 0이 되어 가중치 업데이트가 안될 수 있음

(가중치가 업데이트 되는 과정에서 가중치 합이 음수가 되면 0만 반환되면 아무것도 변하지 않는 현상 발생)

3) 2번 현상을 죽은 뉴런(Dead Neuron) 또는 죽어가는 렐루(Dying ReLU) 이라고 함

4) 출력값은 0 또는 양수이고, 기울기도 0 또는 1인 양수이다. (최적의 가중치를 찾는 지그재그 현상 발생)

5) 0에서 미분이 안됨

 

사용하는곳 - 은닉층(Hidden layer) 활성화 함수 사용

 

 

 

 

 

 

 

리키렐루(Leaky ReLu) 함수

import numpy as np
import matplotlib.pyplot as plt

def leaky_relu_function(x):
  return np.where(x <= 0, x*0.01, x)
leak_relu_y = leaky_relu_function(x)
plt.plot(x, leak_relu_y)
plt.title("Leaky Relu Function")

 

리키렐루(Leaky ReLu) : 렐루(ReLu)와 거의 비슷하지만 차이점은 가중치 곱의 합이 0보다 작을 때 값도 약간 고려함

 

장점

1) 층이 아무리 깊어져도 손실없는 정보 전달가능, 미분값이 항상 0과 1이기 때문에 연산이 빠름

2) 음수일 경우 기울기가 0이 아닌 0.01값을 갖게 된다. (Dying ReLU현상을 막음)

3) leaky ReLU를 일반적으로 많이 쓰이지 않지만 ReLU보다 학습이 잘됨

 

단점

1) 음수에서 선형성이 생기고, 복잡한 분류에서 사용할 수 없음

2) 일부 사례에서 하이퍼볼릭탄젠트(Tanh, Hyperbolic Tangent)함수, 시그모이드(Sigmoid) 함수보다 성능 안좋다는 이야기가 있음

 

사용하는곳 - 음수가 아주 중요한 상황에 사용

 

 

 

소프트맥스(Softmax) : 세 개 이상으로 분류하는 다중 클래스 분류에서 출력층에 사용되는 활성화 함수

※모델의 출력을 확률로 해석할 수 있게 변환해주는 연산

※입력된 여러 값을 0~1사이의 값으로 모두 정규화하며 출력하는 합수입니다. 그리고 그 출력값들의 합은 항상 1이 되는 특징이 있습니다. 그래서 분류 문제에서 어떤 범주를 가장 높은 확률로 예측하는지 살펴보는데 주로 사용됩니다.

 

EX) 남자와 여자 분류하는 문제에서 남자는 0.4 여자는 0.6 총합은 1 이면 남자일 확률 40% 여자일 확률 60퍼 라고

인공지능 모델이 판단(기준이 명확해져서 판단하기 수월함)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

사용되는 층 활성화 함수 용도
은닉층 렐루(ReLu) 기울기 소실 문제를 줄이고
다음 층으로 신호 전달
리키 렐루(Leaky ReLU)
출력층 시그모이드(Sigmoid) 이진 분류
소프트맥스(SoftMax) 다중 분류
활성화 함수 사용X 회귀

 

 

 

 

'인공지능 관련' 카테고리의 다른 글

인공지능 개발 환경 만들기  (0) 2021.05.18
결정 트리  (0) 2021.05.12
Scikit-learn 용어 정리  (0) 2021.05.06
ReLu 함수 시각화  (0) 2021.04.29
sigmoid함수 시각화  (0) 2021.04.29