1 of 32

DQN と Gorila と夏休み

GCPUG in Tokyo

藤原 秀平 (FUJIWARA Shuhei)

https://goo.gl/Qn202M

http://gcpug.jp

2 of 32

自己紹介

藤原 秀平 (FUJIWARA Shuhei)

twitter: @shuhei_fujiwara

  • TensorFlow のコード書いたり�TensorFlow の話したりしてご飯食べてる人です

  • https://github.com/sfujiwara/dqn-tensorflow

http://gcpug.jp

3 of 32

この会はいったい・・・?

  • お察しの通り雑な会です

http://gcpug.jp

4 of 32

導入

http://gcpug.jp

5 of 32

DQN (Deep Q-Network) の自己紹介

  • DeepMind 社が提案した強化学習のアルゴリズム
  • Deep Learning で何か良い感じのゲーム AI を作る

http://gcpug.jp

6 of 32

強化学習

現実世界

or

シミュレータ

行動

学習

http://gcpug.jp

7 of 32

DQN の将来の夢

画面の状態

key 1

key 2

key N

key 3

各ボタンを押したときに

期待される最終スコアが出てくる

http://gcpug.jp

8 of 32

DQN にやらせたいこと

  • とりあえず試作段階としてプレーヤーを追いかける
    • 上下左右のキーを押して操作
    • 将来的には障害物を上手く避けたり攻撃させたい

P

D

http://gcpug.jp

9 of 32

DQN の餌

ボタンを押す前の

画面の状態

押したボタン

ボタンを押した後の

画面の状態

報酬

・・・

http://gcpug.jp

10 of 32

DQN のためのシミュレータ

画面の状態

でぃーぷ

らーにんぐ

シミュレータ

ボタンを押す前の

画面の状態

押したボタン

ボタンを押した後の

画面の状態

報酬

http://gcpug.jp

11 of 32

画面の状態の定義

画面の状態

0

0

0

0

0

0

0

0

0

0

0

0

0

0

1

0

0

1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

  • DQN の位置だけ 1 の配列

  • プレーヤーの位置だけ 1 の配列

  • 他にも障害物の位置とか色々増やせる

  • 画像の RGB とかにしちゃっても良い

http://gcpug.jp

12 of 32

DQN の学習方法

ボタンを押す前の

画面の状態

押したボタン

ボタンを押した後の

画面の状態

報酬

でぃーぷ

らーにんぐ

key 1

key 2

key N

・・・

予測スコア A

http://gcpug.jp

13 of 32

DQN の学習方法

ボタンを押す前の

画面の状態

押したボタン

ボタンを押した後の

画面の状態

報酬

でぃーぷ

らーにんぐ

key 1

key 2

key N

・・・

予測スコア B

報酬

http://gcpug.jp

14 of 32

DQN の学習方法

  • 予測スコア A と予測スコア B の差が小さくなるように�重みを更新していく

http://gcpug.jp

15 of 32

進捗

http://gcpug.jp

16 of 32

前回までのあらすじ

  • 実装したがめっちゃ遅いしチューニングも大変
    • 丸 1 日は余裕で掛かる
  • 実装がわりと雑
  • 報酬の定義が何かアレ

http://gcpug.jp

17 of 32

進捗どうですか?

  • 学習がめっちゃ遅かったのがだいぶ改善した
    • ML Engine で GPU が使えるようになった
    • バグがとれた
    • Replay memory の実装を修正
    • バグがとれた

  • シミュレータが何かこう良い感じになった
    • OpenAI Gym に合わせた実装に変更

http://gcpug.jp

18 of 32

OpenAI Gym

強化学習アルゴリズムを開発するための toolkit

  • 世界中の人と結果を共有したり
  • 様々なシミュレータが提供されていたり

http://gcpug.jp

19 of 32

OpenAI Gym

シミュレータが継承すべきスーパークラスが定められている

  • シミュレータの実装を OpenAI Gym に則ったものに修正
    • 他のゲームも簡単に試せるように

http://gcpug.jp

20 of 32

GPU を使おう!

思ったより速くならなくてつらい

  • 計算と重みの更新は当然きっちり速くなる

  • シミュレータは CPU でしか動かせない
    • ここがボトルネックになる
    • シミュレータの部分は TensorFlow で記述できないので�しゃーなし

http://gcpug.jp

21 of 32

シミュレータを回す頻度を落とす

STEP 1: ゲームをプレイしてデータを replay memory に保存

STEP 2: replay memory からデータを取り出して学習 × N 回

STEP 3: STEP 1 へ戻る

  • STEP 2 は GPU で速くなるので�ここの回数を多めに調整して GPU を活用
  • ゲームをプレイする回数は増えないので�報酬がスパースなゲームにはちょっと弱いかも?
  • 本当は CPU を死ぬほど並べたいけど ML Engine は GPU の方が圧倒的にコスパが良い

http://gcpug.jp

22 of 32

Google ReInforcement Learning Algorithm

http://gcpug.jp

23 of 32

実際に組んだやつ

勾配を�計算

勾配

勾配

共有

パラメータを更新

  • Replay memory は共有せずそれぞれが持つ
  • Actor と Learner は兼任
  • Target network の所は�サボった

シミュレータを動かすのと勾配の計算を

交互に行う

http://gcpug.jp

24 of 32

補足

Q. Replay memory を共有しなかったのはなぜ?

  • TensorFlow の queue を使えばできるけどちょいめんどい
    • Master だけのときとクラスタ組んだときで�コードを変更する必要が出てくるとか

  • 1 ノードのメモリは小さいのでデータを複数ノードに�分散させた方が良い気がした
    • これは試してみないとわからない

http://gcpug.jp

25 of 32

補足

Q. Actor と Learner を兼任させたのはなぜ?

  • これもやろうとするとローカルとクラウドで�コードを変える必要が出てくる
    • 役割の種類は少ないほど扱いが楽

  • むしろ分けるメリットがわからなかったので�教えてください
    • 計算の効率も変わらない気がするけど�あんまわかってない

http://gcpug.jp

26 of 32

Replay Memory の実装

めっちゃシンプルにしたらめっちゃ速くなった

  • 元々は Pandas の DataFrame で実装してた

http://gcpug.jp

27 of 32

上手く学習できるようになってきたので

OpenAI のシミュレータで適当に遊んでみた

  • 何かデモをやるかもしれないし、やらないかもしれない

http://gcpug.jp

28 of 32

報酬を上手く定義しよう!

報酬がスパースなゲームはとてもつらいということに気付く

他人事とは思えない悲しみの連鎖

報酬が貰えない

学習できない

http://gcpug.jp

29 of 32

報酬を上手く定義しよう!

  • 相手を捕まえたら大きな報酬
  • 毎ターン距離に応じてごく僅かのペナルティ
    • ペナルティはなしだと報酬がスパースで学習に�時間が掛かる
    • ペナルティが大きいと早く近づこうとしすぎて�将来的に障害物を置いたときに引っかかりやすくなる�(気がする)

http://gcpug.jp

30 of 32

数十分くらいで 8 x 8 を極めし者の姿

http://gcpug.jp

31 of 32

やったね

http://gcpug.jp

32 of 32

What’s Next?

  • 障害物を設置するぞ!
  • 何か攻撃手段を用意するぞ!
  • Replay memory に TensorFlow の queue を使うと�高レベル API の Canned Estimator にまとめられそう�みたいな話もあるっちゃあるけど微妙かも

http://gcpug.jp