- Published on
시그모이드 함수 (Sigmoid Function)
- Authors

- Name
- 이동영
- Github
- @Github
시그모이드 함수란?
TensorTonic의 Sigmoid 문제를 풀면서 시그모이드 함수에 대해 정리해 보았다.
시그모이드(Sigmoid) 함수는 임의의 실수 입력을 받아 0과 1 사이의 값으로 변환하는 S자 형태의 함수다.
가 매우 큰 양수이면 가 0에 수렴하므로 출력은 1에 가까워지고 가 매우 큰 음수이면 가 무한대로 발산하므로 출력은 0에 가까워진다. 일 때는 정확히 0.5를 반환한다.
NumPy 구현
import numpy as np
def sigmoid(x):
"""
Vectorized sigmoid function.
"""
x = np.asarray(x)
return 1 / (1 + np.exp(-x))
np.asarray vs np.array
위 코드에서 np.array가 아닌 np.asarray를 사용한 이유는 불필요한 복사를 피하기 위해서다.
np.array(x) | np.asarray(x) | |
|---|---|---|
| 입력이 이미 ndarray인 경우 | 새 배열을 복사해서 반환 | 원본 그대로 반환 (복사 없음) |
| 입력이 리스트, 스칼라 등인 경우 | 새 ndarray 생성 | 새 ndarray 생성 |
sigmoid 함수는 입력을 변경하지 않고 새로운 계산 결과를 반환하므로 입력 배열을 굳이 복사할 필요가 없다. 이미 ndarray인 입력에 대해 np.array를 쓰면 매번 불필요한 메모리 할당과 복사가 발생한다. np.asarray는 ndarray가 아닌 경우에만 변환하고 이미 ndarray이면 그대로 참조를 반환하기 때문에 더 효율적이다.
주요 용도
- 이진 분류(Binary Classification): 출력 범위가 이므로 확률로 해석할 수 있다. 로지스틱 회귀의 핵심이 바로 시그모이드 함수다.
- 신경망 활성화 함수: 뉴런의 출력을 비선형으로 변환하여 네트워크가 복잡한 패턴을 학습할 수 있게 한다.
- 게이트 메커니즘: LSTM, GRU 등 순환 신경망에서 정보를 얼마나 통과시킬지 결정하는 게이트에 사용된다. 출력이 0이면 차단, 1이면 전부 통과라는 의미가 자연스럽게 성립하기 때문이다.
왜 밑이 인가?
시그모이드 함수에서 밑으로 가 아닌 다른 양수 를 사용해도 S자 곡선 자체는 만들 수 있다.
하지만 를 쓰는 이유는 미분의 깔끔함 때문이다.
는 미분해도 자기 자신이 되는 유일한 지수 함수다.
반면 다른 밑 를 사용하면 미분 시 가 상수로 따라붙는다.
를 밑으로 쓰면 시그모이드의 도함수가 라는 깔끔한 형태가 되어 역전파에서의 기울기 계산이 단순해진다. 이런 수학적 편의성이 가 표준으로 자리 잡은 이유다.
한계점
시그모이드는 역사적으로 가장 많이 쓰인 활성화 함수지만 심층 신경망에서는 몇 가지 문제가 있다.
기울기 소실 (Vanishing Gradient)
시그모이드의 도함수는 다음과 같다.
이 도함수의 최댓값은 일 때 다. 즉 역전파 과정에서 한 층을 지날 때마다 기울기가 최대 로 줄어든다. 층이 깊어질수록 기울기가 기하급수적으로 작아져서 앞쪽 층의 가중치가 거의 업데이트되지 않는 기울기 소실 문제가 발생한다.
출력이 Zero-centered가 아님
시그모이드의 출력 범위는 로 항상 양수다. 이로 인해 다음 층의 가중치에 대한 기울기가 모두 같은 부호를 갖게 되어 가중치 업데이트가 지그재그로 진행된다. 수렴 속도가 느려지는 원인이 된다.
이러한 한계 때문에 은닉층에서는 ReLU나 tanh 같은 대안이 주로 쓰이고 시그모이드는 출력층이나 게이트 등 범위가 의미 있는 곳에서 사용된다.