TD学習とは(Temporal Difference learning)



機械学習

分類(classification)

ニューラルネットワーク(NN)

クラスタリング

強化学習

敵対的生成ネットワーク

公開日:2020/8/22         

In English
前提知識
強化学習とは
マルコフ決定過程
ベルマン方程式
pythonとは


■TD学習とは

TD学習(Temporal Difference learning)とは強化学習の手法の一つで、価値ベースの手法です。以下(1)式で表される様にTD誤差が0になる様な行動価値関数を用いてQ値を決定します。 こちらで強化学習について説明しましたが、ここでは強化学習の実装例の理解として、単純なスキナー箱を例にTD学習を用い説明します。

■TD学習の実例

以下のようなスキナー箱があります。電源ボタンと操作ボタンがあり、電源が入った状態で操作ボタンを押さなければ、ネズミはエサを取り出せません。 TD学習に置き換えると、エサを取りだせたら+1の報酬。それ以外の行動に対してはエサは与えられず、報酬は0になります。

 

ネズミの行動、報酬、電源の状態をマルコフ決定過程(Markov Decision Process,MDP)に従った状態遷移図で表現します。

 

<Q値:行動を決めるための指標>
ネズミが報酬を貰える様になるためには、どの様な行動を取ればよいでしょうか。電源ON時に操作ボタンを押すのが良く、電源OFF時には電源をONにする行動が良いという事が解ります。 この各状態の時に取るべき行動をQ値というもので表します。そして強化学習はこのQ値を学習することにあります。

Q値を以下の様に表し、各状態と行動の全てのパターンにおいてそれぞれ値を持ち、各状態で一番大きい値がとるべき行動になります。

 

TD学習におけるQ値はベルマン方程式より以下のとおり算出できます。矢印はイコール(=)と同じ意味です。

 

例えば今回の事例では、ネズミが報酬をもらって初めて今までの行動が正しかったかを評価できるので、 本来はQ値を更新できるのはテストが終了時点(この一回のテストをエピソードという)と思うかもしれませんが、 この手法は行動を起こす度にQ値を更新でき、現在の状態のQ値に対して行動を起こした先の状態のQ値を反映させます。 この式は、現在のQ値と将来のQ値をα(アルファ)で指数平均しているのと同義です。 γ(ガンマ)は将来のQ値に対する反映係数で、将来に対する不確定要素からくる割引率となります。

また(1)式は以下の様に変化して、以下部分をTD誤差とよびます。このTD誤差が0になるように、行動価値関数を学習する必要があります。

 
<Q値を計算する>
上記ネズミの例でQ値を具体的に計算します。どの状態においてもQ値の初期値は全て0です。最初は状態が0(電源OFF)とします。ここで状態0の時のQ値が最も大きい値の行動を選択するのですが、 どのQ値も等しいので行動はランダムに選択されます。今回は行動は0(電源ボタンON)が選ばれました。この時行動した結果に従ってQ値を更新するのですが、 この時点では報酬を得る事ができませんので、(1)の計算結果は0になります。

次に選択する行動もQ値が等しいのでランダムに選択されます。ここでは状態1(電源ON)で行動は1(操作ボタンON)が選ばれました。 すると報酬をもらえるので(1)の計算結果は0.7となりQ値を更新することができました。これで一つのエピソードは終了です。

 

次にもう一度初めからエピソードを開始します。初期値は前回エピソードの最終Q値となります。状態が0の時の最大Q値を持つ行動は0なので、これを選択します。 この時行動を起こした先の状態のQ値は値を持っていますので、報酬は得られませんがQ値を更新する事ができます。 次に状態1の時も同様、最大Q値を選択します。行動は1となり、同様にQ値は更新されていきます。

 

<ε-greedy法により最適なQ値を探す>
上記の様にQ値が最も大きい行動を選択すると、一度値が更新されると常にその行動を選択してしまう場合があります。本来はより良い選択があるかもしれないのにです。 それを防ぐためエピソード初期はあえてランダムに行動を選択し、エピソードを重ねるに従いQ値を信頼して行動を選択する方法の一つをε(イプシロン)-greedy法といいます。 pythonによる実装部分は以下のとおり。

epsilon = 1 /(episode + 1)

if epsilon <= np.random.uniform(0,1):
    action = np.argmax(Q[state])
else:
    action = np.random.choice(2)


■pythonによるシミュレーション

このスキナー箱のテストをpythonで実装し、動作を確認します。

 ・pythonバージョン:Ver3.8で確認
 ・必要ライブラリ:numpy (インストール方法はこちら)
 ・プログラムファイルrlearn.zip

エピソード数は10、1エピソードの試行数は4としました。結果、Q値は以下のとなりました。これは、電源OFF時は電源ボタンをON(S=0,A=0)、電源ON時は操作ボタンをON(S=1,A=1)するのが良いという結果になっており、 狙いの結果になっていることが解ります。

  [[5.69584585 0.1974375 ]
  [0.47434359 7.36479906]]

■TD学習以外のQ値学習方法

・Q値を遂次更新するTD学習に対して、エピソードが終わった時点でQ値を更新する方法の一つにモンテカルロ法(MC法)があります。 モンテカルロ法はエピソードが終わった結果でQ値を更新するのでQ値の精度が高いというメリットがありますが、更新が遅くなるのでオンライン学習が難しいというデメリットがあります。 モンテカルロ法の実装例はこちら

・DQNを使った場合の実装例はこちら









サブチャンネルあります。⇒ 何かのお役に立てればと

関連記事一覧



機械学習

分類(classification)

ニューラルネットワーク(NN)

クラスタリング

強化学習

敵対的生成ネットワーク