EurekaMoments

ロボットや自動車の自律移動に関する知識や技術、プログラミング、ソフトウェア開発について勉強したことをメモするブログ

機械学習に必要な数学の基本についての勉強メモ: シグモイド関数・ソフトマックス関数編

はじめに

前回の記事では、機械学習に必要な指数関数と対数関数の基本について勉強した事を書きました。

www.eureka-moments-blog.com

その応用として、今回の記事では、シグモイド関数・ソフトマックス関数について勉強した事のメモを書こうと思います。参考書籍は、例によって下記を参考にしています。

Pythonで動かして学ぶ! あたらしい機械学習の教科書

Pythonで動かして学ぶ! あたらしい機械学習の教科書

シグモイド関数とは

シグモイド関数は、下記のグラフのような、滑らかな階段のような関数である。

f:id:sy4310:20190217212435p:plain

また、数式では下記のように定義される。


y = \frac{1} {1 + e^ {-x}} = \frac{1} {1 + exp(-x)}

シグモイド関数は、負から正の実数を0から1までの間に変換するものなので、確率を表す時によく使われる。

シグモイド関数の微分

シグモイド関数は、機械学習における分類問題や、ニューラルネットワークにおけるニューロンの特性を表す重要な関数として使われる。また、これらの分野ではシグモイド関数の微分が使われ、それは下記のように導出される。

まず、f(x) = 1 + exp(-x)として下記の微分を考える。


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

この式でのf(x)の微分はf(x)' = -exp(-x)となるので、


y' = (\frac{1} {1 + exp(-x)})' = - \frac{-exp(-x)} {{(1 + exp(-x))} ^2}

となる。ここで、この式を下記のように変形する。


y' = \frac{1} {1 + exp(-x)}・\frac{1 + exp(-x) - 1} {1 + exp(-x)}


y' = \frac{1} {1 + exp(-x)}・(1 - \frac{1} {1 + exp(-x)})

すると、\frac{1} {1 + exp(-x)}はyそのものなので、最終的には下記のような形にすることができる。


y' = y(1 - y)

ソフトマックス関数とは

複数の値、x_kがあるとき、それらの大小関係を保ちながら、確率としての値(各値は0~1で、和が1)に変換する関数である。変数の数がKだとすると、ソフトマックス関数は下記のように表すことができる。


y_i = \displaystyle \frac{exp(x_i)}{\sum_{j=0}^{K-1} exp(x_j)}

例えばK=3として、3つの数、x_0, x_1, x_2があるとする。まずは、各x_iのexpの和をuとして、下記の式で求めておく。


u = exp(x_0) + exp(x_1) + exp(x_2)

そして、このuを利用して計算できる確率としての値、y_0, y_1, y_2は、下記のようになる。


y_0 = \displaystyle \frac{exp(x_0)}{u}, y_1 = \frac{exp(x_1)}{u}, y_2 = \frac{exp(x_2)}{u}

この時、x_2の値を1で固定して、x_0x_1をそれぞれ-4から4の範囲で変化させたとすると、それによるy_0y_1の値の変化は、下記のグラフのようになる。

f:id:sy4310:20190226215853p:plain

ソフトマックス関数の微分

まず下記のように、y_0x_0で偏微分する場合を考えてみる。


\displaystyle \frac{\sigma y_0}{\sigma x_0} = \frac{\sigma}{\sigma x_0} \frac{exp(x_0)}{u}

ここで、ux_0の関数であることを考慮して、f(x)=u=exp(x_0)+exp(x_1)+exp(x_2)g(x)=exp(x_0)とすると、偏微分は下記のように導出できる。


\displaystyle (\frac{g(x)}{f(x)})' = \frac{g'(x)f(x)-g(x)f'(x)}{f(x)^2} = \frac{exp(x_0)}{u}(\frac{u}{u}-\frac{exp(x_0)}{u})  
= y_0(1-y_0)

この形を見ると、これはシグモイド関数の微分と同じ形であることが分かる。
次に、y_0x_1で偏微分する場合を考えてみる。x_0での偏微分と同様に考えると、下記のように導出できる。


\displaystyle (\frac{g(x)}{f(x)})' = \frac{g'(x)f(x)-g(x)f'(x)}{f(x)^2} = -\frac{exp(x_0)}{u}\cdot\frac{exp(x_1)}{u}  
= -y_0 y_1

最後にこれらをまとめると、


\displaystyle \frac{\sigma y_i}{\sigma x_i} = y_i(I_{ij}-y_i)

とも表す事ができる。ここで、I_{ij}は、i=jの時に1、i \neq jの時に0となる関数である事を意味する。

ソフトマックス関数とシグモイド関数の関係

2変数の場合のソフトマックス関数は下記のようになる。


y = \displaystyle \frac{e^{x_0}}{e^{x_0}+e^{x_1}}

この式の分母分子にe^{-x_0}を掛けて整理すると、下記のように変形できる。


y = \displaystyle \frac{e^{x_0-x_0}}{e^{x_0-x_0}+e^{x_1-x_0}} = \frac{1}{1+e^{-(x_0-x_1)}}

ここで、x=x_0-x_1とおけば、下記のようなシグモイド関数になる。


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

以上の計算から、2変数のソフトマックス関数の入力であるx_0x_1を、その差分x=x_0-x_1で表したものがシグモイド関数であり、シグモイド関数を多変数に拡張したものがソフトマックス関数である、ということが言える。

サンプルコード

ここまで記載した各グラフを作成するPythonのサンプルコードは下記のGitHubリポジトリで公開しています。

github.com