深層学習の勉強をしていると、LSTMやRNNなどの活性化関数として、tanh(双曲線正接関数、ハイパボリックタンジェント関数)が頻出します。
tanhという略語に初めて出会った人は、少し面食らってしまう人もいるのではないでしょうか。
今回は、このtanhについてわかりやすく解説します。
tanhの定義
まず、tanhは活性化関数の1つです。ReLUやsigmoidと同じ位置付けであることを意識してください。
tanhの関数系は次のようになっています。
tanhの関数系
\begin{equation} \begin{split} tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} \end{split} \end{equation}
tanhを可視化する
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(figsize=(10, 3), dpi=120)
x = np.linspace(-10, 10, 100)
def tanh(x):
return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))
y_tanh = tanh(x)
ax.plot(x, y_tanh, label="tanh function")
ax.legend()
tanhの微分形
証明は省略しますが、tanhの微分形は次のようになります。
tanhの微分
\begin{equation} \begin{split} tanh'(x) &= {= 1 - (\frac{e^x - e^{-x}}{e^x + e^{-x}})^2} \\ &= 1 - \{tanh(x) \}^2 \end{split} \end{equation}
この$tanh(x)$の微分系は、ニューラルネットワークの誤差逆伝搬法にも頻繁に登場するので、この微分系は覚えておくとよいでしょう。
tanhとsigmoid関数の比較
活性化関数の値として、0~1の値を返すシグモイド関数と、今回のtanh関数を比較してみます。
グラフを見るとわかると思いますが、xの極限においては、tanhは次のようになります。
\begin{split} \lim_{x \rarr \infin} tanh(x) &= 1 \\ \lim_{x \rarr -\infin} tanh(x) &= -1 \end{split}
シグモイド関数が0~1の範囲で値をとるのに対し、tanhは[-1, 1]の範囲で値をとることがわかります。