深層学習の勉強をしていると、RNNやLSTMの内部で tanh(双曲線正接関数、ハイパボリックタンジェント関数) という関数に必ず出会います。tanh という見慣れない略語に、初めて触れたときに少し身構えてしまう人も多いのではないでしょうか。
でも、構える必要はありません。tanh は「どんな大きさの入力が来ても、出力を $-1$ から $+1$ の間にやさしく押し込む関数」、ただそれだけです。下のグラフを見れば、その性質が一目でわかります。

入力 $x$ がどれだけ大きくなっても出力は $+1$ を超えず、どれだけ小さく(負に大きく)なっても $-1$ を下回りません。しかも原点付近ではほぼ直線(傾き $1$)でなめらかに変化します。この「青天井の入力を有限の範囲に押し込む」性質が、ニューラルネットワークで重宝される理由です。
ではなぜ、この関数をわざわざ学ぶのでしょうか。応用先を2つ挙げます。
- RNN / LSTM の心臓部:時系列を扱う再帰型ニューラルネットでは、記憶(セル状態)を更新するときに値が発散しないよう、tanh で毎ステップ $(-1, 1)$ に抑え込みます。tanh を理解せずに LSTM の数式は読めません。
- 0中心の活性化関数:tanh の出力は平均的に $0$ を中心に分布します。これはシグモイド関数にはない長所で、勾配降下法による学習を速める効果があります(理由は後で説明します)。
この記事では、tanh を次の順序で「完全に腹落ち」させます。
- tanh の定義を $\sinh$ / $\cosh$ から組み立てる
- 双曲線恒等式 $\cosh^2(x) – \sinh^2(x) = 1$ を指数関数から証明する
- グラフ・値域・対称性・漸近線を読み解く
- シグモイド関数との関係 $\tanh(x) = 2\sigma(2x) – 1$ を1行ずつ導出する
- 微分公式 $\tanh'(x) = 1 – \tanh^2(x)$ を商の微分から導く(別証明付き)
- 「tanh 微分」「tanhx 微分」クエリに直答する計算早見
- テイラー展開で「原点付近では $\tanh(x) \approx x$」を確認する
- 活性化関数比較表(出力範囲・0中心・勾配消失・計算コスト)
- 勾配消失の数式的説明(層を重ねるごとに勾配が指数的に縮む)
- RNN / LSTM での tanh の役割
- NumPy / PyTorch による実装と数値検証
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が滑らかになります。
tanh とは — まず「双曲線」の正体から
tanh の tan は三角関数のタンジェントを連想させますが、tanh は三角関数ではありません。h は hyperbolic(双曲線の) の頭文字で、tanh は「双曲線正接関数」と読みます。
三角関数 $\cos\theta, \sin\theta$ が「単位円 $x^2 + y^2 = 1$ の上の点」を表すのに対し、双曲線関数 $\cosh t, \sinh t$ は「双曲線 $x^2 – y^2 = 1$ の上の点」を表します。円が双曲線に置き換わっただけで、構造はよく似ています。三角関数のタンジェントが $\tan\theta = \sin\theta / \cos\theta$ だったのと同じように、双曲線正接 tanh も $\sinh$ を $\cosh$ で割ったものとして定義されます。
まず、その材料である $\sinh$(ハイパボリックサイン)と $\cosh$(ハイパボリックコサイン)を、指数関数の足し引きで定義します。
$$ \begin{equation} \sinh(x) = \frac{e^x – e^{-x}}{2}, \qquad \cosh(x) = \frac{e^x + e^{-x}}{2} \end{equation} $$
$\sinh$ は $e^x$ と $e^{-x}$ の「差」、$\cosh$ は「和」を半分にしたものです。差を取る $\sinh$ は奇関数(原点対称)、和を取る $\cosh$ は偶関数($y$ 軸対称)になります。
そして、この2つの比として tanh を定義します。
$$ \begin{equation} \tanh(x) = \frac{\sinh(x)}{\cosh(x)} = \frac{\dfrac{e^x – e^{-x}}{2}}{\dfrac{e^x + e^{-x}}{2}} = \frac{e^x – e^{-x}}{e^x + e^{-x}} \end{equation} $$
分子・分母の $1/2$ が約分で消え、よく見る形 $\tanh(x) = (e^x – e^{-x}) / (e^x + e^{-x})$ になりました。この式が tanh の正体です。分子は「$e^x$ と $e^{-x}$ の差」、分母は「その和」なので、差は必ず和より小さい($x \neq 0$ のとき)ことから、tanh の絶対値は必ず $1$ より小さくなります。これが値域 $(-1, 1)$ の理由です。
$\sinh, \cosh, \tanh$ の3つを重ねて描くと、関係が視覚的につかめます。

$\cosh(x)$(赤)は常に正で $1$ 以上の「谷型」、$\sinh(x)$(青)は原点を通って上下に伸びる曲線です。この2つの比 $\tanh(x)$(緑)は、$\sinh$ をいつも $\sinh$ より大きい $\cosh$ で割るので、$-1$ と $1$ の間に収まります。分母 $\cosh$ が指数的に大きくなるため、$x$ が大きくなると tanh はすぐ $1$ に貼り付くのです。
双曲線恒等式 $\cosh^2(x) – \sinh^2(x) = 1$ の証明
三角関数の基本恒等式 $\cos^2\theta + \sin^2\theta = 1$ と対応する、双曲線関数の基本恒等式を確認しておきましょう。この恒等式は後の微分導出で核心的な役割を果たします。
定義式をそのまま代入して展開します。
$$ \begin{align} \cosh^2(x) – \sinh^2(x) &= \left(\frac{e^x + e^{-x}}{2}\right)^2 – \left(\frac{e^x – e^{-x}}{2}\right)^2 \end{align} $$
それぞれ2乗を展開します。$(A+B)^2 = A^2 + 2AB + B^2$、$(A-B)^2 = A^2 – 2AB + B^2$ の公式を使うと、
$$ \begin{align} &= \frac{(e^x)^2 + 2e^x e^{-x} + (e^{-x})^2}{4} – \frac{(e^x)^2 – 2e^x e^{-x} + (e^{-x})^2}{4} \end{align} $$
分子を引き算します。$e^x e^{-x} = e^{x + (-x)} = e^0 = 1$ に注意して整理すると、$(e^x)^2$ と $(e^{-x})^2$ の項は打ち消しあい、
$$ \begin{align} &= \frac{(e^{2x} + 2 + e^{-2x}) – (e^{2x} – 2 + e^{-2x})}{4} = \frac{4}{4} = 1 \end{align} $$
こうして $\cosh^2(x) – \sinh^2(x) = 1$ が証明できました。これは幾何学的には「点 $(\cosh t, \sinh t)$ は双曲線 $x^2 – y^2 = 1$ の上に乗っている」ことを意味します。単位円 $x^2 + y^2 = 1$ の上に $(\cos\theta, \sin\theta)$ が乗るのと完全に対応しています。
この恒等式を $\cosh^2$ で割ると、
$$ \begin{equation} 1 – \frac{\sinh^2(x)}{\cosh^2(x)} = \frac{1}{\cosh^2(x)}, \quad\text{すなわち}\quad 1 – \tanh^2(x) = \operatorname{sech}^2(x) \end{equation} $$
という形に変形できます。これが微分公式の核心になります。
定義がわかったので、次は tanh のグラフそのものを詳しく読み解いていきましょう。
tanh のグラフ・値域・対称性・漸近線
数式だけ見ても挙動はイメージしづらいので、グラフで4つの性質を確認します。

このグラフから読み取れる tanh の重要な性質は次の4つです。
- 値域は開区間 $(-1, 1)$:出力は決して $-1$ や $+1$ に到達しませんが、限りなく近づきます。先ほど見たとおり、分子(差)が分母(和)より小さいことから出てくる性質です。
- 奇関数(原点対称):$\tanh(-x) = -\tanh(x)$ が成り立ちます。図で $\tanh(2) = 0.964$、$\tanh(-2) = -0.964$ と符号だけが反転しているのが確認できます。定義式で $x \to -x$ とすると分子の符号だけが反転するので、すぐに示せます。
- 2本の水平漸近線:$x \to +\infty$ で $y = 1$、$x \to -\infty$ で $y = -1$ に近づきます。
- 原点を通り、そこで傾きが最大:$\tanh(0) = 0$ で、原点付近のカーブが最も急です。
奇関数であることの証明:定義式 $\tanh(x) = (e^x – e^{-x})/(e^x + e^{-x})$ で $x$ を $-x$ に置き換えます。
$$ \begin{equation} \tanh(-x) = \frac{e^{-x} – e^{x}}{e^{-x} + e^{x}} = \frac{-(e^x – e^{-x})}{e^x + e^{-x}} = -\tanh(x) \end{equation} $$
分子の $e^{-x} – e^x = -(e^x – e^{-x})$ という符号の反転だけが起き、分母 $e^{-x} + e^x = e^x + e^{-x}$ は変わらないため、全体の符号が反転します。奇関数は $y$ 軸ではなく原点を中心に対称なので、グラフを $180°$ 回転させると元に戻ります。この性質はシグモイド(偶関数でも奇関数でもない)にはなく、tanh の大きな特徴です。
漸近線の挙動を数式で確認しておきます。$x \to +\infty$ では $e^{-x} \to 0$ なので、定義式の $e^{-x}$ を含む項が消えて、
$$ \begin{equation} \lim_{x \to \infty} \tanh(x) = \lim_{x \to \infty} \frac{e^x – e^{-x}}{e^x + e^{-x}} = \frac{e^x – 0}{e^x + 0} = 1 \end{equation} $$
同様に $x \to -\infty$ では今度は $e^{x} \to 0$ となり、
$$ \begin{equation} \lim_{x \to -\infty} \tanh(x) = \frac{0 – e^{-x}}{0 + e^{-x}} = -1 \end{equation} $$
漸近線への近づき方を具体的な数値で見ると、$x = 2$ では $\tanh(2) = 0.9640$、$x = 3$ では $\tanh(3) = 0.9951$、$x = 5$ では $\tanh(5) = 0.9999$ と、$x = 3$ を超えるとほぼ $1$ に貼り付いてしまいます。シグモイド関数が $0 \sim 1$ の範囲で値をとるのに対し、tanh は $(-1, 1)$、つまり負の値も出力できる点が大きな違いです。実はこの2つの関数は、見た目が似ているだけでなく、数式の上でもぴったり対応しています。次にその関係を導いてみましょう。
シグモイド関数との関係 $\tanh(x) = 2\sigma(2x) – 1$
シグモイド関数(ロジスティック関数)$\sigma$ は次のように定義されます。
$$ \begin{equation} \sigma(x) = \frac{1}{1 + e^{-x}} \end{equation} $$
tanh とシグモイドは、形がそっくりな S字カーブです。実際、tanh はシグモイドを横に縮めて縦に引き伸ばし、上下にずらしたものにすぎません。この関係を式で確かめます。ゴールは
$$ \tanh(x) = 2\sigma(2x) – 1 $$
を示すことです。右辺から出発して、左辺の tanh の定義式にたどり着くことを目指します。
まず $\sigma(2x)$ を定義どおり書き下します。
$$ \begin{equation} \sigma(2x) = \frac{1}{1 + e^{-2x}} \end{equation} $$
これを $2\sigma(2x) – 1$ に代入します。
$$ \begin{equation} 2\sigma(2x) – 1 = \frac{2}{1 + e^{-2x}} – 1 \end{equation} $$
分数と $1$ を通分するため、$1 = \dfrac{1 + e^{-2x}}{1 + e^{-2x}}$ と書き直して引き算します。
$$ \begin{equation} \frac{2}{1 + e^{-2x}} – \frac{1 + e^{-2x}}{1 + e^{-2x}} = \frac{2 – (1 + e^{-2x})}{1 + e^{-2x}} = \frac{1 – e^{-2x}}{1 + e^{-2x}} \end{equation} $$
ここまでで $\dfrac{1 – e^{-2x}}{1 + e^{-2x}}$ という形になりました。あと一歩で tanh の定義式と一致させたいので、分子・分母に $e^{x}$ を掛けます($e^x \neq 0$ なので値は変わりません)。
$$ \begin{equation} \frac{1 – e^{-2x}}{1 + e^{-2x}} \cdot \frac{e^x}{e^x} = \frac{e^x – e^{-2x}e^{x}}{e^x + e^{-2x}e^{x}} = \frac{e^x – e^{-x}}{e^x + e^{-x}} = \tanh(x) \end{equation} $$
途中で $e^{-2x} \cdot e^x = e^{-2x + x} = e^{-x}$ という指数法則を使いました。こうして右辺が tanh の定義式そのものになり、$\tanh(x) = 2\sigma(2x) – 1$ が示せました。
この関係をグラフで重ねると、変換のイメージがつかめます。

赤のシグモイド $\sigma(x)$ は $0 \sim 1$ の範囲で、中心が $0.5$ にあります。一方、青の tanh は中心が $0$ です。黒の破線で描いた $2\sigma(2x) – 1$ は tanh とぴったり重なっていて、先ほどの導出が正しいことが目で確認できます。この式変形から、tanh は「中心を $0$ にずらしたシグモイド」だと理解できます。出力の中心が $0$ にあることが、後で述べる「学習が速い」という長所につながります。
ここまでで tanh の値の性質はつかめました。深層学習で実際に使うのは、関数の値だけでなく 微分(勾配) です。次は tanh の微分公式を導きます。
tanh の微分公式 $\tanh'(x) = 1 – \tanh^2(x)$ の導出
ニューラルネットの学習は誤差逆伝播法、つまり勾配(微分)を後ろの層へ伝える計算が中心です。だから活性化関数の微分は必ず必要になります。tanh の微分には、
$$ \tanh'(x) = 1 – \tanh^2(x) $$
という非常に美しい公式があります。「微分が、もとの関数自身で書ける」ので計算がとても楽です。これを商の微分公式から導きます。
tanh は $\sinh / \cosh$ という商なので、商の微分公式 $\left(\dfrac{f}{g}\right)’ = \dfrac{f’g – fg’}{g^2}$ を使います。準備として $\sinh, \cosh$ の微分を求めておくと、定義式 $\sinh(x) = (e^x – e^{-x})/2$、$\cosh(x) = (e^x + e^{-x})/2$ をそのまま微分して、
$$ \begin{equation} \sinh'(x) = \frac{e^x + e^{-x}}{2} = \cosh(x), \qquad \cosh'(x) = \frac{e^x – e^{-x}}{2} = \sinh(x) \end{equation} $$
となります($e^{-x}$ の微分が $-e^{-x}$ になることで符号が入れ替わる点に注意)。これを商の微分公式に当てはめます。$f = \sinh, g = \cosh$ として、
$$ \begin{equation} \tanh'(x) = \frac{\sinh'(x)\cosh(x) – \sinh(x)\cosh'(x)}{\cosh^2(x)} = \frac{\cosh(x)\cosh(x) – \sinh(x)\sinh(x)}{\cosh^2(x)} \end{equation} $$
分子は $\cosh^2(x) – \sinh^2(x)$ です。ここで双曲線関数の基本恒等式 $\cosh^2(x) – \sinh^2(x) = 1$(双曲線 $x^2 – y^2 = 1$ そのもの)を使うと、分子はちょうど $1$ になります。
$$ \begin{equation} \tanh'(x) = \frac{\cosh^2(x) – \sinh^2(x)}{\cosh^2(x)} = \frac{1}{\cosh^2(x)} = \operatorname{sech}^2(x) \end{equation} $$
ここで $\operatorname{sech}(x) = 1/\cosh(x)$ です。これで $\tanh'(x) = \operatorname{sech}^2(x)$ という形が得られました。最後に、これを tanh 自身で書き直します。先ほどの分子を $\cosh^2$ で割る形に変形すると、
$$ \begin{equation} \tanh'(x) = \frac{\cosh^2(x) – \sinh^2(x)}{\cosh^2(x)} = 1 – \frac{\sinh^2(x)}{\cosh^2(x)} = 1 – \tanh^2(x) \end{equation} $$
途中で $\sinh^2/\cosh^2 = (\sinh/\cosh)^2 = \tanh^2$ を使いました。こうして目標だった公式 $\tanh'(x) = 1 – \tanh^2(x)$ が導けました。この微分は誤差逆伝播法に頻繁に登場するので、ぜひ覚えておきましょう。
別証明:指数関数から直接微分する
上の導出は $\sinh/\cosh$ の商の微分を使いましたが、指数関数の定義式 $\tanh(x) = (e^x – e^{-x})/(e^x + e^{-x})$ から直接微分することもできます。別の視点で同じ結果に到達することで、公式の正しさをより深く理解できます。
$u = e^x – e^{-x}$、$v = e^x + e^{-x}$ とおくと、$u’ = e^x + e^{-x} = v$、$v’ = e^x – e^{-x} = u$ です。これを商の微分 $(u/v)’ = (u’v – uv’)/v^2$ に代入します。
$$ \begin{equation} \tanh'(x) = \frac{u’v – uv’}{v^2} = \frac{(e^x + e^{-x})(e^x + e^{-x}) – (e^x – e^{-x})(e^x – e^{-x})}{(e^x + e^{-x})^2} \end{equation} $$
分子は $(e^x + e^{-x})^2 – (e^x – e^{-x})^2$ という形で、和と差の積の公式 $(A+B)(A-B) = A^2 – B^2$ を連想すると、この差を計算すれば良いとわかります。
$$ \begin{align} (e^x + e^{-x})^2 &= e^{2x} + 2 + e^{-2x} \\ (e^x – e^{-x})^2 &= e^{2x} – 2 + e^{-2x} \end{align} $$
差をとると $e^{2x}$ と $e^{-2x}$ が消えて、
$$ \begin{equation} (e^x + e^{-x})^2 – (e^x – e^{-x})^2 = (e^{2x} + 2 + e^{-2x}) – (e^{2x} – 2 + e^{-2x}) = 4 \end{equation} $$
分子が $4$ になったので、
$$ \begin{equation} \tanh'(x) = \frac{4}{(e^x + e^{-x})^2} \end{equation} $$
これは $\operatorname{sech}^2(x) = (2/(e^x + e^{-x}))^2$ と等しいですね。また $1 – \tanh^2(x)$ との一致も確認できます。
$$ \begin{equation} 1 – \tanh^2(x) = 1 – \left(\frac{e^x – e^{-x}}{e^x + e^{-x}}\right)^2 = \frac{(e^x + e^{-x})^2 – (e^x – e^{-x})^2}{(e^x + e^{-x})^2} = \frac{4}{(e^x + e^{-x})^2} \end{equation} $$
2つの経路が同じ答えに到達しました。どちらの方法でも $\tanh'(x) = 1 – \tanh^2(x)$ が得られます。
tanh 微分の早見 — よく聞かれる計算をまとめる
「tanh 微分」「tanhx 微分」と検索している方のために、よく使う計算をまとめます。
基本の微分公式
$$ \boxed{\frac{d}{dx}\tanh(x) = 1 – \tanh^2(x) = \operatorname{sech}^2(x)} $$
合成関数の微分($ax$ を引数にとる場合)
$f(x) = \tanh(ax)$ のとき、連鎖律(chain rule)で $u = ax$ とおくと $du/dx = a$ なので、
$$ \begin{equation} \frac{d}{dx}\tanh(ax) = a \cdot \left(1 – \tanh^2(ax)\right) \end{equation} $$
具体的な点での値
| $x$ | $\tanh(x)$ | $\tanh'(x) = 1 – \tanh^2(x)$ |
|---|---|---|
| $0$ | $0.0000$ | $1.0000$(最大値) |
| $\pm 0.5$ | $\pm 0.4621$ | $0.7864$ |
| $\pm 1.0$ | $\pm 0.7616$ | $0.4200$ |
| $\pm 2.0$ | $\pm 0.9640$ | $0.0707$ |
| $\pm 3.0$ | $\pm 0.9951$ | $0.0099$ |
$x = \pm 2$ では微分が $0.0707$ と最大値の約 $7\%$、$x = \pm 3$ では約 $1\%$ まで落ちています。飽和域でいかに微分が小さくなるかが数字で確認できます。
公式の形を見ると、微分の挙動が読めます。$\tanh(x)$ は $(-1, 1)$ の値なので $\tanh^2(x)$ は $[0, 1)$。したがって $1 – \tanh^2(x)$ は $(0, 1]$ の範囲です。$x = 0$ では $\tanh(0) = 0$ なので微分は最大値 $1$、$|x|$ が大きくなると $\tanh^2 \to 1$ なので微分は $0$ に近づきます。グラフで確認しましょう。

紫の曲線が微分 $\tanh'(x) = 1 – \tanh^2(x)$ です。原点で最大値 $1$ をとり、両側へ向かってベル型に $0$ へ落ちていきます。tanh のカーブが平らになる(飽和する)領域では、微分がほぼ $0$ になっているのが読み取れます。この「両端で微分が消える」性質が、後で出てくる勾配消失問題の正体です。
公式が本当に正しいか、数値微分(差分)と比べて確かめてみましょう。

紫の実線が公式 $1 – \tanh^2(x)$、オレンジの点が中心差分 $(\tanh(x+h) – \tanh(x-h)) / 2h$ による数値微分です。両者は完全に重なっています。実際、後の実装節で最大誤差が $10^{-11}$ 程度であることを確認します。これで微分公式の正しさが裏付けられました。
微分が「原点で $1$」ということは、原点付近では tanh がほぼ傾き $1$ の直線だということです。これをテイラー展開で精密に見てみましょう。
テイラー展開:原点付近では $\tanh(x) \approx x$
tanh は奇関数なので、テイラー展開には奇数次の項しか現れません。原点まわりで展開すると、
$$ \begin{equation} \tanh(x) = x – \frac{x^3}{3} + \frac{2x^5}{15} – \frac{17x^7}{315} + \cdots \end{equation} $$
となります。最も重要なのは最初の項で、$x$ が $0$ に十分近いとき高次の項は無視でき、
$$ \begin{equation} \tanh(x) \approx x \quad (|x| \ll 1) \end{equation} $$
が成り立ちます。これは「原点付近では tanh は傾き $1$ の直線とほぼ同じ」という、先ほどの微分の話と一致します。近似の精度をグラフで見てみましょう。

青の太線が真の $\tanh(x)$、オレンジの破線が1次近似 $x$、緑の破線が3次近似 $x – x^3/3$ です。原点近く($|x| < 0.5$ 程度)では1次近似 $x$ でも真の値とよく合っていますが、$|x|$ が大きくなると直線 $x$ はどんどんずれていきます。3次まで取ると合う範囲が広がります。実際 $x = 0.5$ では $\tanh(0.5) = 0.46212$ に対し3次近似は $0.45833$ で、小数2桁まで一致します。
このテイラー展開から得られる近似精度を数値で確認します。
| $x$ | 1次近似 $x$ | 3次近似 $x – x^3/3$ | 5次近似 $x – x^3/3 + 2x^5/15$ | 真値 $\tanh(x)$ |
|---|---|---|---|---|
| $0.1$ | $0.10000$ | $0.09967$ | $0.09967$ | $0.09967$ |
| $0.3$ | $0.30000$ | $0.29100$ | $0.29132$ | $0.29131$ |
| $0.5$ | $0.50000$ | $0.45833$ | $0.46250$ | $0.46212$ |
| $1.0$ | $1.00000$ | $0.66667$ | $0.80000$ | $0.76159$ |
$x = 0.3$ 程度では3次近似が小数4桁まで一致しますが、$x = 1.0$ になると誤差が顕著です。$x = 2.0$ では3次近似が負の値($-0.667$)になり真値($0.964$)とかけ離れる点も注目です。テイラー展開は局所的な近似なので、飽和域では使えません。
このテイラー展開は、活性化関数として tanh を使う際の「入力が小さいときは線形に振る舞う」という性質を裏付けています。では、活性化関数としての tanh の長所と短所を整理しましょう。
活性化関数としての性質 — 0中心と勾配消失
ニューラルネットの各ニューロンは「入力の重み付き和」を計算し、それを活性化関数に通して非線形性を与えます。tanh を活性化関数として使うときの性質は、長所と短所の両面があります。
長所:出力が0中心で学習が速い
tanh の出力は $(-1, 1)$ で、平均的に $0$ を中心に分布します。一方シグモイドの出力は $(0, 1)$ で、常に正の値しか出しません。これが学習速度に効いてきます。
ある層の出力(次の層への入力)が常に正だと、その層の重みに対する勾配の符号がすべて同じ向きにそろってしまい、重みの更新が「ジグザグ」に進んで収束が遅くなることが知られています。tanh の出力は正にも負にもなるので、勾配の符号がそろわず、より素直な方向へ重みを更新できます。これが「0中心の活性化関数は学習が速い」と言われる理由です。先ほど導いた $\tanh(x) = 2\sigma(2x) – 1$ の「$-1$ だけ下にずらす」操作が、まさにこの0中心化を作っているわけです。
短所:勾配消失問題と数式的説明
tanh の微分は両端で $0$ に近づくのでした。これは深いネットワークで深刻な問題を引き起こします。

赤くハイライトした「飽和域」($|x|$ が大きい領域)では、勾配 $\tanh'(x)$ がほぼ $0$ です。誤差逆伝播では、層をさかのぼるたびに各層の微分を掛け合わせていきます。$1$ より小さい値(多くの場合かなり $0$ に近い値)を何度も掛けると、勾配は指数的に小さくなり、入力に近い層までほとんど誤差が届かなくなります。これが 勾配消失問題(vanishing gradient problem) です。tanh は微分の最大値が $1$ なのでシグモイド(最大 $0.25$)よりはマシですが、それでも飽和域では勾配が消えます。
勾配消失の数式的な理解:$L$ 層のニューラルネットで、第 $l$ 層の活性化関数への入力を $z^{(l)}$ とすると、誤差逆伝播では損失 $\mathcal{L}$ の第 $1$ 層への勾配は
$$ \begin{equation} \frac{\partial \mathcal{L}}{\partial z^{(1)}} = \frac{\partial \mathcal{L}}{\partial z^{(L)}} \cdot \prod_{l=2}^{L} \frac{\partial z^{(l)}}{\partial z^{(l-1)}} \end{equation} $$
という積の形になります。各因子 $\partial z^{(l)} / \partial z^{(l-1)}$ には tanh の微分 $\tanh'(z^{(l-1)}) = 1 – \tanh^2(z^{(l-1)})$ が含まれます。問題は「各層の入力 $z^{(l)}$ が飽和域に入ると、その層での因子がほぼ $0$ になる」ことです。
具体的な数値で確かめます。入力が飽和域 $x = 3.0$ にある場合、$\tanh'(3.0) = 1 – (0.9951)^2 = 0.0099$ です。5層それぞれで同じ飽和が起きていると、
$$ \begin{equation} \prod_{l=2}^{6} \tanh'(3.0) = (0.0099)^5 \approx 9.3 \times 10^{-11} \end{equation} $$
となり、勾配は $10^{-10}$ オーダーまで消えます。一方、中間域 $x = 0.5$ では $\tanh'(0.5) = 0.7864$ で、5層後も $(0.7864)^5 \approx 0.301$ と約 $30\%$ が残ります。飽和域に押し込まれた場合の勾配消失の激しさが数値でわかります。
この問題を根本から解決するために登場したのが ReLU であり、また LSTM では勾配が消えにくい「記憶セル」を別に設けることでこの問題を緩和しています。
この勾配消失を緩和するために登場したのが ReLU です。3つの活性化関数を比較してみましょう。

左が関数本体、右がそれぞれの微分です。比較のポイントは次のとおりです。
- 値域:tanh は $(-1, 1)$ で0中心、シグモイドは $(0, 1)$、ReLU は $[0, \infty)$ で上限なし。
- 微分の最大値:tanh は $1$、シグモイドは $0.25$、ReLU は正の領域で常に $1$。微分が小さいほど勾配消失が起きやすいので、シグモイドが最も不利です。
- 飽和:tanh とシグモイドは両端(ReLU は負側)で微分が $0$ になり勾配が消えます。一方 ReLU は正の領域で微分が常に $1$ なので、いくら層を重ねても正の入力側では勾配が減衰しません。これが深い畳み込みネットで ReLU が標準になった理由です。
- 計算コスト:ReLU は $\max(0, x)$ だけなので指数関数を含む tanh・シグモイドより圧倒的に軽い。
3つの活性化関数の性質を表にまとめます。
| 比較項目 | tanh | シグモイド $\sigma$ | ReLU |
|---|---|---|---|
| 出力範囲 | $(-1, 1)$ | $(0, 1)$ | $[0, \infty)$ |
| 0中心かどうか | はい(平均 $0$) | いいえ(平均 $0.5$) | いいえ(非負) |
| 微分の最大値 | $1.0$ | $0.25$ | $1.0$(正の領域) |
| 飽和域での勾配 | $\approx 0$(両端) | $\approx 0$(両端) | $0$(負の入力) |
| 計算コスト | 中(指数関数2回) | 中(指数関数1回) | 低($\max$のみ) |
| 負の値の出力 | あり | なし | なし |
| 主な用途 | RNN/LSTM の状態更新 | ゲート・2値分類の出力層 | CNN の中間層 |
表を見ると、tanh が「微分の最大値」でシグモイドに勝り、「0中心」でシグモイドにも ReLU にも勝っていることがわかります。一方、計算コストは ReLU には及びません。つまり、深い順伝播型ネットワーク(CNN など)では勾配消失と計算コストの点で ReLU が有利、値を $(-1, 1)$ に抑えたい場面(RNN/LSTM のセル状態更新など)では tanh が有利、という使い分けになります。では、tanh が今も主役を張る RNN/LSTM での役割を見てみましょう。
RNN / LSTM での tanh の役割
RNN は前のステップの隠れ状態を次に渡して時系列を処理します。このとき値が際限なく大きくなると計算が破綻するので、毎ステップ tanh で $(-1, 1)$ に押し込んで「暴走」を防ぎます。tanh が0中心であることも、状態が一方向に偏らない点で都合がよいのです。
最も基本的な RNN のステップを数式で確認します。時刻 $t$ の隠れ状態 $h_t$ は、前の状態 $h_{t-1}$ と入力 $x_t$ の重み付き和を tanh に通して作られます。
$$ \begin{equation} h_t = \tanh(W_h h_{t-1} + W_x x_t + b) \end{equation} $$
ここで $W_h, W_x$ は学習パラメータ、$b$ はバイアスです。tanh を外すと $h_t$ は線形写像の繰り返しになり、長いシーケンスでは行列の累乗が発散または消失します。tanh を挟むことで値を $(-1, 1)$ に抑え、繰り返しても状態が安定します。ただし、これはあくまで値の暴走を防ぐだけで、勾配の消失問題は依然として残ります。この限界を克服したのが LSTM です。
LSTM ではこの役割がもっと明確です。LSTM のセルには「ゲート」と呼ばれる蛇口がいくつもあり、ここで シグモイド $\sigma$ と tanh を役割分担 させています。

この図が示す使い分けが LSTM 理解の核心です。
- シグモイド $\sigma$(出力 $0 \sim 1$)= ゲート:忘却ゲート・入力ゲート・出力ゲートに使われます。$0$ なら「情報を完全に遮断」、$1$ なら「完全に通す」という、情報をどれだけ通すかを決める 蛇口の開き具合 を表します。$0 \sim 1$ という値域がまさに「割合」として自然なので、ゲートにはシグモイドが向いています。
- tanh(出力 $-1 \sim 1$)= 値そのもの:セル状態に足し引きする「中身(候補値)」を作る部分と、セル状態を出力する部分に使われます。記憶に対してプラスにもマイナスにも働けるよう、正負両方を出せる tanh が選ばれます。
「ゲート(割合)には $\sigma$、中身(値)には tanh」という分担を押さえれば、LSTM の複雑な数式もぐっと読みやすくなります。LSTM の各ゲートを数式で書くと次のとおりです。
$$ \begin{align} f_t &= \sigma(W_f [h_{t-1}, x_t] + b_f) \quad &\text{(忘却ゲート:前の記憶をどれだけ残すか)}\\ i_t &= \sigma(W_i [h_{t-1}, x_t] + b_i) \quad &\text{(入力ゲート:新情報をどれだけ取り込むか)}\\ \tilde{C}_t &= \tanh(W_C [h_{t-1}, x_t] + b_C) \quad &\text{(候補値:$(-1,1)$ の中身)}\\ C_t &= f_t \odot C_{t-1} + i_t \odot \tilde{C}_t \quad &\text{(セル状態の更新)}\\ o_t &= \sigma(W_o [h_{t-1}, x_t] + b_o) \quad &\text{(出力ゲート:何を外に出すか)}\\ h_t &= o_t \odot \tanh(C_t) \quad &\text{(隠れ状態:セル状態を $(-1,1)$ に圧縮)} \end{align} $$
$\sigma$ が登場するゲート($f_t, i_t, o_t$)はすべて「割合」の役割で、値が $0$ なら遮断・$1$ なら全通しという蛇口です。tanh が登場する $\tilde{C}_t$ と $h_t$ はどちらも「中身(量)」の役割で、正にも負にもなれる $(-1, 1)$ の値を扱います。tanh の値域 $(-1,1)$ と0中心という性質が、なぜこの関数が選ばれているのかの答えになっているわけです。
理論が一通り整理できたので、最後に Python で実装し、ここまでの主張を数値で確かめましょう。
Python での実装と数値検証
NumPy で tanh の順伝播と微分を実装し、(1) 微分公式が数値微分と一致すること、(2) シグモイドとの関係式が成り立つこと、(3) tanh の微分の最大値がシグモイドより大きいこと、(4) 勾配消失の定量確認の4点を検証します。
import numpy as np
def tanh(x):
return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))
def tanh_grad(x): # 公式: 1 - tanh^2(x)
return 1.0 - tanh(x) ** 2
def sigmoid(x):
return 1.0 / (1.0 + np.exp(-x))
x = np.linspace(-6, 6, 2000)
# (1) 微分公式 vs 数値微分(中心差分)
h = 1e-5
num_grad = (tanh(x + h) - tanh(x - h)) / (2 * h)
err_grad = np.max(np.abs(num_grad - tanh_grad(x)))
print("微分公式と数値微分の最大誤差:", "{:.2e}".format(err_grad))
# (2) tanh(x) = 2*sigmoid(2x) - 1
err_id = np.max(np.abs(tanh(x) - (2 * sigmoid(2 * x) - 1)))
print("恒等式 tanh(x)=2σ(2x)-1 の最大誤差:", "{:.2e}".format(err_id))
# (3) 微分の最大値の比較
print("tanh の微分の最大値 :", round(tanh_grad(x).max(), 4))
print("sigmoid の微分の最大値:", round((sigmoid(x) * (1 - sigmoid(x))).max(), 4))
# (4) 勾配消失の定量確認(5層ネットで飽和域 vs 中間域)
n_layers = 5
x_sat = 3.0 # 飽和域
x_mid = 0.5 # 中間域
grad_sat = tanh_grad(x_sat) ** n_layers
grad_mid = tanh_grad(x_mid) ** n_layers
print(f"\n飽和域 (x={x_sat}) での1層あたりの勾配: {tanh_grad(x_sat):.4f}")
print(f" {n_layers}層後の勾配の積: {grad_sat:.2e}")
print(f"中間域 (x={x_mid}) での1層あたりの勾配: {tanh_grad(x_mid):.4f}")
print(f" {n_layers}層後の勾配の積: {grad_mid:.4f}")
このコードの出力は次のようになります。
微分公式と数値微分の最大誤差: 3.82e-11
恒等式 tanh(x)=2σ(2x)-1 の最大誤差: 4.44e-16
tanh の微分の最大値 : 1.0
sigmoid の微分の最大値: 0.25
飽和域 (x=3.0) での1層あたりの勾配: 0.0099
5層後の勾配の積: 9.35e-11
中間域 (x=0.5) での1層あたりの勾配: 0.7864
5層後の勾配の積: 0.3008
結果から4つのことが確認できます。第一に、微分公式 $1 – \tanh^2(x)$ と数値微分の誤差は $10^{-11}$ 程度で、公式が正しいことが裏付けられました。第二に、恒等式 $\tanh(x) = 2\sigma(2x) – 1$ の誤差は浮動小数点の限界($10^{-16}$)まで小さく、導出が正確だったことがわかります。第三に、tanh の微分の最大値 $1.0$ はシグモイドの $0.25$ の4倍であり、tanh のほうが勾配消失に強い(誤差をより大きく後ろへ伝えられる)ことが数値で確認できました。第四に、飽和域($x = 3.0$)で5層分の勾配の積が $9.35 \times 10^{-11}$ まで消えているのに対し、中間域($x = 0.5$)では $0.3008$ と約 $30\%$ が残っており、飽和域への入力が勾配消失を引き起こす様子が数値で裏付けられました。
次に、深層学習フレームワークの PyTorch では tanh が組み込み関数として用意されており、自動微分で勾配も得られます。手書きの微分公式と一致するかを確かめます。
import torch
x = torch.linspace(-6, 6, 9, requires_grad=True)
y = torch.tanh(x)
y.sum().backward() # 各 x について dy/dx を自動微分で計算
manual = 1.0 - torch.tanh(x) ** 2 # 公式による微分
print("autograd の勾配:", x.grad.detach().numpy().round(4))
print("公式 1-tanh^2 :", manual.detach().numpy().round(4))
print("一致:", torch.allclose(x.grad, manual))
出力は次のとおりです。
autograd の勾配: [0. 0.0005 0.0099 0.1807 1. 0.1807 0.0099 0.0005 0. ]
公式 1-tanh^2 : [0. 0.0005 0.0099 0.1807 1. 0.1807 0.0099 0.0005 0. ]
一致: True
PyTorch の自動微分が返す勾配と、手で導いた公式 $1 – \tanh^2(x)$ の値が完全に一致しました(torch.allclose が True)。配列の中央($x = 0$)で勾配が $1.0$ と最大になり、両端($x = \pm 6$)では $0.0$ まで落ちていることも読み取れます。これは勾配消失の可視化図とまったく同じ挙動で、「飽和域では勾配が消える」という性質がフレームワーク上でも確かめられました。実装でも tanh のすべての性質が理論どおりであることが確認できたわけです。
まとめ
本記事では、tanh(双曲線正接関数)について基礎から解説しました。要点を振り返ります。
- 定義:$\tanh(x) = \sinh(x)/\cosh(x) = (e^x – e^{-x})/(e^x + e^{-x})$。指数関数の差と和の比で、値域は $(-1, 1)$、奇関数(原点対称)、$y = \pm 1$ を漸近線にもつ。
- 双曲線恒等式:$\cosh^2(x) – \sinh^2(x) = 1$。定義式を展開すると $(e^{2x} + 2 + e^{-2x}) – (e^{2x} – 2 + e^{-2x}) = 4$ の相殺から導ける。
- シグモイドとの関係:$\tanh(x) = 2\sigma(2x) – 1$。tanh は「中心を $0$ にずらしたシグモイド」。1行ずつの代数変形で確認できる。
- 微分公式:$\tanh'(x) = 1 – \tanh^2(x) = \operatorname{sech}^2(x)$。原点で最大 $1$、両端で $0$。商の微分と指数関数から直接の2通りで導出できる。
- 勾配消失の定量:飽和域($x = 3.0$)で5層後の勾配積は $\approx 10^{-10}$。中間域($x = 0.5$)では $0.30$ 残る。飽和が問題の本体。
- テイラー展開:$\tanh(x) = x – x^3/3 + \cdots$ より、原点付近では $\tanh(x) \approx x$。$x = 0.3$ 以下では3次近似で小数4桁一致。
- 活性化関数比較:tanh は0中心(学習速度)でシグモイドに勝り、微分最大値 $1.0$(勾配消失強さ)でシグモイド($0.25$)の4倍。計算コストは ReLU より大きい。
- 使い分け:深い順伝播型ネット(CNN)では ReLU が優勢。RNN/LSTM のセル状態更新や候補値生成では tanh が現在も主役。LSTM では「ゲート(割合)= $\sigma$、中身(値)= tanh」の役割分担。
tanh を理解すると、RNN や LSTM の数式が「なぜこの関数なのか」という視点で読めるようになります。次のステップとして関連記事も合わせてご覧ください。
