웹사이트 검색

시그모이드 활성화 함수 - Python 구현


이 튜토리얼에서는 시그모이드 활성화 기능에 대해 알아봅니다. 시그모이드 함수는 항상 0과 1 사이의 출력값을 반환합니다.

이 자습서 후에 다음을 알게 됩니다.

  • 활성화 기능이란 무엇입니까?
  • 파이썬에서 시그모이드 함수를 구현하는 방법은 무엇입니까?
  • 파이썬에서 시그모이드 함수를 그리는 방법
  • 시그모이드 함수는 어디에 사용하나요?
  • 시그모이드 활성화 기능으로 인해 발생하는 문제는 무엇입니까?
  • 시그모이드 활성화에 대한 더 나은 대안.

활성화 기능이란 무엇입니까?

활성화 함수는 신경망의 출력을 제어하는 수학적 함수입니다. 활성화 기능은 뉴런이 발동되어야 하는지 여부를 결정하는 데 도움이 됩니다.

널리 사용되는 활성화 기능 중 일부는 다음과 같습니다.

  • 바이너리 스텝
  • 선형
  • 시그모이드
  • ReLU
  • 새는 ReLU
  • 소프트맥스

활성화는 신경망 모델의 출력에 비선형성을 추가하는 역할을 합니다. 활성화 함수가 없으면 신경망은 단순히 선형 회귀입니다.

신경망의 출력을 계산하기 위한 수학 방정식은 다음과 같습니다.

이 튜토리얼에서는 시그모이드 활성화 기능에 중점을 둘 것입니다. 이 함수는 수학의 시그모이드 함수에서 나옵니다.

함수의 공식에 대해 논의하는 것으로 시작하겠습니다.

시그모이드 활성화 함수 공식

수학적으로 시그모이드 활성화 함수를 다음과 같이 나타낼 수 있습니다.

분모가 항상 1보다 크므로 출력이 항상 0과 1 사이임을 알 수 있습니다.

Python에서 Sigmoid 활성화 함수 구현

이 섹션에서는 Python에서 시그모이드 활성화 함수를 구현하는 방법을 알아봅니다.

파이썬에서 함수를 다음과 같이 정의할 수 있습니다.

import numpy as np 
def sig(x):
 return 1/(1 + np.exp(-x))

일부 입력에서 함수를 실행해 봅시다.

import numpy as np 
def sig(x):
 return 1/(1 + np.exp(-x))


x = 1.0
print('Applying Sigmoid Activation on (%.1f) gives %.1f' % (x, sig(x)))

x = -10.0
print('Applying Sigmoid Activation on (%.1f) gives %.1f' % (x, sig(x)))

x = 0.0
print('Applying Sigmoid Activation on (%.1f) gives %.1f' % (x, sig(x)))

x = 15.0
print('Applying Sigmoid Activation on (%.1f) gives %.1f' % (x, sig(x)))

x = -2.0
print('Applying Sigmoid Activation on (%.1f) gives %.1f' % (x, sig(x)))

출력 :

Applying Sigmoid Activation on (1.0) gives 0.7
Applying Sigmoid Activation on (-10.0) gives 0.0
Applying Sigmoid Activation on (0.0) gives 0.5
Applying Sigmoid Activation on (15.0) gives 1.0
Applying Sigmoid Activation on (-2.0) gives 0.1

Python을 사용하여 시그모이드 활성화 플로팅

시그모이드 활성화를 플롯하기 위해 Numpy 라이브러리를 사용합니다.

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10, 10, 50)   
p = sig(x)
plt.xlabel("x") 
plt.ylabel("Sigmoid(x)")  
plt.plot(x, p) 
plt.show()

출력 :

출력이 0과 1 사이임을 알 수 있습니다.

시그모이드 함수는 확률이 항상 0과 1 사이이기 때문에 확률을 예측하는 데 일반적으로 사용됩니다.

시그모이드 함수의 단점 중 하나는 끝 영역으로 갈수록 Y 값이 X 값의 변화에 매우 적게 반응한다는 것입니다.

이로 인해 기울기 소실 문제라는 문제가 발생합니다.

Vanishing Gradient는 학습 과정을 느리게 하므로 바람직하지 않습니다.

이 문제를 극복하는 몇 가지 대안에 대해 논의해 봅시다.

ReLu 활성화 기능

기울기 소실 문제를 해결하는 더 나은 대안은 ReLu 활성화 기능입니다.

ReLu 활성화 함수는 입력이 음수이면 0을 반환하고 그렇지 않으면 입력을 그대로 반환합니다.

수학적으로는 다음과 같이 표현됩니다.

다음과 같이 Python에서 구현할 수 있습니다.

def relu(x):
    return max(0.0, x)

일부 입력에서 어떻게 작동하는지 봅시다.

def relu(x):
    return max(0.0, x)
 
x = 1.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))
x = -10.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))
x = 0.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))
x = 15.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))
x = -20.0
print('Applying Relu on (%.1f) gives %.1f' % (x, relu(x)))

산출:

Applying Relu on (1.0) gives 1.0
Applying Relu on (-10.0) gives 0.0
Applying Relu on (0.0) gives 0.0
Applying Relu on (15.0) gives 15.0
Applying Relu on (-20.0) gives 0.0

ReLu의 문제는 음의 입력에 대한 그래디언트가 0으로 나온다는 것입니다.

이것은 다시 음의 입력에 대해 기울기가 사라지는 문제(기울기가 0임)로 이어집니다.

이 문제를 해결하기 위해 Leaky ReLu 활성화 기능으로 알려진 또 다른 대안이 있습니다.

Leaky ReLu 활성화 함수

Leaky ReLu는 x의 매우 작은 선형 구성 요소를 음의 입력에 제공하여 음의 값에 대한 기울기가 0인 문제를 해결합니다.

수학적으로 다음과 같이 정의할 수 있습니다.

f(x)= 0.01x, x<0
    = x,   x>=0

다음을 사용하여 Python에서 구현할 수 있습니다.

def leaky_relu(x):
  if x>0 :
    return x
  else :
    return 0.01*x
  
x = 1.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))

x = -10.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))

x = 0.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))

x = 15.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))

x = -20.0
print('Applying Leaky Relu on (%.1f) gives %.1f' % (x, leaky_relu(x)))

출력 :

Applying Leaky Relu on (1.0) gives 1.0
Applying Leaky Relu on (-10.0) gives -0.1
Applying Leaky Relu on (0.0) gives 0.0
Applying Leaky Relu on (15.0) gives 15.0
Applying Leaky Relu on (-20.0) gives -0.2

결론

이 튜토리얼은 Sigmoid 활성화 기능에 관한 것입니다. 파이썬에서 함수를 구현하고 플로팅하는 방법을 배웠습니다.