のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

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

Sponsored Links

皆さんこんにちは
お元気ですか。私は普通です。

さて、今日は以下のシグモイド関数を微分してみます。

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

以下のような形で示す関数です。ニューラルネットワークの活性化関数とかで使われます。
ニューラルネットワークの学習で最急降下法を使う時に微分が必要になります。
その他でも結構この関数の微分は扱われたりします。

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

f:id:tereka:20140628103627p:plain

※表示用のソースコードは一番下へ
微分したらこうなることが一般的に知られてますが、どうしてこうなるのでしょう?

{ \displaystyle
f'(x) = (1 - f(x))f(x)
}

微分の計算式

急にやりたくなったので、やってみた
久々に真面目に微分したので、色々間違ってたらすみません。

以前行った、最急降下法を

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

このまま微分だと面倒なので、はじめに式変形

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

合成微分の公式を使い

{ \displaystyle
u=1+e^{-x}
}

と置くと以下のように表現ができる。

{ \displaystyle
f'(x) = f'(u)\frac{du}{dx}
}

次にそれぞれについて微分を行う。

{ \displaystyle
f'(u) = -u = -(1+e^{-x})^2
}

{ \displaystyle
\frac{du}{dx} = e^{-x}
}

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

{ \displaystyle
f'(x) = -(1+e^{-x})^{-2} e^{-x}
}

上記の式を分数の形にすると

{ \displaystyle
f'(x) = \frac{1}{(1+e^{-x})^{2}}e^{-x}
}

更に式を変形する。

{ \displaystyle
f'(x) = \frac{e^{-x}}{(1+e^{-x})^{2}}
}

これから式を変換させます。
{ \displaystyle
f'(x) = \frac{e^{-x}}{1+e^{-x}}\frac{1}{1+e^{-x}}
}

左辺に着目して、左辺の式を変形します。

{ \displaystyle
\frac{e^{-x}}{1+e^{-x}} = \frac{1+e^{-x}}{1+e^{-x}} - \frac{1}{1+e^{-x}}
}

変形した左辺の式をf'(x)に代入すると以下のようになります。

{ \displaystyle
f'(x) = (\frac{1+e^{-x}}{1+e^{-x}} - \frac{1}{1+e^{-x}})\frac{1}{1+e^{-x}}
}

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

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

代入結果は以下の通り、よく知られている微分の値になりましたね。
{ \displaystyle
f'(x) = (1 - f(x))f(x)
}

ソースコード

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()