Python

Pythonではじめての強化学習〜OpenAIGym

投稿日:2017年12月17日 更新日:

強化学習

強化学習は、機械学習の一分野.
見本となるデータがない場合に試行錯誤して学習していくスタイル.

ゼロからDeepまで学ぶ強化学習

強化学習問題のモデル化〜マルコフ決定過程

  • 操作できるのはAgentだけ
  • Agentは状態をもとに方策から行動を決定する
  • Agentは行動をEnvironmentに伝える
  • Environmentは報酬と状態をAgentに伝える
  • これをt回繰り返して、報酬の総和が最大化する方策を見つけるのが目的

Agent

π:方策
a:行動  
    
     r:報酬
     s:状態
     ↑
Environment

このモデルの解法としては、Value Iteration、Policy Iteration、Q-Learning、Deep Q-Learningなどがある.

Open AI Gym

Open AI Gymは、強化学習のための環境などを提供するツールキット.
ドキュメントはここ.

Open AI Gymのインストール

必要なライブラリのインストール

ubuntuではだいたいこんな感じ

Macの場合

最小限のインストール

全部の環境のインストール

Open AI Gymの基本

gymの中核的なインターフェイスはEnv.
makeで環境を選択.今回はカートポール問題.車の上に立てた棒を倒さないように動かすという問題.
まず、reset()は環境を初期化する.
次に、render()は人間にわかりやすく状態を表示する.これは別窓に表示される.render(close=True)とすると別窓を閉じる.
そして、step()は次の状態に遷移する.step()は、observation、reward、done、infoの4値を返す.
observationは環境の状態を表す値.rewardはそのときの報酬の値.doneは終わりか否か.infoはその他の情報でこの情報は判断に入れずに方策を選択するべき.

Agent用のインターフェイスはなく、こちらでプログラミングすることを想定している.

上のコードの標準出力は次のような感じ.

space

envは、action_spaceとobservation_spaceの値を持っている.
action_spaceは選択肢、observation_spaceは環境の状態の値の選択肢だと思われる.
env.action_space.sample()は取りうる選択肢からランダムにひとつ選んでる.

強化学習と深層学習の出会い

強化学習の問題をうえのようにモデル化すると、envは無限の教師データみたいなものを吐き出してくれるともみることができる.
そこで、これ深層学習で学習できる問題じゃないかということになる.
ただし、強化学習に深層学習のモデルを適用するには、「秘伝のたれ」として、「Experience Replay」とか「Fixed Target Q-Network」とか、「報酬のclipping」といった工夫が有効らしい.

参考: CartPoleでDQN(deep Q-learning)、DDQNを実装・解説【Phythonで強化学習:第2回】

DQNでCartPole問題

DQNでCartPole問題を解説したノートブック.
github.com/udacity/deep-learning/blob/master/reinforcement/Q-learning-cart.ipynb
QNetworkとMemoryというクラスを作成.
QNetworkには、学習用の深層学習のモデルを保存する.
損失関数には、Q関数という値を使う.
Memoryには、学習用の事例を記録する.
最初はランダムな事例を集めて、その後は今までで一番よさげな選択肢を取って、たまにランダムを織り交ぜる.(ε-greedy法)

qnetwork.py

何も考えずにコピペ.
learning_rateとhidden_sizeだけ、デフォルトを変更.
複層パーセプトロンのネットワークを構成.
主に使うのは、outputとopt(optimizer).
順伝播の計算は、outputを使う.
outputを使うには、sess.runでinputs_を渡してあげる.
学習には、optを使う.
optを使うには、sess.runでinputs_のほかに、actions_とtarget_Qsを与えてあげる必要がある.

memory.py

こちらもデフォルト値以外コピペ.
dequeは決められた数以上に入れると、古いものから削除してくれる行列.

cartpole.py

qnetwork.pyとmemory.pyを同じディレクトリに置いて実行する.
with区でsessをくくると、インデントが一段下がるので、とりあえず、with区は使わない.

どうも学習が安定していない気がする…

ここを参考にQ値を計算するTargetQNを固定してみた.

つぎに報酬のクリッピングと言われる箇所を移植してみた.
収束が少し早くなった.
がしかし、どうも安定しない.

ここまでの訂正済みソース

huber loss関数を採用してみた.うまく収束しない…

終了チェック

ここによれば、100以上の連続試行で平均195.0以上のスコアが取れれば「解決」にする.
毎回チェックすれば早く解決したかがチェックできるんだけど、毎回100回試行するのもあれなんで、最後の10のスコアの平均が195を超えたら終了チェックすることにした.
今までの最速での達成は228エピソード.

cartpole_player.py

とりあえず、9フレームくらいランダムで動かして、その後バランスを取ってみる.

多少バランス崩しても、うまく立て直してくれるみたい.



-Python
-, , , ,

執筆者:

関連記事

Pythonではじめての強化学習3〜Actor and Critic model

By: Banalities – CC BY 2.0 目次1 課題 出力が連続値の場合2 Actor and Critic3 Actorにノイズを付与する4 結果 MountainCarC …

Python3で株式売買のシミュレーション〜pandas

By: Michael Gwyther-Jones – CC BY 2.0 目次1 株式売買シミュレーション2 ファイルの構造3 pandas4 DataFrameの作成、構造5 csvか …

Pythonではじめての機械学習2〜scikit-learnとpandasで決定木

By: vaboo.com – CC BY 2.0 目次1 決定木(Decision Tree)2 サンプルデータの用意3 学習用データと検証用データにわける4 scikit-learn5 …

pandasとmatplotlibで株式取引の可視化

By: sprklg – CC BY 2.0 目次1 可視化2 下準備3 pandasのplot4 matplotlibでsubplot5 売買データをプロットする6 番外編 ローソク足チ …

Pythonではじめての機械学習~scikit-learn、tensorflow

By: krheesy – CC BY 2.0 目次1 機械学習2 scikit-learn3 tensorflow 機械学習 勉強しているところなので、間違っている箇所もあるかもしれませ …