조금씩 꾸준히 완성을 향해

[DeepLearning] 활성화 함수(Activation Function) +코드 구현 (Sigmoid, ReLU, LeakyReLu, Elu, tanh, Softmax 등) 본문

AI/Deep Learning

[DeepLearning] 활성화 함수(Activation Function) +코드 구현 (Sigmoid, ReLU, LeakyReLu, Elu, tanh, Softmax 등)

all_sound 2022. 11. 13. 19:11

활성화 함수(Activation Function)

  • 입력 신호의 총합을 출력 신호로 변환하는 함수
  • 활성화 함수에 따라 출력값이 결정
  • 단층, 다층 퍼셉트론 모두 사용
  • 대표적인 활성화 함수
    • Sigmoid
    • ReLU
    • tanh
    • Identity Function
    • Softmax
  • 하나의 layer에서 다음 layer로 넘어갈 때는 항상 활성화 함수를 통과
  • [참고] 여러가지 활성화 함수
    https://en.wikipedia.org/wiki/Activation_function

 

Step Function(계단 함수)

def step_func(x):
  if x > 0 :
    return 1
  else:
    return 0
def step_func_for_numpy(x):
  y = x > 0
  return y.astype(np.int)
print(step_func(-3))  # 0
print(step_func(5))  # 1

a = np.array([5,3,-4, 2.0])
print(step_func_for_numpy(a))  # [1 1 0 1]

 

Sigmoid Function(시그모이드 함수)

  • 이진분류(binary classification)에 주로 사용
    • 마지막 출력층의 활성화 함수로 사용
  • 출력값이 0~1 의 값이며, 이는 확률로 표현 가능

def sigmoid(x):
  return 1 / (1 + np.exp(-x))
  
print(sigmoid(3))
print(sigmoid(-3))
# 0.9525741268224334
# 0.04742587317756678

 

시그모이드 함수와 계단 함수 비교

  • 공통점
    • 출력값이 0~1 내의 범위
    • 입력값의 정도에 따라 출력값의 정도가 달라짐 즉, 입력이 중요하면(입력값이 크면) 큰 값을 출력
  • 차이점
    계단함수에 비해 시그모이드 함수는
    • 입력에 따라 출력이 연속적으로 변화
    • 출력이 '매끄러움'
      이는 모든 점에서 미분 가능함을 의미
plt.grid()
x = np.arange(-5.0, 5.0, 0.01)
y1 = sigmoid(x)
y2 = step_func_for_numpy(x)
plt.plot(x, y1, 'r-', x, y2, 'b--')
plt.legend(['sigmoid', 'step_function'])
plt.show()

ReLU(Rectified Linear Unit)

  • 가장 많이 쓰이는 함수 중 하나

def ReLU(x):
  if x > 0:
    return x
  else:
    return 0
    
print(ReLU(5))  # 5
print(ReLU(-3))  # 0

 

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

def tanh(x):
  return (np.exp(x) - np.exp(-x)) / (np.exp(x)+ np.exp(-x))
  
print(tanh(3))
print(tanh(-3))
# 0.9950547536867306
# -0.9950547536867306
  • sigmoid vs tanh
plt.grid()
x = np.arange(-5.0, 5.0, 0.01)
y1 = sigmoid(x)
y2 = tanh(x)
plt.plot(x, y1, 'r-', x, y2, 'b--')
plt.legend(['sigmoid', 'tanh'])
plt.show()

 

Identity Function(항등 함수)

  • 회귀(Regression) 문제에서 주로 사용
    • 출력층의 활성화 함수로 활용
  • y=x
  • 입력값 그대로 출력하기 때문에 굳이 정의할 필요는 없지만
    신경망 중간 레이어 흐름과 통일하기 위해 사용

def identify(x):
  return x
  
print(identify(4))  # 4
print(identify(-1))  # -1

X = np.array([2, -3, 0.4])
print(identify(X))  # [ 2.  -3.   0.4]

 

Softmax

  • 다중 클래스 분류에 사용(Multi Class Classification)
  • 입력값의 영향을 크게 받음
    입력값이 크면 출력값도 큼
  • 출력값을 확률에 대응가능
  • 출력값의 총합은 1

def softmax(a):
  exp_a = np.exp(a)
  sum_exp_a = np.sum(exp_a)
  y = exp_a / sum_exp_a
  return y
a = np.array([0.3, 0.2, 4.0, -1.2])
print(softmax(a))
print(np.sum(softmax(a))) # softmax 값의 합은 1
plt.grid()
x = np.arange(-7, 7, 0.01)
y1 = softmax(x)
plt.plot(x, y1, 'r-')
plt.legend(['softmax'])
plt.show()

소프트맥스 함수 주의점

  • 오버플로우(overflow) 문제
  • 지수함수(exponential function)을 사용하기 때문에
    입력값이 너무 크면 무한대(inf)가 반환됨
  • 개선한 수식

A = np.array([1000, 900, 1050, 500])
print(softmax(A))  #softmax 함수
# [nan nan nan  0.]
# overflow 문제
def softmax(a):  # 개선한 수식
  C = np.max(a)
  return (np.exp(a-C) /  np.sum(np.exp(a-C)))  
  
A = np.array([1000, 900, 1050, 500])
print(softmax(A))
# [1.92874985e-022 7.17509597e-066 1.00000000e+000 1.37415257e-239] 
# 해결!

 

LeakyReLU

def LeakReLU(x):
  a = 0.01
  return np.maximum(a*x, x)
  
x = np.array([0.5, -1.4, 3, 0, 5])
print(LeakReLU(x))
# [ 0.5   -0.014  3.     0.     5.   ]

 

ELU(Exponential Linear Units)

def ELU(x):
  a = 0.1
  return(x >= 0)*x + (x < 0)*a + (np.exp(x)-1)
print(ELU(4))  # 57.598150033144236
print(ELU(-0.5))  # -0.2934693402873666

x = np.array([-2, 0.1, 4])
print(ELU(x))
# [-0.76466472  0.20517092 57.59815003]

 

활성화 함수를 비선형 함수(non-linear function)로 사용하는 이유

  • 신경망을 깊게(deep) 하기 위함
  • 만약 활성화 함수를 선형함수(linear function)으로 하게 되면 은닉층의 갯수가 여러개이더라도 의미가 없어짐
  • 만약, h(x)=cx,3y=h(h(h(x)))  =cccx  =c3x
    이므로 결국에는 선형함수가 되어버림

활성화 함수 참고

- 일반적인 사용 순서
  1. ELU
  2. LeakyReLU
  3. ReLU
  4. tanh 
  5. sigmoid 순으로 사용

- 스탠포드 강의에서 언급한 사용 순서
  1. ReLU
  2. ReLU Family(LeakyReLU, ELU)
  3. sigmoid는 사용 X  
  

 

 

 

출처 : 이수안 컴퓨터 연구소 립러닝 강의  www.suanlab.com