2016.04.09   |   Python

超人工生命ハッカソンに参加してきた

ドワンゴ人工知能研究所主催の超人工生命ハッカソンというものに参加してきました!
http://connpass.com/event/28982/http://connpass.com/event/28982/
今年初のハッカソン参加でしたがとても楽しかったです!

超人工生命とは

人工生命(じんこうせいめい)は、人間によって設計、作製された生命。生化学やコンピュータ上のモデルやロボットを使って、生命をシミュレーションすることで、生命に関するシステム(生命プロセスと進化)を研究する分野である。
- Wikipedia

コンピューター上で生命をエミュレートする人工生命を、ディープラーニングの力を借りてパワーアップしよう!というのが超人工生命の目的です。

今回はゲームエンジンのUnityとディープラーニングのフレームワークであるChainerを組み合わせて面白いことをしようというハッカソンでした。最初このハッカソンの情報が出た時はある程度Chainerを使ったことがある人向けかと思っていたので参加を躊躇ってましたが、参加人数増加に伴い初心者まで間口を広げてくれたのでこれ幸いと参加してみました。ちなみにUnityの方も2Dで簡単なアプリを1つ作った程度の初心者です。

やったこと

当日の流れは、最初にハッカソン及び超人工生命の説明、サンプルプログラムの解説が1時間程あり、その後自由作業(4時間強)、最後に発表・表彰の流れでした。よくあるハッカソンの流れですね。

サンプルプログラムは餌を探して動きまわる3DのUnityプロジェクトと、背後で人工生命の頭脳となるPythonサーバーの2つで構成されています。人工生命には前進、右旋回、左旋回、ジャンプという4つのアクションが用意されていて、3D空間上を自由に動き回ることが出来ます。また空間上にはランダムに餌が配置され、これを人工生命が食べることで報酬を獲得することが出来ます。
このサンプルプログラムを使って、Unityを弄って見た目や挙動をリッチにしたり、頭脳を弄ってより賢く進化させたりする自由度の高いハッカソンでした。

UnityとPythonサーバーとのやりとりは、
入力データ:人工生命からみた視野画像・深度情報、アクションに対する報酬
出力データ: アクションを割り振った数字
という形で成り立っていて、Unity側の内容にあまり依存しないで学習できるようになってます。
Python側からすると入力されてるものがよくわからないけど、出力するアクションを変えたら報酬が上がったり下がったりするのをみて、どういう入力の時どういう出力をすれば報酬がいっぱい貰えるのかを学習していくわけです。

最初、自作の2DゲームにPythonの頭脳を繋いで動かしてみることを考えましたが、それをするにはUnity側とPython側で結構な改修をする必要があり、ソースを理解しきれてない段階でそれをやるのは厳しいと思い断念しました。(Chainerもっと勉強してからリベンジしたいです。)

なのでハッカソンで何をするかを考えるためにサンプルをちょこちょこ弄りつつ遊んでいたのですが、とある問題に気づきました。それは人工生命を育てるのには時間がかかるということです。運営の方も仰られてましたが、ちゃんと知能を育てるには半日~1日くらいガッツリ動かす必要があるみたいです。最初の数十分だけじゃ全然学習してくれません。またサンプルではサーバーにコネクションを貼るたびに学習がリセットされます。つまりちょっとUnity弄って結果確認、また少し弄って結果確認みたいなトライ・アンド・エラーがやりにくい課題でした。それに感情的にも数十分かけてやっと周りを認識し始めた人工生命を中断して殺してしまうのはとても忍びなかったです。

なので結局自分がやったこととしてはサンプルアプリをちょろっと改造して、あとは残り時間ひたすら見守るということをやってました。平行してChainerのソース解読ですね。


で、時間いっぱい(発表・表彰中も含む)まで使って育てた子がこちらです。
緑の四角が通常の餌で内部的には+1ポイント報酬が入ります。で黄色の餌が悪い餌で-0.5ポイント報酬が減ってしまいます。上手いこと黄色い餌をよけつつ緑だけを食べてくれれば大成功なのですが、どうでしょうか。…まだまだ学習が必要そうですね。キャプチャしてみたところがあまり餌取ってなくて面白みがないですが、実際もっと上手く動いてるところもありました。


学習の成果を図にするとこんな感じです。
横軸がループの回数、縦軸が一定時間内に何ポイント獲得できたかのグラフになります。報酬を自然現象するように改造している(その場で何もしない状況もマイナスにしたかった)ので-1あたりがスタートとなります。大体30000ループ辺りまではランダムな動きをしていたのですが、それを超えた辺りから徐々にスコアが改善していくのが分かります。ちなみに10000ループ回すのに1時間程かかります。最初の3時間は不安でしょうがなかったです。で、40000、50000と増えるに連れ右肩上がり成長をしています。実際成長を見守ってるとこのスコアの伸びは感動的でしたね。

ただ最後60000前後で急にスコアが落ち込んでしまっています。たまたまなのか、過学習なのか、移動でPC閉じたりした原因なのか定かでないです。PCの負荷が高くて他の作業が出来ないのでここで学習を打ち切りました。辛いですが、なくなくプロセス殺します。次はもっといいPCで長期間動かしたいですね。

他の方の発表

超人工生命の可能性

あとでかく