ディープラーニング用にニューラルネットの汎用プログラムを書いた(2)

隠れユニットを2層にして、それぞれ2ニューロンあるネットワークで100万回、排他的論理和を学習させた。学習係数は、0.05とごく小さくしてある。1の時は、0.988以上、0の時は、0.02以下とかなりはっきりと識別している。
次は、手書き文字の認識をさせよう。

入力データ 0 1
Layer::printOutput Neuron [ 0 ] => 0.988652
教師出力データ 1
-----------------No.999994------------------
入力データ 0 1
Layer::printOutput Neuron [ 0 ] => 0.988661
教師出力データ 1
-----------------No.999995------------------
入力データ 1 1
Layer::printOutput Neuron [ 0 ] => 0.0153844
教師出力データ 0
-----------------No.999996------------------
入力データ 1 1
Layer::printOutput Neuron [ 0 ] => 0.0153657
教師出力データ 0
-----------------No.999997------------------
入力データ 0 0
Layer::printOutput Neuron [ 0 ] => 0.00271229
教師出力データ 0
-----------------No.999998------------------
入力データ 1 0
Layer::printOutput Neuron [ 0 ] => 0.988581
教師出力データ 1
-----------------No.999999------------------
入力データ 1 1
Layer::printOutput Neuron [ 0 ] => 0.0153556
教師出力データ 0
-----------------No.1000000------------------
入力データ 1 0
Layer::printOutput Neuron [ 0 ] => 0.988579
教師出力データ 1

ディープラーニング用にニューラルネットの汎用プログラムを書いた

ロボットの姿勢制御にディープラーニングを用いたいと思って、その手始めに、ニューラルネットワーク(誤差逆伝搬:バックプロパゲーション)の汎用プログラムを一昨日くらいから熱を込めて書いた。
汎用性を重視して、レイヤーの数や、その中でのニューロンの数を柔軟に変えられるようにすると同時に、C++らしいオブジェクト型のプログラムにしようとした。ようやくバグがないような感じになって、排他的論理和を識別させてみたが、結構学習に手間かかる。
細かくウェイトを変える(グラディエント値の0.05ずつ調整)ようにして、100万個のデータを学習させて認識させた。中間層は4個で、Neuron[0]というのが、最後の出力層のニューロンの値だ。バイアスニューロンをつけていないからかもしれない。
printOutput Neuron [ 0 ]
が、順伝搬の出力値だ。

-----------------No.999975------------------
入力データ 1 0
Layer::printOutput Neuron [ 0 ] => 0.986243
教師出力データ 1
-----------------No.999976------------------
入力データ 0 1
Layer::printOutput Neuron [ 0 ] => 0.986272
教師出力データ 1
-----------------No.999977------------------
入力データ 0 1
Layer::printOutput Neuron [ 0 ] => 0.986272
教師出力データ 1
-----------------No.999978------------------
入力データ 1 0
Layer::printOutput Neuron [ 0 ] => 0.986243
教師出力データ 1
-----------------No.999979------------------
入力データ 0 0
Layer::printOutput Neuron [ 0 ] => 0.0137698
教師出力データ 0
-----------------No.999980------------------
入力データ 0 0
Layer::printOutput Neuron [ 0 ] => 0.0137697
教師出力データ 0
-----------------No.999981------------------
入力データ 0 0
Layer::printOutput Neuron [ 0 ] => 0.0137696
教師出力データ 0
-----------------No.999982------------------
入力データ 1 0
Layer::printOutput Neuron [ 0 ] => 0.986243
教師出力データ 1
-----------------No.999983------------------
入力データ 1 1
Layer::printOutput Neuron [ 0 ] => 0.0131976
教師出力データ 0
-----------------No.999984------------------
入力データ 1 0
Layer::printOutput Neuron [ 0 ] => 0.986243
教師出力データ 1
-----------------No.999985------------------
入力データ 0 1
Layer::printOutput Neuron [ 0 ] => 0.986272
教師出力データ 1
-----------------No.999986------------------
入力データ 0 1
Layer::printOutput Neuron [ 0 ] => 0.986272
教師出力データ 1
-----------------No.999987------------------
入力データ 0 1
Layer::printOutput Neuron [ 0 ] => 0.986272
教師出力データ 1
-----------------No.999988------------------
入力データ 0 0
Layer::printOutput Neuron [ 0 ] => 0.01377
教師出力データ 0
-----------------No.999989------------------
入力データ 1 0
Layer::printOutput Neuron [ 0 ] => 0.986244
教師出力データ 1
-----------------No.999990------------------
入力データ 1 1
Layer::printOutput Neuron [ 0 ] => 0.0131984
教師出力データ 0
-----------------No.999991------------------
入力データ 0 1
Layer::printOutput Neuron [ 0 ] => 0.986272
教師出力データ 1
-----------------No.999992------------------
入力データ 1 0
Layer::printOutput Neuron [ 0 ] => 0.986244
教師出力データ 1
-----------------No.999993------------------
入力データ 0 1
Layer::printOutput Neuron [ 0 ] => 0.986273
教師出力データ 1
-----------------No.999994------------------
入力データ 0 1
Layer::printOutput Neuron [ 0 ] => 0.986273
教師出力データ 1
-----------------No.999995------------------
入力データ 1 1
Layer::printOutput Neuron [ 0 ] => 0.013199
教師出力データ 0
-----------------No.999996------------------
入力データ 1 1
Layer::printOutput Neuron [ 0 ] => 0.0131987
教師出力データ 0
-----------------No.999997------------------
入力データ 0 0
Layer::printOutput Neuron [ 0 ] => 0.01377
教師出力データ 0
-----------------No.999998------------------
入力データ 1 0
Layer::printOutput Neuron [ 0 ] => 0.986244
教師出力データ 1
-----------------No.999999------------------
入力データ 1 1
Layer::printOutput Neuron [ 0 ] => 0.0131984
教師出力データ 0
-----------------No.1000000------------------
入力データ 1 0
Layer::printOutput Neuron [ 0 ] => 0.986244
教師出力データ 1
-

 

ロボットの姿勢制御にディープラーニング

ロボットを動かす現在のシステムに限界を感じて最初から作り直すことにした。ある意味、原点に帰って、足郎の新しさをちゃんと戦略的に貫くことにある。
(1)外からシステムを押し付けるのではなく、足郎が感じている状況に、足郎自身が対応するようにする。センサーの適切な配置と処理システムが求められる。
(2)そのために、簡単なディープラーニングを取り入れて、与えられた状況の中で、目的適合的な行動を適切に選び出す能力を与える。
(3)サーボを制御するために、全てを動かすのではなく、引きだけを指定してステップ的に動かし、残りは全て完全緩和状態にしてしまう。効率化する。
というわけで、ディープラーニングの基本的内容である、ニューラルネットワークのプログラムを25年ぶりに、C++で書いている。当時は、ただのCだったが。
四半世紀前、経済データの読み取りにニューラルネットワークを使った研究をしていた。ただ、周りからほとんど理解されなかったが。
1。「ニューラルネットワークによる時系列データの特性認識」, 単著, 『経済理論』, 249号, 平成4年9月.
2。「コネクショニズムの経済学---ニューラルネットワークが示唆する新しい経済学」, 単著, 『情報処理技術の応用に関する調査研究』, 第4章,(財)日本情報処理開発協会, (財)関西情報センター,平成5年3月.
3。「環境・エネルギー・成長の経済構造分析---産業連関分析とニューラルネットワーク」, (植田和弘, 長谷部勇一, 寺西俊一, 宮崎誠司, 家田忠と共著),『経済分析』, 経済企画庁経済研究所編, 第134号,平成6年4月.
3番目の論文は経済企画庁経済研究所の正式研究報告書に書かれているものだが、この論文を当時の所長の前で説明したら、鼻であしらわれた。仕方がない。AIがこんなに流行るものだとは、誰も思わなかっただろう。私自身もだが。時代をあまりに先取りすると、辛い目にあうのだ。