Sigmoid
시그모이드 함수는 모든 실수를 0과 1 사이의 값으로 변환합니다. 수식, 그래디언트, 확률 출력, 게이트, PyTorch 코드를 다룹니다.
시그모이드 함수 σ(x) = 1 / (1 + e^(−x))는 모든 실수를 S자 곡선을 따라 0과 1 사이의 값으로 변환합니다. 큰 음수 입력은 0에 가까운 출력을, 큰 양수 입력은 1에 가까운 출력을 내며, 입력이 0이면 정확히 0.5를 출력합니다. 머신러닝(ML)에서 “시그모이드”는 거의 항상 로지스틱 함수, 즉 로지스틱 회귀에서 선형 점수를 확률로 변환하는 동일한 곡선을 뜻합니다. 신경망(NN)에서 시그모이드는 세 가지 역할을 합니다. 처음에는 은닉층 활성화 함수로 사용되었고, 이진 및 멀티레이블 출력에서는 최종 점수를 확률로 변환하며, 순환 셀 및 다른 게이트 계층에서는 부드러운 온·오프 스위치로 작동합니다. 이후 은닉층에서는 ReLU와 같은 함수가 사용되기 시작해 현재 모델의 시그모이드는 대부분 출력과 게이트에 위치합니다.
수식 및 특성#
시그모이드는 중간점을 기준으로 대칭이며 σ(−x) = 1 − σ(x)입니다. 역함수는 확률을 로그 오즈로 변환하는 로짓 함수 log(p / (1 − p))입니다. 따라서 시그모이드를 적용하기 전 네트워크의 원시 출력을 로짓이라고 합니다. 미분값은 σ′(x) = σ(x)(1 − σ(x))로 간단히 표현되며, x = 0에서 0.25로 최대가 되고 양 끝에서 곡선이 평평해짐에 따라 0에 가까워집니다. 이를 포화라고 합니다. 아래 PyTorch 코드 조각은 다섯 지점에서 출력과 기울기를 계산합니다:
import torch
x = torch.tensor([-6.0, -2.0, 0.0, 2.0, 6.0], requires_grad=True)
y = torch.sigmoid(x)
# Backpropagate to get the derivative sigmoid(x) * (1 - sigmoid(x)) at each input
y.sum().backward()
print(f"Sigmoid: {[round(v, 4) for v in y.tolist()]}")
print(f"Gradient: {[round(v, 4) for v in x.grad.tolist()]}")시그모이드 값 [0.0025, 0.1192, 0.5, 0.8808, 0.9975]과 기울기 [0.0025, 0.105, 0.25, 0.105, 0.0025]가 출력됩니다. ±6에서 출력은 극한값과 0.0025 이내로 가까우며, 기울기는 0일 때보다 100배 작습니다. 따라서 이 범위의 입력은 해당 출력을 생성한 가중치를 거의 바꾸지 않습니다.
은닉층에서의 시그모이드#
초기 다층 네트워크는 모든 은닉층에서 시그모이드를 사용해 두 가지 문제를 일으켰습니다. 역전파는 각 계층의 활성화 함수 미분값을 곱합니다. 시그모이드의 미분값은 0.25를 넘지 않으므로 시그모이드 계층 10개에서는 미분값만으로도 기울기가 최대 0.25¹⁰, 즉 100만분의 1 미만으로 줄어드는 기울기 소실 문제가 발생합니다. 또한 시그모이드 출력은 항상 양수이므로, 해당 출력을 받는 뉴런의 모든 가중치 기울기는 각 업데이트에서 같은 부호를 가집니다. 따라서 가중치는 최적값을 향해 지그재그로만 이동할 수 있습니다. Tanh는 출력을 0을 중심으로 배치하며, Xavier Glorot과 Yoshua Bengio는 2010년에 시그모이드의 양의 평균 때문에 무작위로 초기화된 심층 네트워크의 최상위 은닉층이 포화된다는 점을 보였습니다. ReLU는 두 문제를 모두 해결해 은닉층의 기본 함수가 되었으며, SiLU와 같은 매끄러운 후속 함수 x · σ(x)도 내부 게이트에 시그모이드를 사용합니다.
출력 계층에서의 시그모이드#
이진 분류에서는 단일 출력 z가 p = σ(z)가 되며, 이는 양성 클래스의 예측 확률입니다. p에서 임계값 0.5를 적용하는 것은 z에서 임계값 0을 적용하는 것과 같습니다. 학습에서는 시그모이드와 이진 교차 엔트로피를 함께 사용하며, 로짓에 대한 그래디언트는 예측 확률에서 레이블을 뺀 p − y입니다. 수치 안정성을 위해 프레임워크는 두 연산을 결합합니다. PyTorch의 BCEWithLogitsLoss는 원시 로짓을 입력받아 내부적으로 로그-합-지수 트릭을 사용하므로, 0 또는 1로 반올림된 확률에 로그를 취하는 문제를 방지합니다.
레이블이 동시에 나타날 수 있는 경우 모델은 레이블마다 시그모이드 하나를 사용하며, 이를 멀티레이블 분류라고 합니다. 반면 소프트맥스는 클래스가 하나의 확률 단위를 두고 경쟁하게 하므로 서로 배타적인 레이블에 적합합니다:
import torch
# Logits from a classifier for the labels "person", "backpack", and "car"
logits = torch.tensor([2.0, 1.5, -3.0])
# Sigmoid scores each label on its own; softmax makes the labels compete for one total
sigmoid_probs = torch.sigmoid(logits)
softmax_probs = torch.softmax(logits, dim=0)
print(f"Sigmoid: {[round(p, 3) for p in sigmoid_probs.tolist()]}, sum {sigmoid_probs.sum():.3f}")
print(f"Softmax: {[round(p, 3) for p in softmax_probs.tolist()]}, sum {softmax_probs.sum():.3f}")시그모이드 점수 [0.881, 0.818, 0.047]의 합은 1.746이므로 “사람”과 “배낭” 모두 0.5를 넘습니다. 반면 소프트맥스는 동일한 로짓을 [0.62, 0.376, 0.004]로 분배하며 “사람”만 0.5를 넘습니다. YOLO26 탐지 모델은 BCEWithLogitsLoss를 사용해 학습된 독립적인 시그모이드로 각 클래스의 점수를 계산하므로 박스의 클래스 점수 합은 1일 필요가 없습니다. YOLO26 포즈 모델은 각 키포인트의 가시성 로짓에 시그모이드를 적용해 키포인트가 보일 확률을 출력합니다.
게이트로서의 시그모이드#
시그모이드 출력은 0과 1 사이이므로, 미분 가능한 상태를 유지하면서 다른 신호의 각 요소를 완전히 차단하거나 그대로 통과시키는 사이의 값으로 조정할 수 있습니다:
- LSTM 및 GRU 셀: 시그모이드 게이트는 각 시점에 이전 메모리를 얼마나 유지할지, 새 콘텐츠를 얼마나 기록할지, 상태를 얼마나 노출할지 결정하며, tanh는 콘텐츠 자체의 형태를 조정합니다.
- SwiGLU: 여러 대규모 언어 모델(LLM)의 피드포워드 계층은 학습된 투영 하나에 SiLU 활성화 함수를 적용한 두 번째 투영을 곱합니다. 이는 시그모이드를 기반으로 한 게이트입니다.
- SigLIP: 이 이미지-텍스트 모델은 배치의 각 이미지-캡션 쌍을 자체 시그모이드로 채점해 매칭 여부의 확률을 구하므로, 손실을 계산할 때 배치 전체에 대한 정규화가 필요하지 않습니다.
시그모이드와 관련 함수 비교#
- 로지스틱 함수: 머신러닝에서 시그모이드의 동의어입니다. 수학에서 “시그모이드”는 tanh와 오차 함수를 비롯한 다른 S자 곡선도 포함합니다.
- 소프트맥스: 벡터 전체를 합이 1인 확률로 정규화합니다. 두 클래스의 경우 로짓 (z₁, z₂)에 소프트맥스를 적용하면 첫 번째 클래스는 σ(z₁ − z₂)가 되므로, 출력 두 개를 사용하는 소프트맥스와 출력 하나를 사용하는 시그모이드는 같은 모델을 나타냅니다.
- Tanh: 시그모이드의 크기를 조정한 함수로 tanh(x) = 2σ(2x) − 1이며, 출력은 0을 중심으로 −1에서 1까지이고 최대 미분값은 1입니다.
- Hard sigmoid: 모바일 하드웨어에서 지수 연산을 피하는 구간별 선형 근사 함수입니다. MobileNetV3는 ReLU6(x + 3) / 6을 사용합니다. 이 함수는 x = −3보다 작을 때 0, x = 3보다 클 때 1이며, 그 사이에서는 직선입니다.










