4月9日(土)、超人工生命ハッカソンに行ってきた。
どんなのができるの?
こんなの。
- 緑の箱に触ると報酬GET
- 黄色のボールに触ると報酬DOWN
- 赤の箱に触ると死ぬ
という状況の中で、左右どの方向に進むのか、ジャンプするのかを決めて勝手に動き回る。
使っているのは、一人称視点のカメラの情報(とDepthセンサの深度情報)だけ!!!
これはすごい!!!!!!
セットアップ
ここらへんを見よう!
mac環境でしかやってないけど、とくにハマることもなくできた。 シミュレーションが起動するまで数分待たないといけないので、根気よく待つ。
簡単にできるカスタマイズ
アクションを増やす
この部分 を
actions = [0,1,2,3]
にしてみる。ジャンプもするようになるぞ!同じ要領で この部分 を変更すると、動作を追加できる。
負の報酬も与えるようにする
Hierarchey > SceneController > items にMinusRewardItem を追加する。 ResetItemは触ると死ぬようになるぞ!
使われている技術
今回のハッカソンでは中村政義氏が開発した、「Lis」(リズ)というプログラムを使うことになっていた。Lisはpython側のサーバとUnity側のエージェントで構成されており、この2つはWebsocket通信によってやりとりして、うまく役割分担をしている。
- python側
- Unity側から画像データを受け取る
- ImageNet + DQNを組み合わせたネットワークを使ってエージェントの行動を決定し、Unity側に送る。
- Unity側
- python側から行動の命令を受け取って、実際のエージェントの動作に反映する。
- エージェントの望ましい行動に対して与える報酬を決定する。
- エージェントに固定されたカメラから得られる画像と、報酬をpython側に送る
- python側から行動の命令を受け取って、実際のエージェントの動作に反映する。
というような役割になっている。
当日僕がやったこと
コードを読む
ハッカソンが始まると、まずpython側のコードを読んだ。DQNには以前から興味があったが、なかなか触る機会がなかったので、今回のハッカソンを機に親しみたいと思っていたからだ。以下はコードを読んだときのメモ。
- ImageNetのプーリング層に入れる前の層(256 * 6 * 6 次元)をQ-Networkの入力にしている
- なぜここなのかというと、物体がある位置のニューロンが活性化するようになっている層だかららしい。チュートリアルで、写真と、活性化している位置の画像を並べたのを見せてもらいながらそういった説明を受けた。いきなり生の画像を入力するのではなく、すでにチューニングされたネットワークを使うことで学習時間を短縮しようということなのか。なるほど。
- ImageNetのほうは強化学習によって学習せず、DQNのほうのネットワーク(Q-Net)だけオンラインで学習していくようになっている。
- Q-Netは中間層が1層(255次元) のネットワーク
- 中間層1層なので全然Deepじゃない。複雑な行動を学習させていないから、これで表現力としては十分なのだろう。
- 4step分の状態を使って学習できるようになっているが、デフォルトでは1stepだけの入力を使っている。
- action はデフォルトで3つ(左右旋回、前進)
- 中間層1層なので全然Deepじゃない。複雑な行動を学習させていないから、これで表現力としては十分なのだろう。
ここまで理解したときには45分くらいが経っていた。 次にUnity側を読みに行った。
- ランダムに環境を構築するようになっていた。
- アクションのコマンドをpython側から受けて、左右旋回、直進の動作に変換している
- カメラの画像をバイナリ列に変換して送っている。
- Cubeに触ると正のリワードや負のリワード、学習のリセット(死亡)を行うようになっている。
ここまでで1時間が経過した。この時点あたりから、実はUnityが触れないと結構つらいのではないかという予感が浮かんできた。
パラメータいじり
コードを読み終わった後、Unity側の動作を変更してみた。
- 負のリワードを与える
- 負の報酬を与えるオブジェクトのモック(プレハブ?)はすでにUnityプロジェクト内に用意がしてあった。Unityの操作がわからず、30分くらい格闘してしまった。学習の初期段階だからなのか、ガンガンぶつかりに行っている。一晩置いてみたい。
- ジャンプさせる
- ジャンプするコードはすでにUnityプロジェクト側に用意してあったので、Q-Netから出力するactionの次元を3から4に変えてやればいいだけだった。
- 段差のあるステージを用意するといいんだろうなと思って用意したが、短時間では面白い動作にはならなさそうだった。
- ジャンプするコードはすでにUnityプロジェクト側に用意してあったので、Q-Netから出力するactionの次元を3から4に変えてやればいいだけだった。
- 道路に沿って落ちないように移動する
- ROBO-ONEの予選のような環境で、1本道を落ちないように移動することを学習させようとした。
- 板のようなオブジェクトの上に、正の報酬を与える餌を置いてやって、落ちたら死ぬようにすればいいと考えた。だがしかし、結局Unityの書き方が理解できず、何もできなかった。
- ROBO-ONEの予選のような環境で、1本道を落ちないように移動することを学習させようとした。
発表会
いいものができた人17人を選抜して、一人3分で発表してもらうことになった。 名前などメモできていないので、ざっくりと紹介する。
エージェントの行動と報酬をカスタマイズした人たち
- 旋回と同時に前にも進むようにした
- 時間経過とともにお腹が空くようにした
- 伏し目にして下を見れるようにしてみた
- ダッシュ機能をつけた
ニューラルネットワークを改良した人たち
- デフォルトではQ-Netへの入力として、AlexNetの比較的深い層を使っていたが、浅い層をQ-Netの入力にするようにして、Q-Netは層を増やしてCNNに変更した。
- 学習の進み具合がよくなったらしい。
- いろいろやり方はあるだろうけど、何がどう効いてくるのかはよくわからないなーと思った。
- 学習の進み具合がよくなったらしい。
- 推し松を追いかけるようにした。
- おそ松さんの顔認識のためにトレーニングしたネットワークを使った(使おうとした)
- おそ松さん判別器で話題になったぼへみあさん
- カラ松好きなエージェントを育てるなら、カラ松の顔画像が貼り付けられたボックスに接触すると報酬が高くなるようにする、とかそういうことをやっている。おもしろい。
- chainerのバージョンの違いで、そのまま使うことができず、当日トレーニングをし直したが、間に合わなかったとのこと。
学習させる環境をカスタマイズした人たち
- ジャンプできるようにしてジャンプすれば取れる報酬とジャンプすると取れない報酬を用意して、ジャンプする行動としない行動を満遍なく学習できるようにした。
- 自作ゲームと接続した
- Unityなので簡単に組み合わせられるかというとそうでもなかったらしい。すごい。
- 地面を球体にした
- 地平線の向こう側に餌があって見えないことがあるらしい。どういった行動が学習されるのか興味がある。
- エージェントを動いているターゲットを追いかける変質者にした
- 何を言っているかわからないかもしれないが、変質者だった。
- ATARIのPONをプレイさせた
- DQNといえば、ATARI。それを俯瞰視点を使わず、プレイヤー目線で3Dの環境で学習させたというのがおもしろい。
- パックマンみたいな環境にした
- Unityがうまく使えず、完成しなかったらしい。気持ちよく分かる。
- スーパーマリオみたいな環境にした
- 今回優勝の人
- 落ちたら死ぬ + 後ろから触れると死ぬ壁が追ってくる 環境を作ることでマリオっぽいものを学習させていた。
- 短時間ながらそれっぽい動きを学習させることに成功していた。後ろを振り返りながら逃げる姿が超かわいい。
- 今回優勝の人
- マルチエージェントで追いかけっこするようにした
- 鬼はタッチすると正の報酬を得て、タッチされたほうは負の報酬になるようにした。
- 会敵しやすいように。枠で囲って行動を制限していた。
- 鬼はタッチすると正の報酬を得て、タッチされたほうは負の報酬になるようにした。
- テクスチャを入れ替えた
- skyboxに空のテクスチャを貼った
- cubeが光るようにした
- デフォルトの環境で学習させた後、この環境に投入してやるとどれくらいの時間で学習できるのか
- skyboxに空のテクスチャを貼った
実世界と接続する系
- 照度センサの値をUnityに反映させる
- 実世界のセンサの値に応じてシミュレーション内に報酬を与えるようにした。
- iphoneで動かした
- Unity側をiphoneで動くようにした
- カメラに映った画像に応じて報酬を与えるようにした。
- ついでにエージェントもUnityちゃんにした。
- Unity側をiphoneで動くようにした
短い時間だったが、かなり完成度が高いものを発表する人が多くて驚いた。 僕もUnityを使えるようになって引き続き触っていきたい。
ではでは。