シグモイド関数の微分(導関数)を導出してグラフ化する

Posted: , Category: 深層学習

深層学習で登場するシグモイド関数の数式とその導関数を、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で、左右対称に下がっているようなグラフになりました。

【広告】
統計学的にあなたの悩みを解決します。
仕事やプライベートでお悩みの方は、ベテラン占い師 蓮若菜にご相談ください。

機械学習と情報技術