Enjoy Engineer Life

C#,Unity,C++,UE4などの技術ブログや雑記を徒然なるままに書いていきます。

【読書メモ】Deep Learningを学ぶ〜ニューラルネットワーク(多層パーセプトロン)とシグモイド関数〜Part 8

最初に

本記事は以下の本から得た知見を自分用のメモも兼ねてまとめた記事となります。ただし本の内容をそのまま書き写ししているわけではなく、ある程度自身で調べたものや感想が混じっています。ご了承ください。

f:id:rossamu:20190103000547p:plain ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

また、本記事は株式会社よむネコのプロジェクトの業務内のお時間を頂いて蓄積した知見となります。
以下会社URLです。

http://www.yomune.co/ f:id:rossamu:20191023153505p:plain


今回はニューラルネットワークの概念と、識別を行う際の処理を学んでいきます。

ニューラルネットワークとは


ニューラルネットワーク(多層パーセプトロンは単純パーセプトロンと似た部分が多いです。以下が図の例となります。今回この本では、重みを持つ層のみを数えて「2層ネットワーク」と呼ばれています。

f:id:rossamu:20191023164313p:plain

(書籍によっては、ネットワークを構成する層がn個→n層ネットワークと呼んでいることがあるようです)


ここで、場合分けの式をよりシンプルするために、今まで使用していた式を以下の式を経て、一つにまとめます。

1:

$$ a = b + W_1X_1 + W_2X_2 $$


2:

$$ y=h(a) $$


$$ y=h(b+W_1X_1+W_2X_2) $$


3:


h(x)=\left\{\begin{array}{ll}0 & (x \leqq 0) \\1 & (x > 0)\end{array}\right\}


入力信号の総和がh(x)という関数によって変換され、返還後の値が出力yとなります。このh(x)のような関数は「活性化関数」と呼ばれ、どのように活性化(発火)するかを決める役割があります。この式を明示的に図示するとしたら以下のようになります。尚、バイアス(b)の入力信号は常に1となるため、ほかのニューロンと差別化されます。

f:id:rossamu:20191023164346p:plain


図の中では入力信号を受け取ったニューロン内で、h()という活性化関数によって重み付き信号の総和である ay に変換されるプロセスが示されています。

h(x)のような活性化関数は、閾値を境にして出力が切り替わる関数で「ステップ関数(または階段関数)」と呼ばれています。つまり単純パーセプトロンでは活性化関数にステップ関数を利用している、といえます。このステップ関数を別の関数に変更することでニューラルネットワーク(多層パーセプトロン)を扱うことができるようになります。その一つがシグモイド関数です。シグモイド関数ニューラルネットワークの歴史の中でも古くから利用されてきた関数となります。
どちらの関数も出力信号の値は0〜1の間となります。

標準シグモイド関数


$$ h(x) = \frac{1}{1+e^{-x}} $$


eネイピア数(参考:https://www.nli-research.co.jp/report/detail/id=58572?site=nli )の 2.7182...の実数を表します。信号はシグモイド関数を用いて変換が行われた後、次のニューロンへ伝えられます。
シグモイド関数を用いることでステップ関数を滑らかな曲線にすることができます。単純パーセプトロンではニューロン間を0か1で信号を表していたのが、ニューラルネットワークでは連続的な実数値の信号(例:0.1, 0.2, 0.3....,0.8, 0.9)が流れます。

また、特徴としては以下の点が挙げられます。

  • 入力xの値が大きくなると値は1に近くなる(分母が1に近くなる)が1そのものにはならない
  • 入力xの値が小さくなると値は0に近くなる(分母が∞に近くなる)が0そのものにはならない
  • xが0の時に値は\frac{1}{2}になる。



活性化関数の実装

ステップ関数の実装

単純な実装


単純パーセプトロンで使用するステップ関数として、単純な実装を行う場合は以下のようなコードになります。

def step_func(x):
    if x>0:
        return 1
    else:
        return 0



NumPyの配列に対応した実装


def step_np_func(x):
    y = x > 0 #xの各要素に対するboolの配列が生成される
    return y.astype(np.int) #boolをint型に変換して値を返却


ステップ関数は0,1で階段状に値が切り替わるため、「階段関数」と呼ばれることがあります。



シグモイド関数の実装


def sigmoid_func(x):
    return 1 / (1 + np.exp(-x))


Np.exp(-x)e^{-x}と等価です。関数に対してNumPy配列を渡しても問題なく計算が行われます。
この関数とmatplotlibというライブラリを使用してグラフ表示(入力は-5から5まで)すると以下のような滑らかな線の出力が得られます。

f:id:rossamu:20191023162054p:plain



最後に


今回は標準シグモイド関数という新たな関数について学ぶことができました。次は「ReLU関数」について学んでいきます。まだ序盤ではありますが、頑張って学習していきます。

参考