# Reinforcement Learning : day 7 CartPole ## Why change from TSP ? * Policy Gradient で少し詰まったので正解のある問題設定で検証したかった * CartPole はインターネット上の先人がやり尽くしているので、学習がうまくいくハイパーパラメータや報酬設定の正解がある ## What is CartPole ? ![](https://i.imgur.com/9unQ3TZ.gif) CartPoleとは、棒のバランスをとるゲームです。 どれだけ長く棒を立てていられるかを競います。 ## Method of Learning 復習も兼ねて、下記を実装します。 * Q-Learning * DQN * Monte Carlo * Policy Gradient * Actor Critic ## State, Action of CartPole CartPole は次の状態を、continuous な値として持っています * カート位置(-2.4~2.4) * カート速度(-Inf~Inf) * 棒の角度(-41.8°~41.8°) * 棒の角速度(-Inf~Inf) CartPole の行動空間はある状態で、**左or右**の2行動しかない。 --- # Q-Learning ## Review Q-Learning は 価値反復法によって行動価値関数$Q$(ActionValue)を求める学習である。 $$ Q(s,a)\leftarrow Q(s,a)+\alpha(r+\gamma \max_{a'}Q(a',s')-Q(s,a))\\ \alpha:learning\ rate,\ \gamma:discount\ rate $$ ## State Definition 古典的なQ学習では、状態×行動のマトリクスを作成し、各セルの値(行動価値)を繰り返し更新する。 ここで、CartPoleは連続値を取るため、そのままでは状態のマトリクスを作成できない。 そこで適当な範囲に区切り、状態を離散化する。 ```python {"bin_min": -2.4, "bin_max": 2.4, "bins": 11}) #カート位置 {"bin_min": -3.0, "bin_max": 3.0, "bins": 11}) #カート速度 {"bin_min": -0.25, "bin_max": 0.25, "bins": 11}) #棒の角度 {"bin_min": -2.0, "bin_max": 2.0, "bins": 11}) #棒の角速度 ``` 状態の数は$11\times11\times11\times11=14641$ となる。 行動の数が2 なので、Qテーブルは14641*2 のマトリクスとなる。 ```python >>> model.qfunc.qtable 0 1 (0, 0, 0, 0) NaN NaN (0, 0, 0, 1) NaN NaN (0, 0, 0, 2) NaN NaN (0, 0, 0, 3) NaN NaN (0, 0, 0, 4) NaN NaN ... .. .. (10, 10, 10, 6) NaN NaN (10, 10, 10, 7) NaN NaN (10, 10, 10, 8) NaN NaN (10, 10, 10, 9) NaN NaN (10, 10, 10, 10) NaN NaN [14641 rows x 2 columns] ``` ## Reward 今回、open ai gym の CartPole-v0 を使用しているが、200step で終了するみたい。 ネットでよくある報酬の設定に習って、次のように設定する。 ```python reward = 1 if self.is_finish(): if self.step < 195: reward = -200 ``` ## Let's Training !! ### episode 0 ![](https://i.imgur.com/Q6DAnV5.gif) ### episode 200 ![](https://i.imgur.com/UbvtrHq.gif) ### episode 3000 ![](https://i.imgur.com/51mOaRl.gif) ### episode 3200 ![](https://i.imgur.com/D6jtJtr.gif) **Clear !!** --- # DQN ## Review DQN は Q-Learning における行動価値関数$Q$(ActionValue)をNNによって表現したもの。 ![](https://i.imgur.com/c0E9zLU.png) 教師あり学習の比較において、正解ラベルと予測値は次のように扱う。 $$ Answer: r+\gamma \max_{a'}Q(a',s'|\theta')\\ Predict: Q(a,s|\theta') $$ ## Structure of NN 今回もネットの例にならってこんな感じ。 ``` python input_size = 4 Layer("fc1", torch.nn.Linear, 16, ), Layer("relu1", torch.nn.ReLU, None, ), Layer("fc2", torch.nn.Linear, 16, ), Layer("relu2", torch.nn.ReLU, None, ), Layer("fc3", torch.nn.Linear, 16, ), Layer("relu3", torch.nn.ReLU, None, ), Layer("fc4", torch.nn.Linear, 2, ), ``` NNだと、連続値が扱えるので、Qテーブルで行った離散化は必要ない。 ## Reward 報酬を少し変えている。 ```python reward = 0 if self.is_finish(): if self.step < 195: reward = -1 else: reward = 1 ``` ## Let's Training !! ### episode 0 ![](https://i.imgur.com/WDpLZfB.gif) ### episode 40 ![](https://i.imgur.com/X7mFhIu.gif) 既に結構良い。 ### episode 180 ![](https://i.imgur.com/hziQnna.gif) 一応クリア。 Q学習に比べると 学習の収束が早いが、それは経験再生というテクニック(各経験を貯めておいて、教師ありと同様バッチ学習する)があるためである。Q学習の場合は、1 step で 1 つの state, action しか更新しないが、DQNでは、バッチの数(今回だと128)のstate, action の組み合わせに対して学習を行う事ができる。 ## Next モンテカルロ法をおさえておきたいなあ・・・。