覚え書きブログ

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

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

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

参考書

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

強化学習のテンプレート

次は強化学習アルゴリズムの実装の準備に入りたいと思います。

いちから全て実装するのは難しいので、intelligentSystemTrainingにある、OpenAI Gymの環境を構築し、行動の選択・実行および割引報酬和を用いて評価するPythonスクリプトのテンプレートRL_template.pyを用います。

RLクラスには、以下のメソッドが定義されています。
1)__init__: コンストラクタ、強化学習の環境および変数の初期化
2)reset: 状態および変数の初期化
3)selectAction: 行動の選択※未実装
4)doAction: 交差エントロピー損失の計算※未実装

class RL:
	modelPath = 'models'
	visualPath = 'visualization'
	
	#------------------------------------
	# 1) 強化学習の環境および変数の初期化
	# env: 強化学習タスク環境名
	# gamma: 割引率
	# nSplit: 状態の分割数
	# isVisualizae: 可視化するか否かのフラグ
	def __init__(self, env, gamma = 0.99, nSplit=50, isVisualize=False):
	
		# 環境の読み込み
		self.env = gym.make(env)
		
		# 割引率
		self.gamma = gamma

		# 描画Flag
		self.isVisualize = isVisualize

		# 割引報酬和を格納
		self.sumRewards = []

		# 行動数
		self.nAction = self.env.action_space.n
		
		# 各状態の最小値と最大値
		self.stateMin = self.env.observation_space.low
		self.stateMax = self.env.observation_space.high

		# 状態の分割数
		self.nSplit = nSplit
	#------------------------------------
		
	#------------------------------------
	# 2) 状態および変数の初期化
	def reset(self):
		
		# 環境の初期化
		state = self.env.reset()
		
		# 割引報酬和の初期化
		self.sumReward = 0

		# ステップの初期化
		self.step = 0
		
		return state
	#------------------------------------

	#------------------------------------
	# 3) 行動の選択
	# state: 状態ベクトル
	def selectAction(self, state):
	
		action = 1 #【行動の選択】

		return action
	#------------------------------------

	#------------------------------------
	# 4) 行動の実行
	# action: 行動インデックス
	def doAction(self, action):

		# 行動の実行、次の状態・報酬・ゲーム終了FLG・詳細情報を取得
		next_state, reward, done, _ = self.env.step(action)

		# 割引報酬和の更新
		self.sumReward += 0 #【割引報酬和の計算】

		# ステップのインクリメント
		self.step += 1

		if self.isVisualize:
			self.env.render()
		
		if done:
			# doneがTrueになったら1エピソード終了
			self.sumRewards.append(self.sumReward)
		
		return next_state, reward, done
	#------------------------------------

メインでは、以下のようにフローなっています。
1)RLクラスをインスタンス(agent)化し、強化学習の環境の作成
2)エピソードのループ(1000回)
3)agent.resetにより、環境を初期化
4)ステップのループ(200回)
5)agent.selectActionにより、行動を選択
6)agent.doActionにより、行動を実行
7)agent.env.closeにより、環境を修了

if __name__ == '__main__':

	# 1) 強化学習の環境の作成
	agent = RL(env='MountainCar-v0', gamma=0.99, isVisualize=True)

	# 2) エピソード(試行)のループ
	for episode in np.arange(1001):
			
		if not episode % 500:
			agent.isVisualize = True
		else:
			agent.isVisualize = False

		# 3) 環境の初期化
		x = agent.reset()
			
		# 4) ステップのループ
		while(1):
				
			# 5) 行動を選択
			y = agent.selectAction(x)

			# 6) 行動を実行
			x_next, r, done = agent.doAction(y)
			
			x = x_next

			if done:
				break

		print('Episode:{}, sum of rewards:{}'.format(episode,agent.sumReward))
		
	# 7) 強化学習環境の終了
	agent.env.close()

強化学習のテンプレートの実行

当該テンプレートに、「action = 1 #【行動の選択】」と「self.sumReward += 0 #【割引報酬和の計算】」の部分を、演習2で作成したコードに置き換えて、実行してみましょう。

> python RL_template.py
Episode:0, sum of rewards:-86.6020325142037
Episode:1, sum of rewards:-86.6020325142037
Episode:2, sum of rewards:-86.6020325142037
Episode:3, sum of rewards:-86.6020325142037
Episode:4, sum of rewards:-86.6020325142037
Episode:5, sum of rewards:-86.6020325142037
...

演習3

MountainCarタスクでは、ゴールが右の山の上にありますが車の馬力が足りず、途中までしか登ることはできません。そのため、途中まで登った際の位置エネルギーを利用して、馬力を稼ぐ必要があります。
selectActionメソッドに、車の位置と速度に基づいて最適な行動(ゴールにたどり着くための)を実行するコードを書いてみましょう。

f:id:hirotaka_hachiya:20181128133729p:plain
作成したスクリプトおよび出力したグラフ画像を、Moodleにて提出してください。

演習3を通して、MountainCarのような単純なタスクでも、人手で制御ルールを決めて実装するのは面倒であることがわかったかと思います。次回、この制御ルールを強化学習を用いて自動的に獲得していきます。
単純な強化学習の方式では、Q関数を以下のようなテーブルで表現します。Q関数を表すテーブルのことを「Qテーブル」と呼びます。
f:id:hirotaka_hachiya:20181128140729p:plain

宿題

Qテーブルを作るための準備として、状態の位置および速度の取りうる範囲をそれぞれ等間隔に分割し、入力された状態stateが属する区間のインデックスを返すメソッド「state = discretizeState(self,state)」を、RLクラスに追加しましょう。

  • 状態の取りうる範囲の最小値:self.stateMin
  • 状態の取りうる範囲の最大値:self.stateMax
  • 分割数:self.nSplit

作成したスクリプトおよび出力したグラフ画像を、Moodleにて提出してください。

Pythonによる機械学習6(補足)>>