iOSを使ってdeepMindにニューラルネットで対抗してみた
前回までのところでニューラルネットワークの基礎を自分のメモとしてまとめてきましたが、
計算方法はわかったけど、それで何ができるのという部分は示せてないので
具体的な実験タスクを決めようと思います。
前回までの結果を一度まとめます。
出力層-中間層間ニューロンの接続荷重の更新
出力層-中間層間ニューロンの接続荷重の更新
無性に機械学習がしたくてdeep learningをアプリに実装してみた話② - Change before you have to.
無性に機械学習がしたくてdeep learningをアプリに実装してみた話③ - Change before you have to.
今回は実験タスクなので、単なる数値の羅列を学習する数値学習でも良いかなと思いましたが
それでは分かりづらいし、このブログではせっかくiOSを使うと謳っているのでもう少しインパクトのあるゲームみたいなものを設定したいなと思いました。
ちょっと調べていると、breakoutというゲームがお手軽に作れそうだと思いました。
breakoutは単なるブロック崩しです。
昔のゲームなのでわからない方は、以下動画を参照してみてください。
https://www.youtube.com/watch?v=H3iDiVygTsY
Super Breakout (Atari 5200) How to Beat Home Video Games - YouTube
採用した理由は
・知名度があるので、多くの人に分かりやすい
・すでにgithubなどで公開している人もいたので、学習結果を簡単に反映できそう(※)
・学習対象のブロックの動きの可動範囲が二次元ではなく、一次元なので学習がスムーズになるかなと思ったのも理由です。(一番大きな理由)
あとは、恐れながら、google のdeep-learningにも対抗したいって思ったのもありますw
※tnantoka/hello-spritekit
tnantoka様、MIT Licenseだったので使わせて頂きました。
少しいじって、タイトル画面をでなくしたり、
pod updateで最新のライブラリに更新しました。
上記プログラムでは各種パラメータがjsonになっているので簡単に修正できます。
ちなみに、プログラムは通常のobjective-cに加えて、SKSpriteの知識が必要です。
そうして、実行した結果が以下です。
https://www.youtube.com/watch?v=EuDqeFS1KiQ
学習もなにもしていないので、手動でしかパドル(下にいる動くやつ)が変化しません。
defaultでカーソル位置でタップすると下のパドルが変化します。
これでは簡単すぎるので、ボールの速度を速くしました。
(重力加速度などはすべて無視しているのと、摩擦もないです。デフォルトのプログラムではボールがだんだん早くなるように設定されていましたが、将来の学習に必要ないので常に一定速度にしました)
その結果が以下です。
https://www.youtube.com/watch?v=6TBZnY0Agys
かなり速くなりましたが、(本当は失敗する様子を出したかったものの)なぜかちゃんとできていますが、半分くらいはボールを落としてしまっていますwww
下手ですね。。
それで、前回までにまとめたニューラルネットワークにパドルの位置座標とボールの位置を
学習データとして、ボールを落としたら罰を、ボールを落とさずにパドルがうまく跳ね返すことができれば褒めてあげる的な機構を組み入れた結果が
以下です。
学習パラメータ
ニューロンのシグモイド関数の傾き:0.6(勾配)
バックプロパゲーション時における接続荷重の学習効率:0.75
また、実際にやってみると一定以上の学習がうまくいった場合かなり高速にパドルを動かしてしまっていてブレてしまうので
一定以上の精度で学習がうまくいった場合、移動距離にスムージングをかけてあげる判断をいれるニューロンをいれています。
赤ちゃんの手の動きは無駄があるけど、陶芸家の手の動きってほとんどブレがないですよね。
それを少し明示的にしてあげました。
学習回数10回目
まだうまく学習できていないですね..
学習回数200回目
徐々に対応できるようになってきました。
学習回数1000回目
movie after learning - YouTube
スムージングニューロンは初期状態からオフでしたが、
400回目あたりからオンになってきて、徐々にオンとなる確率が高くなり、1000回目ではほとんどオン状態です。
1000回目の動画をみるとほとんどパドルの動きにブレがないことがわかります。
上記、どうでしょうか
まだまだ改良の余地があると思っていて、
例えば、疲れるのを防ぐため人間は無駄な動きをしないので、ボールが遠くにある状態でのパドルの位置変化は無駄な動きであると思います。
具体的にはエネルギー評価関数を入れて、あまりエネルギーを消費するような動きをした場合には罰を与えるような学習をしていこうと思っています。
次回に続きます。