Tanh (Hyperbolic Tangent)
Tanhは、入力をゼロ中心の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年代にかけて、ニューラルネットワークの標準的な隠れ層活性化関数でした。現在では、再帰型ニューラルネットワーク (RNNs)の隠れ状態を形成し、画像生成器や制御ポリシーの出力を制限し、より大きなモデル内の値を一定範囲に保つために使われています。
数式と特性#
tanhは奇関数であり、tanh(−x) = −tanh(x)、tanh(0) = 0です。ゼロ付近ではほぼ線形で、tanh(x) ≈ xとなり、±3を超えるあたりから±1に近づいて平坦になります。導関数1 − tanh²(x)は原点で1となり、シグモイド関数の最大値0.25の4倍で、曲線が飽和するにつれてゼロに近づきます。以下のPyTorchのコードでは、tanhとその勾配を計算し、平均がゼロの入力に対する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}")出力には [-0.995, -0.762, 0.0, 0.762, 0.995] のtanh値と [0.01, 0.42, 1.0, 0.42, 0.01] の勾配が表示されるため、±3における勾配はゼロでの値の100分の1です。標準正規分布に従う入力100,000個に対して、tanhの出力の平均は約0.0、シグモイド関数の出力の平均は約0.5です。
出力がゼロ中心であることの利点#
ニューロンの重み勾配は入力に比例します。シグモイド関数の出力のように、すべての入力が正の場合、各更新でニューロンの重み勾配はすべて同じ符号になります。そのため、重みは一斉に増加または減少するしかなく、最適値に到達するまでジグザグに動きます。tanhの出力はほぼ均等に正負に分かれるため、各重みが個別に変化でき、次の層への入力も平均ゼロに近く保たれます。この領域では勾配降下法の収束が速くなります。このため、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の範囲に収めます。これは学習画像をスケーリングする範囲であり、その後の多くの敵対的生成ネットワーク (GANs)でも採用されています。
- 範囲制限付きアクション: 強化学習における連続制御のポリシーでは、出力に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に広げ、水平方向に2分の1に縮めた関数で、最大傾斜は0.25から1に上がります。シグモイド関数の値域は0から1のため、確率やゲートに適しています。
- Hardtanh: 入力を [−1, 1] にクリップする区分線形関数です。計算コストが低く、この範囲外での勾配は厳密に0です。
- ReLU: max(0, x)は正の入力に対して飽和せず、比較演算1回で計算できます。そのため、ReLUとSiLUなどの滑らかな後継関数が、深層畳み込みニューラルネットワーク (CNNs)やTransformerの隠れ層でtanhに取って代わりました。AlexNetの論文では、ReLUを使った4層CNNは、同じネットワークでtanhユニットを使った場合に比べて、CIFAR-10の学習誤差25%に6倍速く到達しました。










