はじめに
前回:Chainerで機械学習と戯れる: 2進法を学習できるか? に続いて単純なパターンを試してみます。
今回のお題は 足し算と引き算です。
前回の結果から加算・減算それぞれが学習できるのは容易に想像できますが、
ある入力がきたら加算、別の入力がきたら減算というのは学習できるのだろうか、、というのが今回の実験の目的です。
お題:加算と減算を同時に学習できるか?
問題
- N Bit で表される2つの2進数x1,x2の加算と減算を学習できるか.
- IN: (x1, x2, add or sub) # add=0, sub=1
- OUT: x1+x2 or x1-x2
- ただし x1 >= x2 とする
入力として x1, x2 と 加算なら0、減算なら1 というものが与えられ、
出力として 2進法の時と同じように対応するどこかのNodeを1にする、
というものです。
実験
実験に使ったソースコードはこちら です。
評価の仕方は前回と同じような感じなのでソースコードも似たような感じですが、
任意の中間の階層を簡単に指定できるようにしました。
というもの、100%の正答率にすることができなかったので、色々な構造を試したかったからです。
結果
今回の実験では入力が2bitのときですら正答率80~90%を超えることができませんでした。
中間層を「なし、 [10], [10,10], [10,10,10]」とか色々試してみてもダメでした。
加算のみ、減算のみ、であれば正答率100%になりました。
考察
ある入力(加算・減算フラグ?)をキーにして、演算をがらっと切り替える、、というのはこういう構造だとダメっぽいです。
よくあるXORが学習できない、的な何かなのかな・・・
何かこうちょっとしたことでなんとかなりそうな気もするのですが、うーむ。
あとそもそもプログラムが間違っている可能性もあるかもしれないです。
さいごに
話は変わりますが、前回「DQNってどうなっているのかなー」と書きましたが、
DQNの生い立ち + Deep Q-NetworkをChainerで書いた
でまさにそのことについて説明されています!
DQNは「強化学習+DeepLearning」ということらしいです。
「強化学習」は言葉しか知らなかったのでそういうことだったのか、と感動しました。強化学習についてもちょっと試してみたいと思っています。