TD誤差(Temporal Difference Error) - Shinichi0713/RL-study GitHub Wiki

概要

TD誤差(Temporal Difference Error)は、強化学習において用いられる概念の一つ
状態価値関数や行動価値関数の更新において重要な役割を果たすもの

TD誤差の定義

TD誤差は、現在の予測と次の状態に基づく予測の差を計算することで得られます。

価値関数の数式
** 状態価値関数を用いる **

\begin{aligned}
TD誤差 = R+γV(s')–V(s) \\
R:即時報酬 \\
s:現在の状態 \\
s':次の状態 \\
V(s):状態sでの価値関数の見積もり \\
γ: 割引率 \\
\end{aligned}

** 行動価値関数を用いる **

δ 
t
​
 =r 
t+1
​
 +γQ(s 
t+1
​
 ,a 
t+1
​
 )−Q(s 
t
​
 ,a 
t
​
 )

TD誤差は、強化学習のアルゴリズムにおいて、価値関数の更新に使用されている。
状態や行動の価値の見積もりを改善するために役立てられている。

import numpy as np

# エージェントの移動可能な状態を定義
num_states = 5

# 初期の状態価値関数をランダムに設定
V = np.random.rand(num_states)

# 割引率
gamma = 0.9

# エピソード内での遷移と報酬
transitions = [(0, 1), (1, 2), (2, 3), (3, 4)]
rewards = [1, 2, 3, 4]

# TD誤差の計算と状態価値関数の更新
for transition, reward in zip(transitions, rewards):
    state, next_state = transition
    td_error = reward + gamma * V[next_state] - V[state]
    V[state] += 0.1 * td_error  # 学習率を0.1とする

print("Updated state values:", V)

応用例

TD学習、Q学習、SARSAなどのアルゴリズムで利用
モンテカルロ法と同じように環境のモデルを知らなくても、エピソードを進めていくことで学習することが出来る。
エピソード終端での収益を待つのではなく、動的計画法のようにブートストラップを用いて(=次の状態の推定値を用いて)価値関数の更新を行います。
直近の価値関数の推定値を用いるTD法をTD(0)法

強化学習で「ゴール状態(終端状態)」に到達したとき、次の状態(s_next)をどう扱うか

強化学習で「ゴール状態(終端状態)」に到達したとき、
次の状態(s_next)をどう扱うかは、アルゴリズムや設計方針によって2通り考えられます。

1. ゴール到達時に「環境をリセット」する場合

  • ゴール(終端状態)に到達したら、**次の状態は「スタート状態」**にリセットされます。
  • これはエピソード型タスクでよく使われます。
  • TD(0)の更新時、
    V(s) ← V(s) + α [r + γ V(s_next) - V(s)]
    s_next は「スタート状態」になります(ただし報酬は0、または環境に従う)。

注意点:
この場合、エピソードの終端での価値推定がやや曖昧になることがあります。
多くの場合、終端状態の価値は0にするのが通例です。

2. ゴール到達時に「エージェントはゴールにとどまる」場合

  • ゴールに到達したら、以降もゴール状態にとどまる(遷移しない)。
  • 以降の報酬は0、または環境の仕様に従います(多くは0)。
  • TD(0)の更新時、
    s_next は「G(ゴール)」のままです。

注意点:
この場合も、終端状態の価値は0にしておくのが一般的です。
(なぜなら、それ以上報酬は得られないからです)

実装上のポイント

  • どちらの場合も、終端状態(ゴール)の価値は0にするのが一般的です。
  • エピソードの最後の遷移(A→G)のTD更新では、
    r=1, s_next='G', V('G')=0 となるので、
    V('A') ← V('A') + α [1 + γ * 0 - V('A')] となります。