2018年1月30日 更新

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

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

3,586 view お気に入り 0

今回兼ねてからやってみたかった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辺りのターミナルの様子です。

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

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

関連する記事 こんな記事も人気です♪

Python + tensorflow でGANを試してみた.

Python + tensorflow でGANを試してみた.

今回兼ねてからやってみたかったGANを触ってみました。実際に画像が生成されていく様は楽しかったです。
Takumi Ihara | 11,849 view
等角写像による画像の変換〜Schwarz-Christoffel 変換〜part 2

等角写像による画像の変換〜Schwarz-Christoffel 変換〜part 2

前回の記事「等角写像による画像の変換〜Schwarz-Christoffel 変換〜part 1」の続きです. 実際に実装をして,写像を確かめてみます.
三好 裕之 | 285 view
等角写像による画像の変換〜Schwarz-Christoffel 変換〜 part1

等角写像による画像の変換〜Schwarz-Christoffel 変換〜 part1

等角写像の一つであるSchwarz Christoffel 変換を用いて,画像の変換をしてみます. python によるコードも記載しております. 画像はhttps://uk.mathworks.com/help/images/examples/exploring-a-conformal-mapping_ja_JP.html より.
三好 裕之 | 324 view
画像のセグメンテーション - Level set 法の実装 (Chan-Vese) -

画像のセグメンテーション - Level set 法の実装 (Chan-Vese) -

画像処理のセグメンテーションの分野で用いられるLevel set 法を用いて画像のセグメンテーションを行います.
三好 裕之 | 1,838 view
画像の一部を消すInpainting という技術とその実装 (python)

画像の一部を消すInpainting という技術とその実装 (python)

Python + OpenCVにより,画像の修復の技術,「Inpainting 」の実装を行います.
三好 裕之 | 3,203 view

この記事のキーワード

この記事のキュレーター

Takumi Ihara Takumi Ihara