【入門】Q学習の解説とpythonでの実装 〜シンプル迷路な問題を例に〜

Q学習は強化学習の代表的な手法の1つとなります。
Q学習を遷移先状態の最大Q値を使うので楽観的な手法と呼ばれる強化学習手法です。

これから丁寧に説明していきます。

強化学習とは

以下の図を使って説明してきます。

左のロボットが強化学習で学習するとします。
このロボットのように強化学習で学習する対象をエージェント強化学習エージェントと呼びます。

エージェントは環境に対して何かしらの行動を行います。
その行動によって変化した状態報酬を環境から受け取ります。

エージェントは受け取った状態と報酬を元に、累積報酬の最大化を目指して行動パターンを学習していきます。

強化学習では、エージェントに正解データではなく報酬を与えます。
報酬は正解や不正解といったものではなく、アクションの良さといったものになります。
なので、教師あり学習と教師なし学習の中間的な手法と呼ばれます。

詳しくは以下の記事にまとめました。
https://www.tcom242242.net/entry/2017/09/20/060902/

Q学習とは

Q学習は代表的な強化学習手法の1つです。

Q学習では、各状態\(s\)に対する各行動\(a\)のQ値を保存しておくQテーブル\(Q(s, a)\)というテーブルを保持しています。(図の左)

Q学習ではこのQテーブルの値を以下の式によって更新します。

この式からわかる通り(赤線部分)、Q学習では遷移先状態\(s’\)の最大Q値\(max_{a’} Q(s, a’)\)を使って学習するのが主な特徴となります。

つまり、遷移した先の状態の最も良いところだけを利用します。
そのため楽観的な手法と言われます。

ちなみに\( r+\gamma \max_{a’}Q(s’,a’) -Q(s,a)\)をTD誤差といい、
Q学習ではこの誤差を小さくするように学習していきます。

\(\alpha\)は学習率といい0〜1の間の値をとるパラメータです。
TD誤差をどれだけ反映させるかを決定します。

\( \gamma\)は割引率といい、遷移先の最大Q値をどれだけ利用するかを決めるパラメータです。

学習手順

では、具体的なQ学習の学習手順(アルゴリズム)を見ていきます。

まず箇条書きで示します。

  1. 現在の状態\(s\)で、\(Q(s, a)\)に従ってある行動\(a\)を選択し実行
  2. 環境から遷移先状態\(s’\)と報酬\(r\)を受け取る
  3. 得られた遷移先状態\(s’\)と報酬\(r\)を元に\(Q(s, a)\)を更新
  4. ステップ1〜3を繰り返す

各ステップを図を使いながら、説明していきます。

1.現在の状態\(s\)で、\(Q(s, a)\)に従ってある行動\(a\)を選択し実行

まず、強化学習エージェントは現在の状態\(s\)で、Qテーブルの\(Q(s, a)\)に従って行動選択をします。

図中の赤いところが\(Q(s, a)\)となります。
ここからε-greedy行動選択softmax行動選択等を用いて行動を選択をします。
基本的どの手法も\(Q(s, a)\)が高い行動を優先的に選択します。

ここでは、行動\(a\)を選択したとします。

行動を選択したら実際に行動を実行します。

2.環境から遷移先状態\(s’\)と報酬\(r\)を受け取る

次に行動\(a\)によって遷移した状態\(s’\)と報酬\(r\)を環境から受け取ります。

これを強化学習では観測と言ったりします。

3. 得られた遷移先状態\(s’\)と報酬\(r\)を元に\(Q(s, a)\)を更新

そして、先程紹介したQ値の更新式を使って、\(Q(s, a)\)を更新します。

先程もお話した通り、遷移先状態\(s’\)の最大Q値\(\max_{a’}Q(s’, a’)\)を使うことがQ学習の特徴となります。

4. ステップ1〜3を繰り返す

あと、\(Q(s, a)\)がある程度収束するまで、ステップ1〜3を繰り返します。

実装と実験

問題設定

以下のようなグリッドワールドの問題を扱います。 かなりシンプルなマップになります。

強化学習エージェントは最初に左下にいます。
右上にゴール、左上に危険地帯があるとします。
ここからエージェントは右上の家に向けての最短経路を学習することが目的となる問題です。

細かい設定

状態、行動、報酬は以下の通りです。

  • 状態:マス目(座標)
  • 行動:上下左右の4択
  • 報酬:右上に着けば100、左上は-100、通常の地点は0、壁や境界線であれば-1の報酬

左上か右上に到着したら、ゲーム終了とみなし、
エージェントを左下に戻します。
(これをエピソードという単位で表現します)

ソースコード

Pythonを用いて実装します。
ちなみにPythonの3系を用います。
前回と同様にQ学習エージェントクラス、環境(グリッドワールド)クラスに分けて実装します。

Q学習エージェント

まずQ学習です。
コードは以下のようになります。

33〜41行目のactメソッドでエージェントは行動選択をします。
ここではε-greedy手法によって行動選択をします。

43〜56行目のobserveメソッドで遷移先の状態と報酬を観測します。
ここでは報酬が観測したときにのみ学習するようにしています。

58〜65行目のlearnメソッドでQ値の更新をしています。

グリッドワールド

グリッドワールドクラスでは、
エージェントからの行動を受け取り、遷移先状態や報酬を返します。

ソースコードの全体像

Q学習エージェントとグリッドワールドを組み合わせて、エージェントに学習させます。
以下のコードを実行するとエピソード毎に得られる報酬をプロットします。

実験結果

エピソード毎の累積報酬をプロットしました。
(1エピソードはスタート地点からゴールに着くまで)

f:id:ttt242242:20190904104147j:plain

横軸はエピソード、縦軸が累積報酬となります。

学習が進むことに高い報酬を得れていることがわかります。

参考文献(初心者におすすめの教科書)

コメント

  1. […] Deep Q Network(DQN)はQ学習のQテーブルをニューラルネットワークで関数近似した強化学習アルゴリズムです。 […]

タイトルとURLをコピーしました