デジタル・デザイン・ラボラトリーな日々

アラフィフプログラマーが数学と物理を基礎からやり直す。https://qiita.com/yaju

シグモイド関数を理解してみる

はじめに

機械学習の学習すると必ず出てくる用語にシグモイド関数があります。
今回はこれを理解してみたいです。

シグモイド曲線

シグモイド曲線は入力した値を0から1の間に収めてくれる関数の1つです。
多くの自然界に存在する事柄は、このようなS字曲線を取ります。
欠点として1に近づくほど1そのものにならない性質があります。

使う理由

分類した場合に「1」と「-1」という2択ではなく、シグモイド関数は確率で分類すると考えます。
Aの確率が80%で、Bの確率が20%といった感じで分類していきます。
シグモイド曲線の値は 0 から 1 の間になるので確率として使用できます。

数式

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

グラフ

f:id:Yaju3D:20170602002203p:plain

下図に示すステップ関数(step function)を滑らかにしたものであると見なすことができる。
f:id:Yaju3D:20170603024904p:plain

シグモイド関数の性質

いいサイトがあった。 risalc.info

単調増加性

数学での単調とは「上がったり下がったりがない」という意味です。
放物線は、単調減少と単調増加があります。
f:id:Yaju3D:20181104162349p:plain

シグモイド関数は、S字を描きますが徐々に上がり続けて下がりませんよね。

シグモイド関数微分

前提

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

結論

f(x)=sigmoid(x) とした時、
f(x)′=f(x)(1−f(x))

導出

逆数の微分

まず、逆数の微分公式を確認しておきます。
\displaystyle \left(\frac {1}{f}\right)^{\prime}=\frac{−f^{\prime}}{f^{2}} です。
逆数の微分公式の証明:「 商の微分公式の証明と例題

シグモイド関数1+exp(−x) の逆数なので
f^{\prime}(x)=\left(\displaystyle \frac {1}{1+exp(−x)}\right)^{\prime}

=\displaystyle \frac{-(1-exp(-x))^{\prime}}{(1+exp(-x))^{2}}

=\displaystyle \frac {exp(−x)}{\left(1+exp(−x)\right)^{2}}

=\displaystyle \frac {1}{1+exp(−x)} \frac {exp(−x)}{1+exp(−x)}

=\displaystyle \frac {1}{1+exp(−x)} \left(\frac {1+exp(−x)}{1+exp(−x)}−\frac {1}{1+exp(−x)}\right)

=\displaystyle \frac {1}{1+exp(−x)} \left(1−\frac {1}{1+exp(−x)}\right)

ここで、
f(x)=\displaystyle \left(\frac {1}{1+exp(x)}\right)
であるから、式を当てはめると

=f(x)\left(1−f(x)\right)

使い道

シグモイド関数微分(f(x)\left(1−f(x)\right) )はどこに使われるのか、最急降下法(勾配降下法)や 誤差逆伝播法(バックプロパゲーション)にてパラメーターの更新に使われます。

ロジスティック回帰との関係

ロジスティック回帰は、以下の数式で表現できます。

y=\displaystyle \frac {1} {1+exp(-(b_{1}X_{1}+b_{2}X_{2}+b_{3}X_{3}+ \cdots  + b_{i}X{i}+b_{0}))}

シグモイド関数と同じ形であり、数式の中の「b_{1}X_{1}+b_{2}X_{2}+b_{3}X_{3}+ \cdots  + b_{i}X{i}+b_{0}」という部分は重回帰分析と同じです。
よって、ロジスティック回帰のグラフを描くとシグモイド関数と同様になります。

ロジスティック回帰の最尤関数

統計学機械学習をを勉強していると「尤度(ゆうど)」という概念に出会います。
尤もらしい(もっともらしい)ということで、最尤度は最高にもっともらしいってことですね。
尤度とはある事象が観測された時、それぞれの事象の確率の確率分布関数のパラメータがどれだけ尤もらしいかを測る量で、事象の同時確率として定義されます。
※同時確率とは、サイコロを2回投げた場合、1回目に1の目が出て、2回目に2が出る確率は?って聞かれたら、まず\frac {1}{6}で1が出て、次に\frac {1}{6}で2が出て、それが続けて起こる確率は掛け算を使って、\frac {1}{6}\cdot\frac {1}{6}=\frac {1}{36}

回帰の時の2乗誤差だった場合は最小化した値を求めるのが目的だったのに対し、今考えるのは同時確率で確率が高くなって欲しいので最大化するのが目的になります。

上記のロジスティック回帰をシグマに展開すると下記式になります。
PD_{i}=\displaystyle \frac{1}{1+exp(-(b_{0}+ \displaystyle \sum_{p=1}^{K}b_{p}X_{i,p}))}

同時確率を一般式すると下記式になります。
L=\displaystyle \prod_{i=1}^{N}PD_{i}^{Y_i} \left(1-PD_{i}\right)^{1-Y_{i}}

掛け算というのは計算が大変なので、掛け算を足し算にする「対数」を使って尤度関数を表すと下記式になります。
L=\displaystyle \log \left(\prod_{i=1}^{N}PD_{i}^{Y_i} \left(1-PD_{i}\right)^{1-Y_{i}}\right)

=\displaystyle \sum_{i=1}^{N}\left(Y_{i}\cdot\log\left(PD_{i}\right)+\left(1-Y_{i}\right)\cdot\log\left( 1-PD_{i}\right)\right)

活性化関数として

人間の脳は神経細胞(ニューロン)のネットワークで構成されています。この最小単位の神経細胞(ニューロン)を模倣したモデルがパーセプトロンとなります。このモデルは入力値が閾値を超えた場合に「1」を出力(この場合を「ニューロンが発火する」と表現)し、そうでない場合は「0」を出力します。このように入力値から出力値を生むまでの計算を活性化関数と呼びます。

パーセプトロンでは活性化関数に下図のステップ関数(入力に対してある閾値を境に階段(ステップ)のように出力が1か0か決まる)を使っていました。
f:id:Yaju3D:20170603024904p:plain

ニューラルネットワークは学習をする際に微分を含む計算を行うため、微分するとゼロになるステップ関数は都合が悪いことからステップ関数に似た形で微分してもゼロにならないシグモイド曲線(sigmoid)などが使用されるようになりました。
微分するとゼロになると都合が悪いのは、値を微分値で更新しても同じ値のままになってしまうからです。

下図のExcelで、106行目の重みの値を更新する際に、前行(105行目)の重みと同行の赤枠「学習係数 x 勾配」の値を加算した値にします。
もし、勾配の値がゼロになってしまうと次の重みの値が更新されないため同じ値のままになり都合が悪くなります。
つまり、そこが正解値ならいいのですが、まだ途中段階で更新が止まってしまうのが良くないわけです。
f:id:Yaju3D:20181031012450p:plain

最後に

今回、シグモイド関数とロジスティック回帰の関係が分かりました。
自分がまだ微分の知識が足りてないってことが分かりました、数式はまだまだ苦手だな。