Deep Q-Network (DQN)
Deep Learning + 強化学習を使って行動パターンを学習させるDeep Q-Networkは面白いと思い、実装してみました。少しだけ結果が出たので公開します。
ソースコードは以下で公開しています。
https://github.com/dsanno/chainer-dqn
DQNについては以下が詳しいです。
DQNの生い立ち + Deep Q-NetworkをChainerで書いた
学習対象
今回DQNに学習させるゲームはくまのプーさんのホームランダービー!です。(リンク先で音が鳴るので注意)
プニキことプーのアニキに多くのホームランを打たせることを目標にします。
このゲームを選んだ理由は以下の通りです
- ルールが単純
ピッチャーが投げる球を丸太で打ち返し、規定数ホームランを打てばクリアとなります - 報酬の判定が簡単
結果が「ホームラン」「ストライク」といった画像で示されるので、画像に対応した報酬を与えてやります
あとは人間にとって非常に難しいという理由もあったのですが、難しくなるところまで到達できませんでした。(参考: ニコニコ大百科)
開発環境
- Windows 10
- Chainer 1.5.1
- 画面キャプチャと操作にPyAutoGUIを使用
- GeForce GTX970
CPUだと学習に時間がかかりすぎてうまく動作しません
ニューラルネットワーク構成
- 入力は150 x 112 x 3chのピクセルデータです。ゲーム画面のサイズは600 x 450pxなのですが、キャプチャした画像を縦横1/4ずつ縮小して入力しています。
- 出力は行動の評価値のベクトルです。
ベクトルの長さは行動パターンの数に一致します。
今回はポインタのY座標は固定でX座標を33段階で変動させるようにしました。
ボタンはONとOFFの2状態があり計66個の行動パターンとなります。 - 中間レイヤはConvolutional Neural Networkが3層、LSTMが1層、Fully Connected Layer 1層となっています。
プレイについて
- タイトル画面、ピッチャー選択画面等では、決められた位置をクリックするようにしました。
- 対戦中は、100msごとに画面をキャプチャして入力画像として使います。(以下、100ms間隔の単位を「フレーム」と呼びます)評価値の最も高い行動パターンを次のフレームの行動とします。
- 以下の状態を判定したときに報酬を与えました。それ以外のフレームでの報酬は0です。
ルール上ファールとヒットはストライクと同じ失敗扱いですが、空振りよりは球に当たったほうが良い行動と言えるので、ストライクより少しだけ報酬を高くしています。- ホームラン: 100
- ストライク: -100
- ファール: -90
- ヒット: -80
- 以下の3パターンでランダムな行動をとらせるようにしました。
今回のゲームは1フレームだけランダムな行動をとらせてもあまり意味がないので、10~30フレームの範囲で連続したフレームの間ランダムな行動をとらせました。- ポインタの位置だけランダム
- ボタンの状態だけランダム
- ポインタの位置もボタンの状態もランダム
学習について
- 学習はプレイと別スレッドで並行して行いました。
- LSTMの学習を行うために、以下のように連続したフレームの入力値を与えてパラメータ更新するようにしました。
mは4~32の範囲で徐々に大きくしました。- nをランダムに選択する
- フレームnの入力値を入力
- フレームn + 1の入力値を入力してフレームn + 1の最大評価値を求める。それを使ってフレームnのパラメータを更新
- ...
- フレームn + mの入力値を入力してフレームn + mの最大評価値を求める。それを使ってフレームn + m - 1のパラメータ更新
設定
- ミニバッチ数: 64
- DQNのgamma: 0.98
- optimizer: AdaDelta
文献[2]でAdaDeltaを使っていたので採用しました。
パラメータはデフォルトのrho=0.95, eps=1e-06としています。 - chainer.optimizer.GradientClipping()を使ってL2 normを最大0.1に制限
勾配を制限しないとQ値が大きくなりすぎ学習が安定しませんでした。
学習結果
10時間ほどステージ1で学習を続けたところ、ステージ1は大体クリアできるようになりました。
プレイ動画を以下にアップロードしました。
動画撮影時にはランダムな行動をとらないようにしています。
https://youtu.be/J4V6ZveYFUM
ほかのステージも含めて学習を行わせたところ、ステージ3をまぐれでクリアするところまでは確認できました。
参考文献
- [1] V. Mnih et al., "Playing atari with deep reinforcement learning"
http://arxiv.org/abs/1312.5602 - [2] M. Hausknecht, P. Stone, "Deep Recurrent Q-Learning for Partially Observable MDPs"
http://arxiv.org/abs/1507.06527 - [3] DQNの生い立ち + Deep Q-NetworkをChainerで書いた