PFRL
「PFRL」は、株式会社Preferred Networksが開発した、PyTorchユーザー向けの深層強化学習ライブラリです。
PFRL入門
npakaさんのnote記事「PFRL入門」が非常に簡潔にまとまっていると思います。
学習させてみた
コードに変更を加えずにそのまま学習させてみました。
200回で最高の200に到達しました。
episode: 100 R: 13.0
episode: 200 R: 200.0
しかし、学習が進むとなぜか学習しなかったレベルまでスコアが突然下がります。
episode: 100 R: 13.0
episode: 200 R: 200.0
episode: 300 R: 20.0
episode: 400 R: 165.0
episode: 500 R: 31.0
何が起きているのか?
どうやら傾きながら、一方向に移動しているようです。手の平の上に棒を乗せて走っていく小学生みたいですね。
棒は倒れませんが、あっという間に範囲外に出てしまっています。
学習が進めば改善するのか?
さっきの10倍の5000回学習させます。
episode: 4800 R: 13.0
episode: 4900 R: 13.0
episode: 5000 R: 38.0
考察
学習させれば、上達するというわけではない。
上手く行った時に学習をやめさせるべきか?
どこで見極めるのかという別の問題が出てくる。
そもそもcarpoleの観測値と評価(報酬)は?
観測データ
carpole
観測データについては、下記のように記述されています。
カートとポールの状態を表す4つの値のようです。
カートを操作した結果、カートとポールの状態がobservationで定義されます。値の範囲は公式で定義されている値を記載しております。
配列0:カートの位置 -4.8~4.8
配列1:カートの速度 -Inf~Inf (無限大)
配列2:ポールの角度 -24~24[rad] ← 公式ではdegだがradの間違いであると思われる。
配列3:ポールの角速度 -Inf~Inf
コードではobsの値です。
obs, reward, done, _ = env.step(action)
reward(報酬)
reward(報酬)はどうでしょうか。
<報酬獲得条件:reward=1>
以下条件が全て成立している時に、報酬獲得(reward = 1)します。① ポール角度が±0.21以内
② カート位置が±2.4以内
つまり1、2に入っていれば、報酬が出るわけで途中の棒の姿勢とかは全く報酬に加味されていないというのがわかります。
なぜカートの位置によるNGを学習できないのか
学習していないわけではなく、 忘却と学習を繰り返している。
- 1 学習が0の時は、ポールがすぐ倒れる状態なので、ポールの角度維持する学習主に行う
- 2 ポールの維持とカート位置を同時に学習する
- 3 R200を達成する
- 4 カート位置の学習の割合が大幅に減ったことで忘却される。
- 5 すぐ端に着くようになる
- 6 2に戻る
2-6を繰り返すので学習が振動しているように見える。
報酬(reward)を変えてみる
本来の強化学習の目的(アルゴリズムを作ること?)とはズレてしまう部分もあるかもですが、報酬を規定のものから変えてみます。
報酬が1の時はカート位置が中央から外れるほどに報酬を下げてみました。
「円から出たらいけませんよ!」と条件を追加された子供みたいな動きですが、報酬の付け方で、学習結果は大きく変わるということがわかりました。
reward = reward - numpy.abs(obs[0])/2.0 if reward == 1 else reward
agent.observe(obs, reward, done, reset)
報酬(reward)をさらに変えてみる
せっかくなので、報酬をどうすれば良いのか試行錯誤した結果を出しておきます。
500回程度の学習でこれくらい安定します。
条件は自身で探されると面白いと思います。