[Python] 시그모이드 활성화 함수의 기초부터 활용법 파이썬 예시코드

시그모이드 함수란? 신경망의 기초 이해하기

시그모이드 활성화 함수는 인공신경망딥러닝 분야에서 핵심적인 역할을 담당합니다. 이 함수는 입력값을 0과 1 사이의 출력으로 변환하는 특성을 가지고 있어, 주로 이진 분류 문제나 확률을 표현해야 하는 상황에서 유용하게 사용됩니다.

수학적으로 시그모이드 함수는 다음과 같이 표현됩니다:

f(x) = 1 / (1 + e^(-x))

여기서 e는 자연상수(약 2.71828)를 의미합니다. 이 함수의 그래프는 S자 모양을 띠며, 입력값이 매우 작을 때는 0에 가까운 값을, 매우 클 때는 1에 가까운 값을 출력합니다.

파이썬으로 시그모이드 함수 구현하기

시그모이드 함수 3

파이썬에서 시그모이드 함수를 구현하는 방법은 매우 간단합니다. NumPy 라이브러리를 사용하면 효율적으로 구현할 수 있습니다. 다음은 시그모이드 함수의 파이썬 구현 예시입니다:

import numpy as np

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

# 테스트
x = np.array([-10, -5, 0, 5, 10])
print(sigmoid(x))

이 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다:

[4.53978687e-05 6.69285092e-03 5.00000000e-01 9.93307149e-01 9.99954602e-01]

이 결과는 입력값 -10, -5, 0, 5, 10에 대한 시그모이드 함수의 출력값을 보여줍니다. 음수 입력에 대해서는 0에 가까운 값을, 양수 입력에 대해서는 1에 가까운 값을 출력하는 것을 확인할 수 있습니다.

시그모이드 함수의 특성과 장단점

시그모이드 함수는 여러 가지 유용한 특성을 가지고 있습니다:

  1. 비선형성: 시그모이드 함수는 비선형 함수로, 신경망이 복잡한 패턴을 학습할 수 있게 합니다.
  2. 미분 가능성: 모든 지점에서 미분이 가능하여, 역전파 알고리즘에 사용하기 적합합니다.
  3. 출력 범위 제한: 항상 0과 1 사이의 값을 출력하므로, 확률을 표현하기에 적합합니다.

그러나 시그모이드 함수에는 몇 가지 단점도 있습니다:

  1. 기울기 소실 문제: 입력값이 매우 크거나 작을 때 기울기가 거의 0에 가까워져, 깊은 신경망에서 학습이 어려워질 수 있습니다.
  2. 출력이 0 중심이 아님: 항상 양수를 출력하므로, 다음 층의 뉴런들이 같은 방향으로 업데이트되는 문제가 발생할 수 있습니다.

이러한 단점 때문에 최근에는 ReLU(Rectified Linear Unit)와 같은 다른 활성화 함수들이 더 널리 사용되고 있습니다.

시그모이드 함수의 미분: 역전파 알고리즘의 핵심

신경망의 학습 과정에서는 시그모이드 함수의 미분이 중요한 역할을 합니다. 시그모이드 함수의 미분은 다음과 같이 표현됩니다:

f'(x) = f(x) * (1 – f(x))

이 특성을 이용하면 시그모이드 함수의 미분을 매우 효율적으로 계산할 수 있습니다. 파이썬으로 시그모이드 함수의 미분을 구현하면 다음과 같습니다:

def sigmoid_derivative(x):
    s = sigmoid(x)
    return s * (1 - s)

# 테스트
x = np.array([-10, -5, 0, 5, 10])
print(sigmoid_derivative(x))

이 코드의 실행 결과는 다음과 같습니다:

[4.53978686e-05 6.64805667e-03 2.50000000e-01 6.64805667e-03 4.53978686e-05]

이 결과는 시그모이드 함수의 미분값이 입력이 0일 때 최대가 되고, 입력의 절대값이 커질수록 0에 가까워지는 것을 보여줍니다.

실제 적용: 이진 분류 문제에서의 시그모이드 함수

시그모이드 함수는 이진 분류 문제에서 특히 유용합니다. 예를 들어, 이메일이 스팸인지 아닌지를 분류하는 문제를 생각해봅시다. 다음은 간단한 로지스틱 회귀 모델의 예시입니다:

import numpy as np

def predict(features, weights):
    z = np.dot(features, weights)
    return sigmoid(z)

def cost_function(features, labels, weights):
    predictions = predict(features, weights)
    cost = -np.mean(labels * np.log(predictions) + (1 - labels) * np.log(1 - predictions))
    return cost

def update_weights(features, labels, weights, learning_rate):
    predictions = predict(features, weights)
    gradient = np.dot(features.T, (predictions - labels)) / len(labels)
    weights -= learning_rate * gradient
    return weights

# 가상의 데이터 생성
np.random.seed(42)
features = np.random.randn(1000, 5)
weights = np.random.randn(5)
labels = (np.random.randn(1000) > 0).astype(int)

# 학습
learning_rate = 0.1
for _ in range(1000):
    weights = update_weights(features, labels, weights, learning_rate)

# 결과 출력
print("최종 가중치:", weights)
print("최종 비용:", cost_function(features, labels, weights))

이 예제에서는 시그모이드 함수를 사용하여 입력 특성들의 선형 조합을 0과 1 사이의 확률로 변환합니다. 그리고 이 확률을 기반으로 이진 분류를 수행합니다.

시그모이드 함수 딥러닝의 발전과 함께

시그모이드 함수 2

시그모이드 함수는 오랫동안 신경망의 주요 활성화 함수로 사용되어 왔지만, 최근에는 ReLU나 LeakyReLU 등의 함수들이 더 널리 사용되고 있습니다. 그러나 시그모이드 함수는 여전히 특정 상황, 특히 출력층에서 확률을 표현해야 하는 경우에 유용하게 사용됩니다.

또한, 시그모이드 함수의 개념은 다른 활성화 함수의 발전에도 영향을 미쳤습니다. 예를 들어, 시그모이드 함수의 변형인 tanh 함수는 출력 범위가 -1에서 1 사이이며, 0을 중심으로 대칭이라는 장점이 있습니다.

딥러닝 분야가 계속 발전함에 따라, 새로운 형태의 활성화 함수들이 계속해서 연구되고 있습니다. 그러나 시그모이드 함수의 기본 개념과 특성을 이해하는 것은 여전히 중요합니다. 이는 신경망의 기본 원리를 이해하고, 더 복잡한 모델을 설계하는 데 도움이 되기 때문입니다.

시그모이드 활성화 함수는 단순하면서도 강력한 도구입니다. 파이썬을 이용해 쉽게 구현할 수 있으며, 딥러닝의 기초를 이해하는 데 큰 도움이 됩니다. 이 함수의 특성과 구현 방법을 잘 이해하면, 더 복잡한 신경망 모델을 다루는 데도 큰 도움이 될 것입니다.

답글 남기기