○ パターンマッチングをしてみよう

注意→勝手に考えた理屈の上に作成しています、一般的に正しくない事が多いと思われます。
パターンマッチングとは特定のパターンにマッチするデータを探し出す処理です。
いわゆる機械学習とかディープラーニングとか言うものを作成してみます。

■ ニューロンモデル
生物のニューロンを模したモデルです。

入力一つ一つに重みが付けられており、入力に対して掛け算が行われます。
入力の合計が閾値を超えたら出力→発火(ON)します。

しかし、このモデルの場合には出力がONもしくはOFFであり、中間の値が無いため重みや閾値の調整ができません。
(重みや閾値をちょっと増やした結果が正しいのか間違っているのかわからない)
そこで、合計を閾値から引いた値(本来は発火を起こす値)をシグモイド関数に入れて1〜0のなめらかな出力をするようにします(どのような値を入れても1〜0の範囲になります)

このシグモイド関数の数式をエクセルの数式に置き換えると、= 1 / ( 1 + EXP( -x ) ) になります、シグモイド関数のグラフを作成してみました。

この数式をニューロンの出力に当てはめると、= 1 / ( 1 + EXP( -( 入力 × 重み ) + 閾値)) となり、これをシグモイドニューロンと呼ぶらしいです。

このニューロンを複数配置し、答えに向けて収束させるようにしたのが次のようなニューラルネットワークです。


■ ニューラルネットワークの学習方法
答えがわかっているテストデータをたくさん用意して、それを使用して学習する教師あり学習をしたいと思います。
最適化とも言うのですが、どのように最適化していいのかよくわからないのでコンピュータのチカラワザで解決したいと思います。

まず、そのために必要なのが出力された結果がどれだけ答えからズレているのかが数値としてわかる必要がありますので、
そこで使用するのが、(データと平均値の差の2乗の合計の値) 平方和によりズレの統計量を計ります。
(出力 - 答え)^2 = ズレの量 (^2は2乗を意味します)

出力に対して答え0の場合にはズレが少なくなるほど0に近づきます


出力に対して答え1の場合でもズレが少なくなるほど0に近づきます

エクセルの関数だと、=SUMXMY2(出力範囲,答え範囲) にて指定範囲のズレの合計が計算できます。

▼ ニューラルネットワークの学習
結果が答えに対するズレの量が判断できるようになりました。
これで、沢山の学習データと答えのセットを使ってチカラワザで学習をさせる事ができます。

まず初期値として、全ての重みと閾値にランダムな数値を当てはめます。

(1) 一つ目の学習データを読み込ませて答えとのズレを求め、それを繰り返し、複数の学習データのズレの合計を計算します。
(2) 重みと閾値の値の一つを選択しわずかな数を足します。
(3) 再び、複数の学習データを読み込ませズレの合計を計算します。
(4) ズレの合計が目標とする値以下になったら終了します。
(5) ズレの合計が前回より悪くなったら、選択した値からわずかな数を引き算します。

(1)から(5)をひたすらに繰り返す事により、チカラワザでズレを目標値まで収束させることができます(初期値により収束しない事があります)
最適化が行き詰まる時は順番をランダムにして学習させます。

■ 学習後のテスト
ズレを目標値まで収束したら、学習完了です。
色々なデータを入れて学習されたニューラルネットワークがちゃんと動作するか確認します。


● 縦線、横線を判断するニューラルネットワーク
単純化するために5×5のマトリックス内での縦線、横線を判断できるようにします。

5×5の信号を3個のニューロン(1、2、3)に渡し、その出力を2個のニューロン(4、5)で受け取り、その出力の比率で縦線、横線を判断します。
ニューロンおよび学習データをエクセルで作成し、VBAで学習し、テストも出来るようにしました。

エクセルファイル ptmatch_5_5h.xls

▼ エクセルシートを開くとこのような構成になっています。


▼ 学習データおよび、学習データ毎の計算がこの場所に配置されています。


▼ 5個のニューラルネットワークがこの場所に配置されています。


▼ 学習開始ボタンです。

ボタンを押すとVBAのマクロが走ります、各ニューロンの重みと閾値を初期化の為にランダムな値を入れてから学習を開始します(パソコンの性能により時間がかかるかもしれません)
しばらくしても(7世代Corei5で1〜2分程度で)学習が終わらない場合にはESCキーを2回押してVBAを止めて再挑戦する必要があります(そのままでは永遠に終わりません)
マクロはインターネットからダウンロードしたファイルそのままではセキュリティの問題で実行が出来ないようですが 開発 → Visual Basic Editor を開くとコードを見る事は出来るようです。

▼ 学習後のテスト個所です、マトリックスに1を入れたり消したりして線を引くと学習結果を元にリアルタイムに計算されて結果が出力されます。

縦線らしい配置や横線らしい配置を入力するとニューラルネットワークが判断してそれらしい答えが出力されます。
この結果は初期値のランダムな重み閾値や学習により、かしこい判断が出来る時もありますしダメな時もあります。
それなりに動作するのを確認できるはずです。


作成中

▲トップページ