徒然なるままにMake:

Fusion360 3Dプリンタ 電子工作 面白そうなモノづくりをやっていくブログ

ディープラーニングを始めてみる 5

前回

something-make.hatenablog.com

参考書はこれ

 

今回は活性化関数について

ニューラルネットワークに使われる主な活性化関数はシグモイド関数

h x = 1 1 + exp - x

 を使うことが多い。

このグラフは

f:id:something-make:20180917135023p:plain

こんな形状のグラフになる。

 

一方、これまでパーセプトロンで使っていた活性化関数はステップ関数と呼ばれ入力が0を超えたら1を出力し、それ以外では0を出力する。パーセプトロンニューラルネットワークの大きな違いはここにある。

 

f:id:something-make:20180917135208p:plain

二つを重ねて比べてみるとこんな感じ

・滑らかさが違う。シグモイド関数はステップ関数に比べて滑らか

シグモイド関数はステップ関数と違い、1と0の中間の値、0.8等も出す

f:id:something-make:20180917145406p:plain

ちなみに、二つに共通する特徴として

・どれだけ大きい値を入力してもかならず0から1の間の値を返す

というものがあります。

 

さらに最近使われる活性化関数にReLU(Rectifield Linear Unit)関数というものがあります。入力が0以下なら0を出力し、0を超えたならそのまま出力する関数で、数式で表すと

  h x = { x x > 0 O x 0

グラフで表すとこうなります。

f:id:something-make:20180917160453p:plain

 

 

さて、ここで疑問点があります。

 

なぜ活性化関数を使わないといけないのか?

 

どうしてこういった関数を使わないといけないのでしょうか?

それにはちゃんとした理由があります。

それはどちらの活性化関数も非線形関数だということ。

非線形な関数だからこそネットワークに意味ができます。

逆に線形関数とは言ってしまえば一直線の関数。

  y = a x + bの形式で表される関数です。

f:id:something-make:20180917152748p:plain

非線形関数は一直線ではない関数です。シグモイド関数もステップ関数も直線ではありません。

 

線形の関数でネットワークを作るとどうなるのか?

試しに活性化関数 h x = a xの線形関数にして3重のネットワークを作ってみます。

このネットワークは

y x = h h h x

という式で表されます。

f:id:something-make:20180917153728p:plain

この計算結果は

  y = a * a * a * x

y = a 3 x

になります。青枠で囲まれたところに着目すると、aの3乗をxに掛けているだけです。

f:id:something-make:20180917153731p:plain

aの3乗というのはただの定数ですから、結局これはただの線形の式ということになり

f:id:something-make:20180917153735p:plain

 こういう単純なニューロンに置き換えることができてしまいます。

これの何が問題かというと、以前パーセプトロンでやったように単純なニューロンでは動作に限界があるということです。XORゲートは1重のパーセプトロンではつくれませんでした。

something-make.hatenablog.com

線形の活性化関数でニューラルネットワークを作ってどんなに層を重ねても、結局は1重のニューラルネットワークと同じ動作しかしないわけです。

 

複雑な動作をさせるには非線形関数が絶対に必要になるわけです。

 ニューラルネットワークが複雑な動作をするためには活性化関数に非線形なものを使用しなければいけないのがよくわかりました。

 

今日はここまでです。