Chainerで機械学習と戯れる: 2進法を学習できるか?

More than 1 year has passed since last update.

はじめに

先日ChainerというDeepLearning用のフレームワークが公開されました。

Chainerは Pythonで非常に多種多様なDeepLearningの構造を簡潔に表現して、学習・評価をすることができる素晴らしいソフトウェアだと思います。

王道な使い方はChainerのチュートリアルや下記記事などを見るとよくわかると思います。
【機械学習】ディープラーニング フレームワークChainerを試しながら解説してみる。

私は子供の頃からAIのようなものに憧れていて、特に GoogleのDQN は非常に驚きました。
ブロック崩しのようなゲームにおいて「ピクセルとゲームスコアの情報のみがフィードバックとして与えられた」AIが人間を凌駕する腕前に成長するとかちょっと何言っているのかわからない感じに凄いです。

そういうものはどのようにしたら実現できるのか、という興味から、
どういう問題ならDeepLearningで学習できるのか(私の技術レベルで ^^;)というのを
このChainerを使って探っていきたいと思います。
最終的には簡単なシミュレータ(言ってみればある種のゲーム)を操作する用なものが作れたら良いなぁと思います。

まあ、いきなり難しいことをやるのは大変なので、非常に簡単なモノから試していこうと思います。

お題:2進法を学習できるか?

問題

今回は N bit の入力を、対応する $2^N$個のどれかに出力するという問題を考えます。
中間の隠れ層は1層(H1)、もしくは、無しで試してみます。図にしてみるとこんな感じです。

chainer_key.png

実験

使っているのは Chainer の基本的な機能だけなので説明は省きます。

実験用のソースコードはこちらになります。

仕様がわかっていなかったので、学習用のデータを手作りするのが少し手間取りました。

F.softmax_cross_entropy(y, t) F.accuracy(y, t) では

  • yは: 2次元で dtype=np.float32 の numpy.array を Variable にしたもの
  • tは: 1次元で dtype=np.int32 の numpy.array を Variable にしたもの

を作る必要がありました。
ドキュメントもそれなりに充実していますし、わからないときはドキュメントからリンクされているChainerのソースコード を見るとある程度簡単に調べられます。

結果

最初N=4で実験してみると中間層H1なしでもあっさり学習出来ました(正答率100%)。
当然H1を増やしても学習可能です。
ここで躓いたらどうしようと思っていましたが、とりあえず良かったです。

Bit数と学習回数

Nはどこまでいけるのかな、と思い、N=5,6,7 と増やしていくと学習にかかる時間(回数)が増えていきました。
中間層が無い場合にNを変化させた時の学習回数は以下のようになりました。
スクリーンショット_2015_07_11_15_46.png
指数オーダーで増えていく感じに見えます。結果が出てみるとある意味納得です。

中間層H1の効果

中間層をある程度与えると、学習にかかる回数が減っていきます。
それをまとめたのが以下のグラフになります。

スクリーンショット_2015_07_11_15_50.png

Excelが苦手でちょっと見にくいですが、H1がある程度ある方が早く学習が終わることが見て取れます。

生結果

N(bit) H1 size 回数
4 0 3567
4 4 3285
4 8 1586
4 16 947
4 16 914
5 0 6948
5 5 6219
5 10 3216
5 20 2303
5 32 1336
6 0 16606
6 6 8360
6 12 6076
6 24 3392
6 64 1447
7 0 35822
7 7 11889
7 14 12936
7 28 6192
7 128 2459

さいごに

Chainerお手軽で楽しいです。
できて当然のようなことでも、なんか実際にできると嬉しいです。

次回:加算と減算を同時に学習できるか?