TensorFlow : TensorLayer : チュートリアル (3) 深層強化学習 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 12/04/2018
* 本ページは、TensorLayer の以下のドキュメントの一部を翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
チュートリアル (3)
Pong Game サンプルを実行する
チュートリアルの 2nd パートでは、深層強化学習サンプルを実行します、これは Deep Reinforcement Learning: Pong from Pixels で Karpathy により紹介されています。
python tutorial_atari_pong.py
チュートリアル・コードを実行する前に、OpenAI gym 環境をインストールする必要があります、これは強化学習のためのポピュラーなベンチマークです。総てが正しくセットアップされれば、次のような出力を得るでしょう :
[2016-07-12 09:31:59,760] Making new env: Pong-v0 [TL] InputLayer input_layer (?, 6400) [TL] DenseLayer relu1: 200, relu [TL] DenseLayer output_layer: 3, identity param 0: (6400, 200) (mean: -0.000009 median: -0.000018 std: 0.017393) param 1: (200,) (mean: 0.000000 median: 0.000000 std: 0.000000) param 2: (200, 3) (mean: 0.002239 median: 0.003122 std: 0.096611) param 3: (3,) (mean: 0.000000 median: 0.000000 std: 0.000000) num of params: 1280803 layer 0: Tensor("Relu:0", shape=(?, 200), dtype=float32) layer 1: Tensor("add_1:0", shape=(?, 3), dtype=float32) episode 0: game 0 took 0.17381s, reward: -1.000000 episode 0: game 1 took 0.12629s, reward: 1.000000 !!!!!!!! episode 0: game 2 took 0.17082s, reward: -1.000000 episode 0: game 3 took 0.08944s, reward: -1.000000 episode 0: game 4 took 0.09446s, reward: -1.000000 episode 0: game 5 took 0.09440s, reward: -1.000000 episode 0: game 6 took 0.32798s, reward: -1.000000 episode 0: game 7 took 0.74437s, reward: -1.000000 episode 0: game 8 took 0.43013s, reward: -1.000000 episode 0: game 9 took 0.42496s, reward: -1.000000 episode 0: game 10 took 0.37128s, reward: -1.000000 episode 0: game 11 took 0.08979s, reward: -1.000000 episode 0: game 12 took 0.09138s, reward: -1.000000 episode 0: game 13 took 0.09142s, reward: -1.000000 episode 0: game 14 took 0.09639s, reward: -1.000000 episode 0: game 15 took 0.09852s, reward: -1.000000 episode 0: game 16 took 0.09984s, reward: -1.000000 episode 0: game 17 took 0.09575s, reward: -1.000000 episode 0: game 18 took 0.09416s, reward: -1.000000 episode 0: game 19 took 0.08674s, reward: -1.000000 episode 0: game 20 took 0.09628s, reward: -1.000000 resetting env. episode reward total was -20.000000. running mean: -20.000000 episode 1: game 0 took 0.09910s, reward: -1.000000 episode 1: game 1 took 0.17056s, reward: -1.000000 episode 1: game 2 took 0.09306s, reward: -1.000000 episode 1: game 3 took 0.09556s, reward: -1.000000 episode 1: game 4 took 0.12520s, reward: 1.000000 !!!!!!!! episode 1: game 5 took 0.17348s, reward: -1.000000 episode 1: game 6 took 0.09415s, reward: -1.000000
このサンプルは、丁度人間の挙動のように、ニューラルネットワークに画面入力から Pong ゲームをどのようにプレーするかを学習することを可能にします。ニューラルネットワークは fake AI プレーヤーとプレーしてそれを打ち負かすことを学習します。15,000 エピソードの訓練後、ニューラルネットワークはゲームの 20% 勝利できます。ニューラルネットワークは 20,000 エピソードでゲームの 35% 勝利し、それが訓練するためのより多くの勝利データを持つにつれ、ニューラルネットワークがより速く学習することを見ることができます。30,000 エピソードの間それを実行すれば、それは決して敗北しません。
render = False resume = False
ゲーム環境を表示したい場合、render を True に設定します。コードを再度実行するとき、resume を True に設定できます、コードは存在するモデルをロードしてその上で基本モデルをその上で訓練します。
強化学習を理解する
Pong ゲーム
強化学習を理解するため、元の画面入力から Pong ゲームをどのようにプレーするかをコンピュータに学習させます。始める前に、Deep Reinforcement Learning: Pong from Pixels と呼ばれる有名なブログを調べることを強く勧めます、これは python-numpy と OpenAI gym 環境を使用した深層強化学習のミニマリズム的な実装です。
python tutorial_atari_pong.py
ポリシーネットワーク
深層強化学習では、ポリシーネットワークは深層ニューラルネットワークと同じで、私達が何をすべきか (move UP or DOWN) を知らせるアクションを出力するのはプレーヤー (or 「エージェント」) です; Karpathy のコードでは、2 つのアクション, UP と DOWN, だけを定義して単一の sigmoid 出力を使用していました; チュートリアルをより一般的にするために、3 softmax 出力を使用して 3 つのアクションを定義しました、これは UP, DOWN と STOP (do nothing) です。
# observation for training states_batch_pl = tf.placeholder(tf.float32, shape=[None, D]) network = tl.layers.InputLayer(states_batch_pl, name='input_layer') network = tl.layers.DenseLayer(network, n_units=H, act = tf.nn.relu, name='relu1') network = tl.layers.DenseLayer(network, n_units=3, act = tf.identity, name='output_layer') probs = network.outputs sampling_prob = tf.nn.softmax(probs)
それからエージェントが Pong をプレーしているとき、それは異なるアクションの確率を計算し、そして一様分布からサンプル (アクション) をドローします。アクションは 1, 2 と 3 で表わされますが、softmax 出力は 0 から始まるべきなので、ラベル値をマイナス 1 して計算します。
prob = sess.run( sampling_prob, feed_dict={states_batch_pl: x} ) # action. 1: STOP 2: UP 3: DOWN action = np.random.choice([1,2,3], p=prob.flatten()) ... ys.append(action - 1)
ポリシー勾配
ポリシー勾配法は状態をアクションにマップするポリシー関数を直接学習する end-to-end アルゴリズムです。近似ポリシーは期待報酬を最大化することにより直接学習可能でしょう。ポリシー関数のパラメータ (e..g. pong サンプルで使用されるポリシーネットワークのパラメータ) は期待報酬の勾配のガイダンスのもとで訓練されて学習可能です。換言すれば、そのパラメータを更新することを通してポリシー関数を徐々に調整できます、その結果それは与えられた状態からより高い報酬に向けてアクションを生成します。
ポリシー勾配の代替方法は深層Q学習 (DQN) です。それは、状態とアクションをある値にマップする (Q 関数と呼ばれる) 値関数 (= value function) を学習することを試みる Q-学習に基づきます。DQN は Q 関数を関数近似器として表わすために深層ニューラルネットワークを用います。訓練は temporal-difference 誤差 (訳注: = TD 誤差) を最小化することにより成されます。「経験再生 (= experience replay)」と呼ばれる神経生物学的にインスパイアされたメカニズムが、非線形関数近似器の使用に起因するその安定性を改良することを手助けするために DQN と一緒に典型的には使用されます。
強化学習についてより良い理解を得るために次のペーパーをチェックすることができます。
- Reinforcement Learning: An Introduction. Richard S. Sutton and Andrew G. Barto
- Deep Reinforcement Learning. David Silver, Google DeepMind
- UCL Course on RL
近年で深層強化学習の最も成功したアプリケーションは Atari ゲームと (最初にワールドクラスのプロ囲碁棋士を打ち負かした) AlphaGO をプレーするための経験再生を持つ DQN を含みます。AlphaGO は、Pong ゲームの例に類似したそのポリシーネットワークを訓練するためにポリシー勾配法を使用しました。
- Atari – Playing Atari with Deep Reinforcement Learning
- Atari – Human-level control through deep reinforcement learning
- AlphaGO – Mastering the game of Go with deep neural networks and tree search
データセット反復
強化学習では、最後の決定をエピソードとして考えます。Pong ゲームでは、(一つの) エピソードは数十ゲームです、何故ならばゲームはどちらか一方のプレーヤーのための 21 のスコアが満点だからです。それでバッチサイズは幾つのエピソードをモデルを更新するために考えるかです。このチュートリアルでは、10 エピソードのバッチ上で RMSProp を使用して 200 隠れ層ユニットを持つ 2-層ポリシーネットワークを訓練します。
損失と更新式
訓練で最小化すべき損失式を作成します :
actions_batch_pl = tf.placeholder(tf.int32, shape=[None]) discount_rewards_batch_pl = tf.placeholder(tf.float32, shape=[None]) loss = tl.rein.cross_entropy_reward_loss(probs, actions_batch_pl, discount_rewards_batch_pl) ... ... sess.run( train_op, feed_dict={ states_batch_pl: epx, actions_batch_pl: epy, discount_rewards_batch_pl: disR } )
バッチの損失はポリシーネットワークの総ての出力、行なった総てのアクションそしてバッチの対応する割引報酬に関連します。最初に割引報酬と出力と真のアクション間の交差エントロピーを乗算して各アクションの損失を計算します。
What Next?
上のチュートリアルは貴方自身のエージェントを end-to-end でどのように構築できるかを示します。それは合理的な品質を持つ一方で、デフォルトのパラメータは最善のエージェントモデルを与えないでしょう。改良できる 2, 3 のことがここにあります。
まず最初に、型通りの MLP モデルの代わりに、Playing Atari with Deep Reinforcement Learning が記述するように画面情報をよりよく捕捉するために CNN を使用することができます。
また、モデルのデフォルト・パラメータは調整されていません。学習率、減衰 (率) を変更したりモデルの重みを異なる方法で初期化してみることができます。
最後に、異なるタスク (ゲーム) 上でモデルを試して Example の他の強化学習アルゴリズムを試すことができます。
以上