読者です 読者をやめる 読者になる 読者になる

バックプロパゲーションとは何なのか-Rubyでニューラルネットワークで学習やってみる#1

Ruby MachineLearning PatternRecognition

Rubyニューラルネットワークを使った学習をするバックプロパゲーションのプログラムを試してみたいと思い立ったので記事にメモしておきます。

今回の記事では、その準備ということでまずバックプロパゲーションが何なのかということから振り返ってみたいと思います。

バックプロパゲーションとはなんなのか

まず、バックプロパゲーションがなんなのか、というところから振り返ってみたい。

そのためには、ニューラルネットワークについてまず知らなければいけない。

ニューラルネットワークとは、ニューロセルを複数結合した情報処理機構である。

では、ニューロセルとはなんなのか。

ニューロセル

ニューロセルはニューラルネットワークにおけるノードに相当する。

ニューロセル自体は、複数の入力に対し、それぞれに重みをかけたものを足しあわせ、閾値を引いたものを出力とする機構であり、これは神経細胞をモデルにしているらしい。

Kobito.ckvvbY.png 引用: http://sacraya.610t.org/Press/No18/neuro/

xを入力、wを重み、vを閾値、zを出力とすると、とすると以下のような式で表せる。

u = Σ (x_i * w_i) - v

このuを出力関数に突っ込んだ値が出力となる。人間が判断するならここまででもいいような気がするけど、これをコンピュータに理解させやすく変換したい、ということだろうと思う。

z = f(u)

この出力関数にはいろいろ種類があり、中でもステップ関数シグモイド関数がよく用いられる。

  • ステップ関数 ... uが0正なら1, 負なら0
  • シグモイド関数 ... f(u) = 1/(1+e^-u)で表される

ニューロセルは単体でも論理演算をする機構として機能させれる!へぇ〜

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

そしてこのニューロセルを複数組み合わせたものがニューラルネットワークと呼ばれるもの。

一番簡単なもので言えば、ニューロセル2つの出力を受け取ったニューロセルが1つの出力を出すようなものとか。そんな風に入力された値がネットワークの中を順番に伝播していくニューラルネットは、フィードフォワードネットワーク(feed forward network)または階層型ネットワークと呼ばれる。

パーセプトロン

そしてバックプロパゲーションを理解するには、まずパーセプトロンについて理解しなければいけないのでそこも復習しておこう。

パーセプトロンとは、フィードフォワード型ネットワークのうちの、ある特定の形式をもったニューラルネットをそう呼んでるだけ。

パーセプトロンは、3層の層構造を持ったニューラルネットであり、中間層から出力層への結合荷重や閾値を学習により変更するというもの。入力層から中間層への結合荷重はランダムな定数とする。

Kobito.0eDQL6.png 引用: http://d.hatena.ne.jp/ura_ra/20111026/1319642014

パーセプトロンでは、入力層から中間層への結合荷重を変更しなくても、中間層から出力層への結合荷重を適切に選ぶことで、論理積論理和などの動作を行うことができる。こんな風にパーセプトロンはいろんな出力を作り出すことができる!

ただし、いくら結合荷重を調節しても排他的論理和(XOR)だけは作り出せないことがわかっている。(入力層から中間層への結合荷重の値によっては実現することもできる)。

このように、一般にパーセプトロンでは出力層の結合荷重を調節するだけでは表現できない関数が必ず存在し、この問題を、パーセプトロンの線形分離不可能問題と呼ぶ。

結合荷重と閾値の学習には、ヘブの学習則なんていう、生物の神経回路網で頻繁に信号を伝達するシナプスの結合がより強化される、ということに着目した方法がある。

バックプロパゲーション

前述のパーセプトロンの線形分離不可能問題を回避して学習するために、バックプロパゲーションという手法を用いる。

バックプロパゲーションは、出力層の結合荷重に加えて、中間層の結合荷重を調節する方法。 

ということで、次回実際に何かプログラム動かしてみます!

参考資料

[1] 石井健一郎、上田修功、前田英作、村瀬洋 (1998) 『パターン認識オーム社

[2] 小高知宏 (2011) 『はじめての機械学習オーム社

参考記事

  • gbuesing/neural-net-ruby

https://github.com/gbuesing/neural-net-ruby

http://blog.yusugomori.com/post/21858253979/ruby-python

http://qiita.com/ginrou@github/items/07b52a8520efcaebce37

http://aidiary.hatenablog.com/entry/20140122/1390395760

https://github.com/yusugomori/DeepLearning