Deep Reinforcement Learning: Pong from Pixels - Reinforcement Learning(強化学習)勉強メモ
http://karpathy.github.io/2016/05/31/rl/ 入門から実践までカバーしていて大変よい。日本語訳は https://postd.cc/deep-reinforcement-learning-pong-from-pixels-1/ にある。
- Actions は Pong のゲームのバーを Up or Down する。
- Reward はボールを相手のバーの向こうに飛ばせたら +1、自分がミスしたら -1。それ以外は 0 とする。
- 入力は 210x160x3 の image frame をプリプロセスしたもの。(前後のフレームの差にするとか)
- Agent は入力とRewardしか知らない。ゲームのルールやコツを知らない。
- Policy Network
- 2層のNN。bias なし。
- 1層目がゲームの状況(ボールが上の方にあるとか、バーが真ん中にいるとか)
- 2層目がその状況のときに Up すべきか。を決める。
- 出力は Up の確率。最後に sigmoid で。
- Supervised learning
- ある image frame X に対してTarge Label y が Up だとすると。gradient 1 を backprop で入力して全ての parameters が Up の方向に動くようにモデルを更新する。
- Policy Gradient と Supervised learning との違い
- Label y が分からない。仮にある image frame に対しての Upの確率が0.6の場合、それは正解だろうか?正解となる訓練データがない。困った。
- ところで log probability -1.2 がなぜ 30% になるのだろうか。sigmoid(-1.2)=0.23 なのだけど。
- Policy Gradient の手順
- モデルからサンプリングする。例)30% なら Down となる
- これを正解として backprop してもいいけど。現時点では正解かどうかはわからない。
- 分からないなら、正解がわかるまでまとう(ここが肝)
- Pong の場合はシンプルにゲームが終わるまで待てば良い。勝てば +1 負けたら -1 の Reward をもらう(Reward の定義が上記と変わったね)
- 例に出した Down をしたあとに最終的に負けたのであれば -1.0 を backprop でフィードバックする。モデルが Input の Image Frameに対して Down を出力しない方向に少しだけ賢くなる
- Policy Gradient の Training
- モデルパラメータの初期化。通常のNNと同じ。
- 100 game プレイする。これを 1 rollout と呼ぶ。
- 1 game は 200 frame。
- 1 rollout 毎に 200 - 100 回の Up/Down の決断をしている
- この全ての決断に対して parameter を学習する。
- これが終わったら次の 1 rollout を学習する
- 別の見方(alternative view)
- Tensorflow など backdrop を考えなくても良いフレームワークの場合には上の考え方は分かりづらいかもしれないので別の見方を紹介する。
- Supervised learning との違いは
- Label y_i がないので x_i をサンプルしてその結果を y_i としている
- 最終的な結果 Game に勝ったかどうかで loss を掛け算で調節する。そうすることで良いアクションでは log probability を上げる。だめなアクションでは逆に下げるのだ。
- なので A_i (advantage) を log prob に掛ける形になったものを maximize する。A_i が 1 なら log(y_i|x_i) が大きくなる方向に動く。A_j が -1 なら log(y_j|x_j) が小さくなる方向に動く。
- Using Policy Gradient in Practice
- cross-entropy method (CEM) を必ず試せ
- PG よりも https://arxiv.org/abs/1502.05477 を先