ホーム >  C# >  【ニューラルネットワーク】シグモイド関数(活性化関数)を微分するとこうなる【数学】

投稿日:   |  最終更新日:

【ニューラルネットワーク】シグモイド関数(活性化関数)を微分するとこうなる【数学】

C#Python数学機械学習

C#で、ニューラルネットワークのライブラリを作成します。

シグモイド関数とは何か?

以下のような形で示す関数です。

\[
f(x) =
\frac{1}{1+e^{-x}}
\]

ニューラルネットワークの活性化関数でよく使われます。ニューラルネットワークの学習で最急降下法を使う時に微分が必要になります。

入力値の合計を受け取り、合計がある値を超えたら大きな値を、超えなければゼロまたは小さな値を出力します。これは、一定以上の力を加えなければONにならないスイッチの動きに似ています。活性化関数は、計算のしやすさや扱うデータの種類に合わせて色々なものが考案されています。その中で今回は定番の一つであるものが「シグモイド関数」です。

シグモイド関数を微分する理由

ニューラルネットワークプログラムの最終工程で使用します。ノードの誤差を計算したら、調整値を算出してエッジの重みを更新する作業を行います。このとき調整値の算出にシグモイド関数の微分を行います。

例えば、C#でシグモイド関数とシグモイド関数の微分のFunctionを作ると、以下のように表すことができます。

//シグモイド関数
public double Activation (double val)
{
   return 1.0 / (1.0 + Math.Exp(-val));
}

//シグモイド関数を微分した関数
public double DActivation (double val)
{
   return (1.0 - val) * val;
}

前提知識

xのn乗の微分公式

xのn乗を微分したとき、以下の式が成り立ちます。
\[
(x^{n})′=nx^{n-1}
\]
(※nは実数) 

合成関数の微分

yがuの関数で、uがxの関数であるとき、yをxで微分したものは以下のようになります。

\[
\frac{dy}{dx}=
\frac{dy}{du}・\frac{du}{dx}
\]

例)以下の式を微分します。

\[
y=(x^{2}+3x+1)^{4}
\]

①以下のように式変換します。

\[
u=x^{2}+3x+1
\]

すると以下のようになります。

\[
y=u^{4}
\]

②yをuで微分します。すると以下のようになります。

\[
\frac{dy}{du}=4u^{3}
\]

④次にuをxで微分します。すると以下のようになります。

\[
\frac{du}{dx}=2x+3
\]

⑤よって、求めたい微分は合成関数の微分公式を使うと以下のようになります。

\[
\frac{dy}{dx}
=\frac{dy}{du}・\frac{du}{dx}
\]
\[
=4u^{3}(2x+3)
\]
\[
=4(x2+3x+1)^{3}(2x+3)
\]

eの-x乗は微分しても-x乗

eの微分公式

\[
(e^{x})′=e^{x}
\]

符号違いのもう一つ公式を求めます。

\[
(e^{-x})′=−e^{-x}
\]

を以下の式をxで微分する場合、合成関数を使います。

\[
y=e^{-x}
\]

①以下のように式変換します。

\[
u=e^{x}
\]

②すると以下のようになります。

\[
y=u^{-1}
\]

③①と②をそれぞれ微分します。

①をxでを微分:

\[
u’=e^{x}
\]

(※e^xは微分しても変わらないため。)

②をyでを微分:

\[
y’=-u^{-2}
\]

④uをもとに戻します。

\[
y’=-e^{-2x}
\]

⑤合成関数の微分の公式により、2つの微分した式どうしを掛けます。

\[
\frac{du}{dx}=-e^{-2x}・e^{x}
\]
\[
=-e^{-2x+1x}=-e^{-x}
\]


シグモイド関数の微分の計算式

以下のシグモイド関数を微分します。

\[
f(x) =
\frac{1}{1+e^{-x}}
\]

①このまま微分だと複雑なので、分数を以下のように変形します。

\[
f(x)=(1+e^{-x})^{-1}
\]

②合成関数の微分の公式を使うため、以下のように置き換えます。

\[
u=1+e^{-x}
\]

\[
f(x)=u^{-1}
\]

すると、以下のように表現できます。

\[
f′(x)=f′(u)\frac{du}{dx}
\]

③次にそれぞれについて微分を行います。

\[
f′(u)=−u^{-2}=−(1+e^{−x})^{-2}
\]

eの-x乗は、微分してもeの-x乗のため、以下のようになります。

\[
\frac{du}{dx}=e^{−x}
\]

④微分した2つの式を代入すると、以下の式に変換できます。

\[
f′(x)=f′(u)\frac{du}{dx}
\]
\[
=−(1+e^{−x})^{−2}・e^{−x}
\]
\[
=-\frac{e^{−x}}{(1+e^{−x})^{2}}
\]

⑤以下のように変形します。

\[
f′(x)=\frac{e^{−x}}{(1+e^{−x})}・\frac{1}{(1+e^{−x})}
\]

⑥⑤右辺の左側を変形します。

\[
\frac{e^{−x}}{(1+e^{−x})}=\frac{1}{(1+e^{−x})}(e^{−x}+1-1)
\]
\[
=\frac{1}{(1+e^{−x})}(1+e^{−x}-1)
\]
\[
=\frac{(1+e^{−x})}{(1+e^{−x})}-\frac{1}{(1+e^{−x})}
\]
\[
=1-\frac{1}{(1+e^{−x})}
\]

⑦⑤の式に当てはめます。

\[
f′(x)=(1-\frac{1}{(1+e^{−x})})・\frac{1}{(1+e^{−x})}
\]

ここで元々のf(x)が以下であることを思い出し代入すると以下のことが証明できます。

\[
f(x)=\frac{1}{(1+e^{−x})}
\]

\[
f′(x)=(1−f(x))f(x)
\]

Pythonのソースコード

import numpy as np
from pylab import *

def sigmoid(x):
	return 1.0 / (1.0 + np.exp(-x))

def sigmoidPlot():
	x = np.arange(-5.0, 5.0, 0.1)
	y = sigmoid(x)

	plot(x,y)
	show()

if __name__ == '__main__':
	sigmoidPlot()

次回

工事中。


トラックバック用のURL
プロフィール

名前:イワサキ ユウタ 職業:システムエンジニア、ウェブマスター、フロントエンドエンジニア 誕生:1986年生まれ 出身:静岡県 特技:ウッドベース 略歴 20

最近の投稿
人気記事
カテゴリー
広告