<< Pythonによる機械学習6(強化学習の基礎 2/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メソッドに、車の位置と速度に基づいて最適な行動(ゴールにたどり着くための)を実行するコードを書いてみましょう。
演習3を通して、MountainCarのような単純なタスクでも、人手で制御ルールを決めて実装するのは面倒であることがわかったかと思います。次回、この制御ルールを強化学習を用いて自動的に獲得していきます。
単純な強化学習の方式では、Q関数を以下のようなテーブルで表現します。Q関数を表すテーブルのことを「Qテーブル」と呼びます。
宿題
Qテーブルを作るための準備として、状態の位置および速度の取りうる範囲をそれぞれ等間隔に分割し、入力された状態stateが属する区間のインデックスを返すメソッド「state = discretizeState(self,state)」を、RLクラスに追加しましょう。
- 状態の取りうる範囲の最小値:self.stateMin
- 状態の取りうる範囲の最大値:self.stateMax
- 分割数:self.nSplit