多層NNで7セグメント表示器を学習させてみた

  • 7
    Like
  • 0
    Comment

はじめに

最近、プレイしたゲームがあるんですけど、その中にディープラーニングを応用した人工知能や量子の話題が出てきてすごく面白かったんですよ。2045年には技術的特異点(シンギュラリティ)が起きて人類最後の発明は人工知能になるだろうと言われていますが、果たしてそんな時代が訪れるのでしょうか?

そんなこんなで人工知能についてモチべが上がったので再び人工知能に関する記事を書いてみようと思います。今回は去年に書いた記事を参考にして7セグメント表示器を多層NNを使って学習させてみました。

去年に書いた記事:
ディープラーニングで論理回路を学習、予測させてみた

アルゴリズムの変更

去年に書いたNNのソースコードをそのまま使ってみても良かったんですけど、それだとつまらないなと思ったので少しアルゴリズムを変更しました。変更した点は以下のようになります。

                表1:アルゴリズムの変更点

項目 前回 今回
層の数 4層 5層
教師データ コード内に設定 CSVファイルに設定
結合荷重の初期値 0~0.1の範囲でランダムに設定 -0.1~0.1の範囲でランダムに設定
学習後の結合荷重の値 画面上に出力 CSVファイルに出力

簡単に言うと今回は5層のNNで学習させてみようって事です。5層になってくると結合荷重の数も膨大になってくるため、学習後の結合荷重の値はCSVファイルに出力させます。後、汎用性を考えて教師データを予めCSVファイルに入れておき、プログラム起動時にCSVファイルから読み込むようにしています。

各種設定

7セグメント表示器と教師データとして使う真理値表は以下のようになっています。

                  7segment.PNG
                  図1:7セグメント表示器

                  表2:7セグメント表示器の真理値表
7segments.PNG

7セグメント表示器は10個の入出力パターンで成り立っているため、教師データは10個になります。その他、学習させるのに必要なパラメータは以下のように設定しています。

 表3:パラメータ設定

項目 内容
学習回数 15000
教師データ数 10
入力層の数 4
中間層1の数 12
中間層2の数 10
中間層3の数 8
出力層の数 7
学習係数ε 0.5
慣性係数α 1

上記の設定を元に学習を行います。NNのソースコードは以下に公開していますので興味のある方はご覧ください。

neurallearn.c
URL:https://gist.github.com/KUKDfhia/850b3462bae3be62909f61460d62ebaa

neuralfuture.c
URL:https://gist.github.com/KUKDfhia/620f995d7e126536e27c936e7e3f2fd2

※プログラムを実行するためにはinput.csv、output.csv、kekka1.csv、kekka2.csv、kekka3.csv、kekka4.csvのCSVファイルが必要になりますので予め作成しておいてください。input.csv、output.csvには学習させたいデータ(教師データ)を事前に入れておきましょう。kekka1.csv、kekka2.csv、kekka3.csv、kekka4.csvはプログラム実行後、学習結果である結合荷重の値が書きこまれますので事前に入れておくデータはありません。

学習

それでは7セグメント表示器を学習させてみましょう。neurallearn.cを動かしてみます。

kekka1.PNG
   図2:コンソール上の表示結果1

上記のような表示結果が出てくると思います。本当に学習出来ているのか疑問に思う所ではありますが、学習結果はkekka1.csv、kekka2.csv、kekka3.csv、kekka4.csvに書き込まれていますので問題ありません。

結果

次にneuralfuture.cを動かしてみます。

kekka2.PNG
   図3:コンソール上の表示結果2

入力値を設定してくださいと聞かれるので表2の入力パターンから好きなものを入れてみましょう。ここでは全ての入力に0を設定してみる事にします。

kekka3.PNG
   図4:コンソール上の表示結果3

出力値を見ると表2と同様、y[6]以外は1に限りなく近い値が表示されている事が分かりますね。こんな形で全ての入力パターンを試してみると表2と同じ出力パターンが得られると思います。NNが7セグメント表示器を学習した証です。ここでは参考として自分が動かしてみた結果を載せます。

              表4:学習させた7セグメント表示器の入出力結果kekka5.PNG

※プログラムを動かしてみたが、表4のような出力値が出てこなかった人はもう一度、学習から行ってみてください。学習前の結合荷重の値はランダムに設定されますので、設定された値によっては学習が途中であった可能性があります。

むすび

今回は5層NNを用いて7セグメント表示器を学習させてみました。NNを扱うのはひさしぶりでしたが、アルゴリズムの変更も含め、最後の学習まで出来て良かったです。次はこの5層NNを相場に適用してみようかなと考えています。オーバーフィッティング改善を目指してまたいろいろ試してみようと思っていますので、よろしくお願いします。