覚え書きブログ

Pythonによる機械学習6(強化学習の基礎 2/3)

<< Pythonによる機械学習6(強化学習の基礎 1/3)

Pythonによる機械学習6(強化学習の基礎 2/3)の目次】

参考書

本ブログの内容の詳細は、「機械学習スタートアップシリーズ ゼロからつくるPython機械学習プログラミング入門」に掲載されています。
機械学習に必要な数学の復習から、機械学習アルゴリズムの導出およびPythonの基本ライブラリのみを用いた実装方法まで学びたい方は、本書籍をご活用ください。
bookclub.kodansha.co.jp

エピソード

猫の問題箱実験での猫のように、強化学習では試行錯誤を繰り返しながら、より高い報酬和の期待値を獲得する方策を探索します。強化学習では、この試行のことをエピソードと呼び、1エピソードは、複数の時間ステップt=0,1,..., Nにおける状態x^t、行動y^t、報酬r^tおよび次の状態報酬x^{t+1}の系列で構成されます。
f:id:hirotaka_hachiya:20181127113701p:plain

OpenAI Gym

実際にエピソードデータがどんなものかを観察するために、OpenAI Gymを用います。OpenAI Gymは、Linux上で動作するベンチマークツールで、強化学習アルゴリズムの開発および比較に広く用いられています。最近は、windows環境でも、windows subsystem for linux (WSL)を用いると、OpenAI Gymを動かすことができます。windowsへのインストール方法は、以下を参考にしてください。
hirotaka-hachiya.hatenablog.com

OpenAI Gymには、様々なタスクが用意されています。
f:id:hirotaka_hachiya:20181127010420p:plain

Mountain Carタスク

強化学習の代表的な古典制御タスクの一つであるMountain Carタスクを動かしてみましょう。
f:id:hirotaka_hachiya:20181127105758p:plain

まず、シェル上でpythonインタラクティブモードを起動し、gymをインポートします。

>>> import gym

続けて、MountainCarの環境「MountainCar-v0」を読み込みagentオブジェクトを作り、resetメソッドで車を初期状態に設定します。
状態ベクトルxは、横軸上の座標と速度の2次元のベクトルとなっています。

# MountainCarの環境を読み込む
>>> agent = gym.make('MountainCar-v0')

# 初期状態を設定
>>> x = agent.reset()

# 状態の確認
>>> x
array([-0.53294081,  0.        ])

次に、初期状態のMoutainCarの画像を描画します。

# 初期状態を描画する
>>> agent.render()

以下のように、左右に山があり、谷底に車が初期状態として置かれた画像が表示されることを確認します。
f:id:hirotaka_hachiya:20181127143557p:plain

次に、stepメソッドを用いて行動を実行し、車を動かします。ここで、行動は以下の3種類があります。
「0:左向きにアクセルを踏み込む、1:アクセルを踏まない、2:右向きにアクセルを踏む」
さて、行動2を10回実行して、車を右に動かしてみます。

>>> import numpy as np
>>> for i in np.arange(10): x, r, done, _ = agent.step(2)
...
>>> x
array([-0.47624722,  0.00924077])
>>> agent.env.render()

ここで、stepの出力は例えば以下のようになっています。

(array([-0.53187075, 0.00107006]), -1.0, False, {})

内訳としては、状態ベクトルx=(-0.53187075, 0.00107006)、報酬r=-1.0、ゴールに到達したか否か(True/False)およびデバッグ情報となっています。

以下のように車が右側に移動しているのがわかります。
f:id:hirotaka_hachiya:20181127143442p:plain

演習2

MountainCarタスクにて、ランダムに行動を200回とり、得られた報酬の割引報酬和を計算し表示するPythonスクリプトを作成してみましょう。
割引率は\gamma=0.99にし、ファイル名はrandomAction.pyにしてください。

作成したスクリプトおよび出力結果を、次週までにMoodleにて提出してください。

Pythonによる機械学習6(強化学習の基礎 3/3)>>