書籍「pythonで学ぶ強化学習」を読んだ。強化学習のアウトプットの機会がないので、とりあえず学んだ内容を備忘録も兼ねてまとめてみた。
主に強化学習は「モデルベース」と「モデルフリー」に分類でき、今回はモデルベースの手法のまとめ。
目次
1.モデルベース強化学習のメイン「変数・関数・環境」
2.モデルベースとモデルフリー
3.強化学習の学習法「policyベース」と「valueベース」
4.まとめ
1.モデルベース強化学習のメイン「変数・関数・環境」
モデルベースの強化学習で主に定義するのは、行動、状態、遷移関数、報酬関数、環境。
例:
環境:12マスのゲーム、緑にたどり着ければ報酬ゲット
行動(a):右、左、上、下
状態(s):行列のセルの位置
遷移関数(T(s, a)):行動と状態を引数にとり、次に移動するセル(遷移先:s')とそこへ遷移する確率を返す関数
報酬関数(R(s', s)):状態と遷移先(s')を引数に、赤のセルなら-1と、緑のセルなら+1を返す関数
変数、関数、環境の概略コード
# 状態 class State(): # 略 return self.row == other.row and self.column == other.column # 行動 class Action(Enum): UP = 1 DOWN = -1 LEFT = 2 RIGHT = -2 # 環境 class Environment(): def __init__(self, grid, move_prob=0.8): # 遷移関数 def transit_func(self, state, action): # 略 return transition_probs # 報酬関数 def reward_func(self, state): # 略 return reward, done return next_state, reward, done
***ちなみに***
強化学習は「遷移先の状態は直前の状態と、そこでの行動のみに依存する。報酬は直前の状態と遷移先に依存する」という決まり(「マルコフ決定過程(MDP)」)がある。
つまり、強化学習は「行動、状態、遷移関数、報酬関数、環境を与えることで報酬の総和(≒評価値)が決まる」という決まりになってる。
2.モデルベースとモデルフリー
強化学習はモデルベースとモデルフリーに分類できる。
モデルベース
モデルベース=「どんな行動をとれば報酬が得られるか(遷移関数と報酬関数)がはっきりわかってる環境」
のこと
下図の環境は
・緑のセル→プラスの報酬
・オレンジのセル→マイナスの報酬
と「どんな行動をとれば報酬がもらえるのか」はっきりしているからモデルベースの一例。
モデルフリー
モデルフリー=「どんな行動をとれば報酬に繋がるかわからない(遷移関数と報酬関数がわからない)環境」のこと。
スポーツなら全般(例えばサッカーとかバドミントンとか)が当てはまり、有名なアルファ碁は対戦相手によって報酬が決まらないからモデルフリー。
モデルフリーは遷移関数と報酬関数を定義せず、エージェント(環境におけるプレイヤー)を定義する。
モデルベース、モデルフリーにおける報酬の総和(価値)の計算
モデルベース、モデルフリーの環境はどちらも
・環境における制限時間(エピソード)終了時の報酬の総和(以下「価値」)
を計算するときは、
・(行動)確率をかけて期待値で表す
という2つテク(Bellman Equation)を使って計算する。
強化学習はこの「価値」を最大化することが目的なので、重要な部分。
def V(s, gamma=0.99): V = R(s) + gamma * max_V_on_next_state(s) return V def R(s): if s == "happy_end": return 1 elif s == "bad_end": return -1 else: return 0 def max_V_on_next_state(s): # 略 return max(values) def transit_func(s, a): # 略 return { next_state(s, a): MOVE_PROB, next_state(s, opposite): 1 - MOVE_PROB}
3.強化学習の学習法「policyベース」と「valueベース」
強化学習の学習目的で一番の焦点は
・Bellman Equationで表した「価値」をどうやって最大化するか
この目的に合わせて、主に「policyベース」と「valueベース」2つの学習方法がある。(2つ両方使う、二刀流的な学習方法もある)
=> どのように行動するか(戦略)を基準に学習する
イメージ
policyベース→参謀長みたいな策略家で現実的な思考で学習する感じ
・valueベース
=> 「特定の行動をとる=評価になる」ということだけ学習する。(評価=行動選択)
イメージ
valueベース→いいならいい、ダメならダメと勝手に決めて学んでくので、楽観的な思考で学習する感じ
# valueベースとpolicyベースで共通のPlannerを定義 class Planner(): def __init__(self, env): self.env = env self.log = [] def initialize(self): self.env.reset() self.log = [] def plan(self, gamma=0.9, threshold=0.0001): raise Exception("Planner have to implements plan method.") def transitions_at(self, state, action): transition_probs = self.env.transit_func(state, action) for next_state in transition_probs: prob = transition_probs[next_state] reward, _ = self.env.reward_func(next_state) yield prob, next_state, reward def dict_to_grid(self, state_reward_dict): grid = [] for i in range(self.env.row_length): row = [0] * self.env.column_length grid.append(row) for s in state_reward_dict: grid[s.row][s.column] = state_reward_dict[s] return grid # Plannerを継承した「valueベース」 class ValuteIterationPlanner(Planner): # 略 return V_grid # Plannerを継承した「policyベース」 class PolicyIterationPlanner(Planner): # 略 # 戦略の価値計算用関数 def plan(self, gamma=0.9, threshold=0.0001): # 略 return V_grid
ちなみさっきのセルのモデルベース環境でvalueベースで訓練した結果。上手く緑にたどり着けてる。
環境が単純だからpolicyベースでもほとんど変わらない結果だった。
4.まとめ
モデルベースの強化学習の学習・評価までの流れは②「エピソード終了時の報酬の総和(価値)」の定義
強化学習では学習目的がこの「価値」の最大化であり、この「価値」は、
・過去の計算値を使う
・(行動)確率をかけて期待値で表す
というテク「Bellman Equation」を使って計算される。
③「policyベース」か「valueベース」の手法で学習する
policyベース、valueベースまたは、その両方を使った手法を使って学習・評価する。
今の主流はvalueベースとpolicyベースでお互いの弱点を補いながら併用する手法がメインぽい。強化学習の実用されてるのは全てディープラーニングだけど、基礎的な手法自体はここで書いたやり方と同じ。
今回は「モデルベース」のメインの手法をまとめた。
「モデルフリー」の手法をまとめた次記事はこちら
trafalbad.hatenadiary.jp