深層学習で登場するシグモイド関数の数式とその導関数を、Pythonを用いてグラフ化・可視化していきます。
シグモイド関数自体は、深層学習では活性化関数として広く利用されており、誤差逆伝搬においては、その導関数の性質から、勾配消失と呼ばれるような問題の議論になったりしています。
今回はシグモイド関数の微分を求めていきましょう。
シグモイド関数の数式
まず、シグモイド関数の数式はこのようになっています。
シグモイド関数の定義
\begin{equation} f(x) = \frac{1}{ 1 + exp(-x)} \end{equation}
グラフ化すると次のようになります。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10, 10, 100)
def sigmoid(x):
return 1 / (1 + np.exp(-x))
y = sigmoid(x)
fig, ax = plt.subplots(figsize=(6,3), dpi=100)
ax.set_ylim([-0.1, 1.1])
ax.set_title("sigmoid function")
ax.plot(x, y)
シグモイド関数の微分(導関数)を求める
続いて、シグモイド関数の微分(導関数)を求めていきましょう。シグモイド関数の微分を求めるには、合成関数の微分を利用します。
シグモイド関数の導関数の導出
シグモイド関数
f(x) = \frac{1}{ 1 + exp(-x)}
において、次のようにおく。
\begin{split} f(x) &= \frac{1}{u(x)} \\ u(x) &= 1 + e^{-x} \end{split}
すると、合成関数の微分から、
\begin{split} \frac{dy}{dx} &= \frac{dy}{du}\frac{du}{dx} \\ &= - u(x)^{-2} - e^{-x} \\ &= \frac{e^{-x}}{(1+e^{^{-x}})^2} \\ &= \frac{1}{(1+e^{^{-x}})} \biggr \{ \frac{1 + e^{-x} - 1}{(1+e^{^{-x}})} \biggr \} \\ &= \frac{1}{(1+e^{^{-x}})} \biggr \{ 1- \frac{1}{(1+e^{^{-x}})} \biggr \} \\ &= f(x) (1 - f(x)) \end{split}
となります。
シグモイド関数の導関数
シグモイド関数を$f(x)$とすると、その導関数$f'(x)$は、次のようになる。
\begin{equation} \begin{split} f'(x) &= \frac{1}{(1+e^{^{-x}})} \biggr \{ 1- \frac{1}{(1+e^{^{-x}})} \biggr \} \\ &= f(x) (1 - f(x)) \end{split} \end{equation}
導関数の中にシグモイド関数が登場しましたね。このような形になるのがシグモイド関数です。
この導関数を可視化して、グラフにしてみましょう。
def sigmoid_derivative(x):
return sigmoid(x) * (1 - sigmoid(x))
x = np.linspace(-10, 10, 100)
y = sigmoid_derivative(x)
fig, ax = plt.subplots(figsize=(6,3), dpi=100)
ax.set_title("sigmoid function derivative")
ax.plot(x, y)
このようになりました。最大値が0.25で、左右対称に下がっているようなグラフになりました。