[ 機械学習 ] 2層ニューラルネットワークの実装 (簡易版)

[ 機械学習 ] 2層ニューラルネットワークの実装 (簡易版)

本記事では、2層ニューラルネットワークを実装していきます。

パーセプトロンとニューラルネットワークの違いとは

前回の記事などではパーセプトロンという考え方をまとめました。では、今回あつかうニューラルネットワークとパーセプトロンは、何が異なるのでしょうか。

実は、パーセプトロンとニューラルネットワークとは本質的には同じ構造のアルゴリズムを指します。
入力を受け取り、重みを掛け合わせ、バイアスを足し上げ、その総和を算出し、それを活性化関数に渡し、結果を出力として受け取る、という構造は両者において共通です。

ではどの点で異なるのかと言えば、活性化関数の性質の違いに両者の相違を認めることができます。(活性化関数については前記事を参照)

パーセプトロンで用いられる活性化関数は、ステップ関数です。ステップ関数では、入力が閾値を超過しているか否かで出力を0か1に振り分けていました。

対して、ニューラルネットワークで用いられる活性化関数は、入力に応じて連続に変化する値を出力できる関数です。例えばシグモイド関数や、ソフトマックス関数です。

ニューラルネットワークでは、ニューロンと呼ばれる要素(ノードとも)を多数用意して処理を行いますが、ニューロンに渡す入力を0か1に限定してしまうと効率的なネットワークを構築できません。したがってニューラルネットワークでは連続値を出力できる活性化関数を用いるのであり、それがパーセプトロンとの違いとなっているのでした。

 

2層ニューラルネットワークの実装

イメージ

では2層のニューラルネットワークを実装していきたいと思います。実装の前に、ネットワークのイメージを掴みます。

ちなみに層の数は、入力層と出力層を数えていません。したがって下記の図で示されるネットワークは、2層のニューラルネットワークです。

急にややこしくなりましたね。各部分の処理の流れを先にまとめておきましょう。

処理の流れ

  1. 各入力(0層)に重みを乗算、それにバイアスを加算し、総和を求める。(緑⇨ピンク)
    この図には重みを書くスペースがなかったので書いていないのですが、ネットワークには各入力に応じた重み(W1, W2 など)が用意されています。パーセプトロンの時と同じように、各入力と対応した重みを乗算し、それにバイアスを足し上げ、総和を求めます。
  2. 1の処理を、次の層(1層)に存在するニューロンの数だけ行う。
    この図で青色になっている要素(ニューロン)を、隠れ層と呼びます。処理が複雑になる程隠れ層を増やしていくのですが、先ほどの総和を求めた処理を、次の層に存在する隠れ層の数だけ行う必要があります。したがって、1層目一番上の青色ニューロンに渡す総和が
    ( X1 * W1-1 + X2 * W1-2 + b ) とすると、次の青色ニューロンに渡す総和は、 ( X1 * W2-1 + X2 * W2-2 + b ) となります。
  3. 1層の各ニューロンに渡された総和を活性化関数に渡し、出力する。(ピンク⇨赤)
    ここまでで、1層目のニューロンに総和が渡されています。その総和を引数に、活性化関数に処理を行わせます。ここではシグモイド関数を使用しますので、1層目の各ニューロンからの出力は3者3様となります。
  4. 1層の活性化関数の出力をと次のバイアスを次の入力値として、今度は2層の重みと乗算し、総和を求める。(赤・緑⇨ピンク)
    次は2層との処理になります。今度の入力値は、1層めの活性化関数からの出力になります。先ほどと同様に総和を求めて、次のニューロンへと渡します。
  5. 2層のニューロンに渡された総和を活性化関数に渡し、出力する。(ピンク⇨赤)
    2層に到達した総和は、再度活性化関数によって処理されます。すでに処理が不要である場合には、ここでの活性化関数の使用は省略されることもあります。(あるいは恒等関数と呼ばれる、処理を何も行わない関数を使用する)
  6. 2層の活性化関数からの出力を、全体の出力とする。
    今回は2層分のニューロンしか無いので、2層目のニューロンの出力結果が全体の出力結果となります。お疲れ様でした。

実装

では上記の流れを踏まえて、3層ニューラルネットワークを実装していきたいと思います。

実装は以上のようになります。途中に出てくる dot() 関数は、numpyライブラリに用意されている行列計算用の関数です。上にある図に従って forループ などで実装しても結果は変わりませんが、効率の面から行列を使用したベクトル計算を用いています。

今回は何かの結果を求める、ということを目的としていないので出力結果が意味を為していませんが、ニューラルネットワークの構造を把握するという目的は達成できました。

まとめ

最後に今回のまとめをして、本記事を終了したいと思います。

  1. ニューラルネットワークは、活性化関数がステップ関数ではないという点において、パーセプトロンと異なる。
  2. ニューラルネットワークでは、活性化関数の出力結果がさらに次のニューロンに渡されることがある。これらの役割を担うニューロンを、隠れ層という。
  3. 処理が複雑になるにつれ、隠れ層は一般的には増えていく。
  4. ニューロンに渡される総和は、一つ前の層の入力とそれに対応した重みとの乗算結果にバイアスを足し上げたものである。

 

以上。

 

MachineLearningカテゴリの最新記事