GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

yenchenlin

DeepLearningFlappyBird – ディープ・レインフォース・ラーニング(Deep Q-learning)を使ったフラッフィー・バード・ハック

投稿日:

ディープ・レインフォース・ラーニング(Deep Q-learning)を使ったフラッフィー・バード・ハック

ディープQネットワークを使ってフラッディバードの遊び方を学ぶ

7分バージョン: DFN for flappy bird

概要

このプロジェクトは、Deep Reinforcement Learning [2]を使用したPlay Atariで説明されたDeep Q Learningアルゴリズムの説明に続き、この学習アルゴリズムが悪名高いFlappy Birdにさらに一般化できることを示しています。

インストールの依存関係:

  • Python 2.7または3
  • TensorFlow 0.7
  • パイゲーム
  • OpenCV-Python

どのように実行する?

git clone https://github.com/yenchenlin1994/DeepLearningFlappyBird.git
cd DeepLearningFlappyBird
python deep_q_network.py

Deep Q-Networkとは何ですか?

それは畳み込みニューラルネットワークであり、その入力は生のピクセルであり、その出力は将来の報酬を推定する価値関数である、Q学習の変形で訓練されている。

深い強化学習に興味のある方は、次の記事を読むことを強くお勧めします。

深い強化学習の解説

ディープQネットワークアルゴリズム

Deep Q Learningアルゴリズムの擬似コードは、[1]で与えられているように、以下にあります。

Initialize replay memory D to size N
Initialize action-value function Q with random weights
for episode = 1, M do
    Initialize state s_1
    for t = 1, T do
        With probability ϵ select random action a_t
        otherwise select a_t=max_a  Q(s_t,a; θ_i)
        Execute action a_t in emulator and observe r_t and s_(t+1)
        Store transition (s_t,a_t,r_t,s_(t+1)) in D
        Sample a minibatch of transitions (s_j,a_j,r_j,s_(j+1)) from D
        Set y_j:=
            r_j for terminal s_(j+1)
            r_j+γ*max_(a^' )  Q(s_(j+1),a'; θ_i) for non-terminal s_(j+1)
        Perform a gradient step on (y_j-Q(s_j,a_j; θ_i))^2 with respect to θ
    end for
end for

実験

環境

深いQ-networkは、各タイムステップでゲーム画面から観測された生のピクセル値に基づいて訓練されるため、[3]は元のゲームに登場した背景を削除することでより速く収束させることができることがわかります。 このプロセスは、次の図のように視覚化できます。

ネットワークアーキテクチャ

[1]によると、私はまず以下のステップでゲーム画面を前処理しました:

  1. 画像をグレースケールに変換する
  2. イメージを80×80にサイズ変更する
  3. 最後の4フレームをスタックして、ネットワーク用の80x80x4入力アレイを生成する

ネットワークのアーキテクチャを下図に示します。 第1の層は、4×4の8x8x4x32カーネルで入力画像を畳み込みます。出力は、2×2の最大プール層を通過します。 2番目の層は、2のストライドで4x4x32x64カーネルと絡み合っています。 3番目の層は3x3x64x64カーネルと1のストライドで絡み合っています。プールをもう一度最大にします。 最後の隠れ層は、完全に接続された256のReLUノードで構成されています。

最終出力レイヤーは、ゲーム内で実行できる有効なアクションの数と同じ次元を持ちます。ここで、0番目のインデックスは何もしないことに対応します。 この出力層の値は、有効な各アクションの入力状態が与えられたQ関数を表します。 各時間ステップで、ネットワークは、貪欲なポリシーを使用して、最も高いQ値に対応するアクションを実行します。

トレーニング

最初に、標準偏差0.01の正規分布を使用してすべての重み行列をランダムに初期化し、再生メモリを最大500,00回の経験値で設定します。

ネットワークの重みを更新することなく、最初の10,000のタイムステップでランダムにアクションを選択することでトレーニングを開始します。 これにより、トレーニングが始まる前にシステムがリプレイメモリにデータを読み込むことができます。

ε= 1を初期化する[1]とは異なり、εは次の3000,000フレームにわたって0.1から0.0001まで線形にアニールすることに注意してください。 私がこのように設定したのは、エージェントが0.03秒ごとにアクション(FPS = 30)を選ぶことができるということです。高いεはそれをフラップにしすぎてゲーム画面のトップに止まり、不器用な方法でパイプ。 この条件は、εが低いときにのみ他の条件を見始めるので、Q関数を比較的遅く収束させる。 しかし、他のゲームでは、εを1に初期化する方がより合理的です。

訓練時間中、各時間ステップで、ネットワークは、学習メモリからのサイズ32のミニバッブをサンプリングして訓練し、0.000001の学習率を有するAdam最適化アルゴリズムを使用して上述の損失関数に勾配ステップを実行する。 アニーリングが終了した後、ネットワークはεを0.001に固定して無期限に訓練を続けます。

よくある質問

チェックポイントが見つかりません

saved_networks/checkpoint 1行目を次のように変更します。

model_checkpoint_path: "saved_networks/bird-dqn-2920000"

再現するには?

  1. これらの行をコメントアウトする

  2. deep_q_network.pyのパラメータを次のように変更します。

OBSERVE = 10000
EXPLORE = 3000000
FINAL_EPSILON = 0.0001
INITIAL_EPSILON = 0.1

参考文献

[1] Mnih Volodymyr、Koray Kavukcuoglu、David Silver、Andrei A. Rusu、Joel Veness、Marc G. Bellemare、Alex Graves、Martin Riedmiller、Andreas K. Fidjeland、Georg Ostrovski、Stig Petersen、Charles Beattie、Amir Sadik、Ioannis Antonoglou 、Helen King、Dharshan Kumaran、Daan Wierstra、Shane Legg、およびDemis Hassabisが含まれます。 深層強化学習による人間レベルの制御 Nature、529-33,2015。

Volodymyr Mnih、Koray Kavukcuoglu、David Silver、Alex Graves、Ioannis Antonoglou、Daan Wierstra、およびMartin Riedmiller。 深い強化学習でアタリを演奏する NIPS、ディープラーニングワークショップ

[3] Kevin Chen。 フラディーバード レポートの ための深層強化学習 | Youtubeの結果

免責事項

この作品は、次のレポを基にしています。

  1. [sourabhv / FlapPyBird]( https://github.com/sourabhv/FlapPyBird
  2. asrivat1 / DeepLearningVideoGames







-yenchenlin
-, ,

執筆者: