Tanh (Hyperbolic Tangent)
Tanh는 입력을 0을 중심으로 하는 S자 곡선에서 −1과 1 사이의 값으로 매핑합니다. 수식, 그래디언트, RNN, GAN, 제어 분야에서의 활용, PyTorch 코드를 다룹니다.
쌍곡탄젠트 tanh(x) = (eˣ − e^(−x)) / (eˣ + e^(−x))는 모든 실수를 S자형 곡선을 따라 −1과 1 사이의 값으로 매핑하는 활성화 함수입니다. 이는 크기를 조정한 시그모이드인 tanh(x) = 2σ(2x) − 1이므로 시그모이드와 형태는 같지만, 음수 입력에는 음수 값을 반환하고 원점에서 기울기가 1입니다. tanh는 1990년대와 2000년대에 신경망의 표준 은닉층 활성화 함수였습니다. 오늘날에는 순환 신경망(RNN)의 은닉 상태를 구성하고, 이미지 생성기와 제어 정책의 출력을 제한하며, 더 큰 모델 안에서 값이 범위를 벗어나지 않도록 합니다.
수식 및 특성#
tanh는 tanh(−x) = −tanh(x)인 홀함수이며 tanh(0) = 0입니다. 0 근처에서는 거의 선형인 tanh(x) ≈ x의 형태를 보이고, 약 ±3을 넘으면 ±1에 가까워지며 평평해집니다. 도함수 1 − tanh²(x)는 원점에서 1로, 시그모이드의 최대값 0.25보다 네 배 크며, 곡선이 포화될수록 0에 가까워집니다. 아래 PyTorch 코드는 tanh와 그 기울기를 계산한 다음, 평균이 0인 입력에서 tanh와 시그모이드의 평균 출력을 비교합니다.
import torch
x = torch.tensor([-3.0, -1.0, 0.0, 1.0, 3.0], requires_grad=True)
y = torch.tanh(x)
# The derivative of tanh is 1 - tanh(x)^2, which peaks at 1 when x = 0
y.sum().backward()
print(f"Tanh: {[round(v, 3) for v in y.tolist()]}")
print(f"Gradient: {[round(v, 3) for v in x.grad.tolist()]}")
# For zero-mean inputs, tanh outputs average near 0 and sigmoid outputs near 0.5
torch.manual_seed(0)
z = torch.randn(100_000)
print(f"Mean output, tanh: {torch.tanh(z).mean():.3f}, sigmoid: {torch.sigmoid(z).mean():.3f}")이 코드는 tanh 값 [-0.995, -0.762, 0.0, 0.762, 0.995]과 기울기 [0.01, 0.42, 1.0, 0.42, 0.01]을 출력하므로, ±3에서의 기울기는 0에서의 기울기의 100분의 1입니다. 표준 정규분포를 따르는 입력 100,000개에서 tanh 출력의 평균은 약 0.0이고 시그모이드 출력의 평균은 약 0.5입니다.
출력을 0 중심으로 두면 좋은 이유#
뉴런의 가중치 기울기는 입력에 비례합니다. 시그모이드 출력처럼 모든 입력이 양수이면 각 업데이트에서 뉴런의 모든 가중치 기울기가 같은 부호를 가지므로, 가중치가 함께 증가하거나 감소하고 지그재그로 움직여야 최적값에 도달합니다. tanh 출력은 대체로 같은 비율의 양수와 음수로 이루어지므로 각 가중치를 독립적으로 조정할 수 있고, 다음 층의 입력을 평균이 0에 가까운 상태로 유지하여 경사 하강법의 수렴을 빠르게 합니다. 이러한 이유로 Yann LeCun과 동료들은 1998년 가이드 "Efficient BackProp"에서 은닉층에 로지스틱 시그모이드보다 대칭 함수를 사용할 것을 권장했으며, 구체적으로 1.7159 · tanh(2x/3) 형태로 크기를 조정해 제시했습니다. tanh는 여전히 포화되며, tanh 층을 여러 개 쌓으면 역전파 중 기울기가 작아지는 기울기 소실 문제가 발생합니다.
tanh의 사용 사례#
- 순환 네트워크: 단순 RNN은 hₜ = tanh(Wxₜ + Uhₜ₋₁ + b)와 같이 상태를 업데이트하며, tanh는 PyTorch의
nn.RNN에서 기본 비선형 함수입니다. LSTM 및 GRU 셀에서 tanh는 후보 콘텐츠를 생성하고, LSTM에서는 출력 전에 셀 상태를 압축합니다. 시그모이드 게이트는 그중 어느 정도를 사용할지 결정합니다. 값의 범위가 제한되므로 단계마다 다시 입력되는 상태가 무한히 커지지 않습니다. - GAN 생성기: DCGAN은 생성기의 마지막에 tanh를 적용하여 생성된 픽셀을 −1과 1 사이로 제한합니다. 이는 학습 이미지의 크기를 조정하는 범위이며, 이후의 여러 생성적 적대 신경망(GAN)도 이 방식을 따릅니다.
- 제한된 동작: 강화 학습의 연속 제어 정책은 출력을 tanh에 통과시켜 모든 명령이 액추에이터 한계 안에 있도록 합니다. Soft Actor-Critic은 가우시안 정책에서 추출한 샘플을 이 방식으로 압축합니다.
- 로짓 소프트 캡핑: Google의 Gemma 2 언어 모델은 cap · tanh(logits / cap)을 계산하며, 어텐션 로짓에는 50, 최종 로짓에는 30의 cap을 사용합니다. 작은 로짓은 거의 변하지 않고 통과하며, 큰 로짓도 cap을 초과할 수 없습니다.
- GELU 근사: 0.5x(1 + tanh(√(2/π)(x + 0.044715x³)))는 GELU를 매우 가깝게 근사하며, 원본 GPT-2 및 BERT 코드는 이 방식으로 GELU를 계산합니다.
- 정규화 흐름: RealNVP 계열 흐름은 각 스케일 네트워크의 마지막에 tanh를 적용하는 경우가 많습니다. 이에 따라 각 결합층은 입력을 e⁻¹과 e 사이의 계수로 스케일링하여 학습의 수치적 안정성을 유지합니다. YOLO26 포즈 추정 모델은 잔차 로그 가능도 추정 손실로 학습합니다. 이 손실의 6층 RealNVP 흐름은 모든 스케일 네트워크의 마지막에 tanh를 적용하며, 예측 키포인트가 정답에서 얼마나 벗어나는지 모델링합니다.
tanh와 관련 함수 비교#
- 시그모이드: tanh는 시그모이드의 범위를 −1부터 1까지 늘리고 가로 방향으로 두 배 압축한 함수이며, 최대 기울기를 0.25에서 1로 높입니다. 시그모이드의 0~1 범위는 확률과 게이트를 표현하기에 적합합니다.
- Hardtanh: 입력을 [−1, 1]로 클리핑하는 구간별 선형 함수입니다. 계산 비용이 더 적으며, 해당 범위 밖의 기울기는 정확히 0입니다.
- ReLU: max(0, x)는 양수 입력에서 포화되지 않고 비교 연산 한 번만 필요하므로, ReLU와 SiLU 같은 매끄러운 후속 함수가 심층 합성곱 신경망(CNN)과 트랜스포머의 은닉층에서 tanh를 대체했습니다. AlexNet 논문에서는 ReLU를 사용한 4층 CNN이 tanh 유닛을 사용한 동일 네트워크보다 6배 빠르게 CIFAR-10에서 학습 오차 25%에 도달했습니다.










