python+tensorflowでatariのponをDQN(深層強化学習)してみた。

今回兼ねてからやってみたかったDQN(深層強化学習)を触ってみました。 とは言っても、githubにあったコードを実行するだけですが、実際に学習していく様は楽しかったです。

今回兼ねてからやってみたかったDQN(深層強化学習)を触ってみました。 とは言っても、githubにあったコードを実行するだけですが、実際に学習していく様は楽しかったです。

強化学習とは

はじめに、私的に強化学習はこれこそがAIだと思っています。
今のDeep learningは教師あり学習が主流で結局データを持っていれば勝ちな気がします。
また、データに合わせて学習するだけなのでデータに沿った答えしか出せず面白みに欠ける気がします。
強化学習は状況に応じて学ぶのでAlphaGoみたいに人間が思いつかないようなものも思いつきうるのでとても面白いと思います。

今回実際にやるのはAtariのゲームponです。
詳しく知りたい方はwikipediaをみてください。
https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%B3_(%E3%82%B2%E3%83%BC%E3%83%A0)
今回は21点先取で、左側がコンピュータで右が自分です。
お互いにパドルを動かして球を入れれば得点となります。

強化学習の要素には、環境、エージェント、状態、報酬、行動などがあります。
環境とは今回の場合は、ponのゲームでしょう。
エージェントは、右のパドル。
状態は、ボールの位置と自分と相手のパドルの位置。
報酬は、得点とします。
行動は、自分のパドルの上下。

今回の目的は報酬の最大化つまり得点を最大とすることです。
自分の得点 - 相手の得点 = 報酬です。
ある環境に置かれたエージェントが状態を把握して行動し、報酬を最大化するのが強化学習です。
今回は、ponのゲームにおいて右のパドルをボールの位置と自分と相手のパドルの位置にもとずいて上下させ、得点を最大化します。

これだとただの強化学習です。
深層強化学習は何が違うのでしょうか?
簡単に書くと今までゲームの特徴量をいちいちゲームに合わせて人間が手動で設計しなければならなかったのがDeep learningを用いることで画像から直接特徴量が抽出できるようになったのです。
文字よりも画像を見せてもらった方がわかりやすいということでしょうね。

他にも強化学習と深層強化学習違いはたくさんあります。
詳しい解説はこちらをみてください。
http://sssslide.com/speakerdeck.com/takuseno/survey-of-deep-reinforcement-learning

今回は21点先取で、左側がコンピュータで右が自分です。
お互いにパドルを動かして球を入れれば得点となります。

強化学習の要素には、環境、エージェント、状態、報酬、行動などがあります。
環境とは今回の場合は、ponのゲームでしょう。
エージェントは、右のパドル。
状態は、ボールの位置と自分と相手のパドルの位置。
報酬は、得点とします。
行動は、自分のパドルの上下。

今回の目的は報酬の最大化つまり得点を最大とすることです。
自分の得点 - 相手の得点 = 報酬です。
ある環境に置かれたエージェントが状態を把握して行動し、報酬を最大化するのが強化学習です。
今回は、ponのゲームにおいて右のパドルをボールの位置と自分と相手のパドルの位置にもとずいて上下させ、得点を最大化します。

これだとただの強化学習です。
深層強化学習は何が違うのでしょうか?
簡単に書くと今までゲームの特徴量をいちいちゲームに合わせて人間が手動で設計しなければならなかったのがDeep learningを用いることで画像から直接特徴量が抽出できるようになったのです。
文字よりも画像を見せてもらった方がわかりやすいということでしょうね。

他にも強化学習と深層強化学習違いはたくさんあります。
詳しい解説はこちらをみてください。

強化学習の環境構築

強化学習の参入障壁の一つに環境構築がめんどくさそうだというのが個人的にありました。
調べてみると簡単でした。

git clone https://github.com/openai/gym
cd gym
pip install -e . # minimal install

pip install ‘gym[atari]’

これでatariのゲーム環境を使えます。

そしてこれでパックマンができます。
ランダムに動くだけですが…

import gym  
env = gym.make('MsPacman-v0')  
env.reset()  
for _ in range(5000):  
    env.render()  
    env.step(env.action_space.sample()) # take a random action  
    
Pacman.py

パックマン

パックマンを起動した時の様子です。

実際にやってみた

では、実際に試してみましょう。
このリンクに書いてある通りにやれば問題ないです。

python train.py –gpu 1 –render –final-steps 10000000 でtrainingさせます。

いい結果が出るまでにはかなり時間がかかります。
Macbook proで21-0で勝つまでに2日半ぐらいかかりました。

[深層強化学習]pon-1

始めたての状態。
ただ小刻みに揺れているだけです。
左がコンピュータで右が自分

[深層強化学習]pon-2

エポック750辺りの様子です。
たまに点をいれられるようになりました。

エポック750辺りのターミナルの様子です。

rewardは(自分の点数-相手の点数)です。

[深層強化学習]pon-3

エポック900辺りの様子です。
10点ぐらいいれられるようになりました。

[深層強化学習]pon-4

エポック1200辺りの様子です。
かなり勝てそうになってきました。

[深層強化学習]pon-5

エポック1300辺りの様子です。
ついに勝ちました!!

[深層強化学習]pon-6

エポック1800辺りの様子です。
ほぼ完封に近いことができるようになりました。
必勝パターンを覚えたようです。
残念ながら0-21の試合は取れませんでした。

最後の方のターミナルの様子

rewardが21となっており完封勝ちしたものがあることがわかります。

かなり学習に時間はかかりましたが、最終的には完封勝ちまで行けました。
途中から点を取る方法を学びその後は必勝パターンを学んだようです。
相手のコンピューターはおそらくボールの位置を一定のスピードで追随するだけのようです。
それより早く動かせれば得点を取れるということです。
こんな感じで強化学習はどんどん学びます。
面白かったです。

応用例

では、この強化学習は何に応用できるのでしょうか?
みなさんが知っている通り一番有名なのは今だとAlpha Goですね。
他には2Dゲームが多かったです。 最近は徐々に3Dのゲームもできるようになってきています。

CS275 Project: 3D Flappy Bird with Reinforcement Learning

Flappy Birdを学習させる様子。
計算量どのくらいかかるんだろうか...

Asynchronous Methods for Deep Reinforcement Learning: Labyrinth

謎の3Dゲームの様子

そのうちどんなゲームでも人間は勝てなくなるでしょうね。
ゲームができるということは現実でもかなりうまくいきそうですが、ゲームという閉じた環境だからこそ勝てているのでしょう。
Deep learningは閉じた環境だとめちゃめちゃ強いですからね。
他にはロボットの制御とかもあります。

Deep Reinforcement Learning for Robotic Manipulation

これはロボットに
ドアの開け閉めを覚えさせる様子です。
人が邪魔しても大丈夫なのが面白いです。

Robot Control with Distributed Deep Reinforcement Learning

こちらは小さな車のようなロボットを学習させた様子です。
最後の方に動いている様子があります。
なんかみていると酔いそうです。

ロボットに使えるようになると劇的に変化すると思います。
今までプログラムしたことしかできなかったのが、他のこともできるようになると臨機応変な対応ができるようになりそうです。
そのうちロボットが手術とかするようになるかもしれませんね。
他には、株や仮想通貨の取引も自動化できるようになるかもしれません。
webなどのデザインも強化学習で学んでいくことによって柔軟に変わっていくかもしれません。
きっと応用の幅はかなり広いと思います。
普通の機械学習はデータありきでそれを使って学びますが、強化学習は繰り返しできる環境を与えてデータを生成しながら学ぶので柔軟性があります。

感想

去年から機械学習の勉強を始めて、古典的機械学習、deep learning、CNN、RNN、自然言語処理、GAN、DQNととりあえず一通りやってみましたが一番面白そうだと思ったのはこの強化学習でした。
今後は強化学習とKaggleを引き続きやっていきます。
ちなみに強化学習の勉強の進め方は、下の2冊の順でやるといいらしいです。

参考文献

https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%B3_(%E3%82%B2%E3%83%BC%E3%83%A0) https://qiita.com/icoxfog417/items/242439ecd1a477ece312 http://sssslide.com/speakerdeck.com/takuseno/survey-of-deep-reinforcement-learning%20%20 https://github.com/imai-laboratory/dqn https://deepage.net/machine_learning/2017/08/10/reinforcement-learning.html