📖

時間差分学習とTD誤差:強化学習コース(5/N)

に公開

はじめに

前回の記事では、モンテカルロ法によるモデルフリー学習を学びました。モンテカルロ法は実際の経験から学習できる優れた手法ですが、エピソードが終了するまで学習できないという大きな制約がありました。

本記事では、この制約を克服する時間差分学習(Temporal-Difference Learning、TD学習) について解説します。TD学習の中核となる概念がTD誤差です。この記事では、TD誤差が何を表し、どのように学習を可能にするのかを深く理解していきましょう。

これまでのシリーズで学んだ内容は以下の通りです。

  • 第1回 - 強化学習の全体像と問題設定
  • 第2回 - 環境側の定式化(マルコフ決定過程)
  • 第3回 - エージェント側の概念とプランニングアルゴリズム(価値反復法)
  • 第4回 - モデルフリー学習とモンテカルロ法
  • 第5回(本記事)- 時間差分学習とTD誤差

なぜTD学習が必要なのか

モンテカルロ法の限界を振り返る

モンテカルロ法では、状態sの価値を推定するために、その状態から始まるエピソード全体の累積報酬G_tを使用していました。前回の記事では、エピソード終了後に得られた累積報酬G_t = r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + ... + \gamma^{T-t-1} r_{T-1}平均を取ることで価値関数を推定しました。

これをインクリメンタルに更新する場合、以下のような形になります。

V_{n+1}(s) = V_n(s) + \frac{1}{n+1}[G_n - V_n(s)]

この式は「現在の推定値」と「新しいサンプル」の差に重み\frac{1}{n+1}をかけて更新しています。ここで\frac{1}{n+1}は、n+1個のサンプルの平均を計算するための重みです。

学習率(ステップサイズ)の導入

上記の式では、サンプル数が増えるにつれて重み\frac{1}{n+1}が小さくなり、更新の影響が減少します。これは収束性の観点から優れた性質で、十分なサンプルを集めると真の平均値に収束することが保証されます。

しかし、以下のような状況では別のアプローチが必要になることがあります。

  • 非定常環境 - 環境が時間とともに変化する場合、古いデータの影響を減らしたい
  • 早期の学習 - 初期段階により大きなステップを用いて学習したい
  • 計算の簡潔性 - 訪問回数nを記録する必要がない

そこで、固定の学習率\alpha(0と1の間の値)を使うことがあります。

V(s_t) \leftarrow V(s_t) + \alpha [G_t - V(s_t)]

この形式では、\alpha = 0なら更新せず、\alpha = 1なら完全に新しい値で置き換え、0 < \alpha < 1なら古い推定値と新しいサンプルを混ぜ合わせます。

モンテカルロ法でもこの形式を使うことができますが、依然としてG_tを計算するためにエピソード終了を待つ必要があります。

このアプローチの問題点は以下の通りです。

  • 待機時間 - エピソード終了まで更新不可能
  • メモリ使用 - エピソード全体を保存する必要
  • 継続的タスク - 明確な終了がない問題に適用不可

解決策:時間差分学習

これらの問題を解決するのが時間差分学習(TD学習) です。TD学習の核心は、「エピソード全体の結果を待たずに、1ステップ先の情報だけで学習する」ことです。

基本的なアイデアは次の通りです。現在の状態の価値は、即時報酬と次の状態の推定価値(割引後)に等しいというものです。これにより、各ステップで即座に学習が可能になります。

TD学習の直感的理解

通勤時間予測で理解するTD学習

毎日の通勤時間予測を例に、モンテカルロ法とTD学習の違いを見てみましょう。

シナリオ - 家から会社まで、通常60分かかると予測している。

モンテカルロ法の場合

家を出発(予測:60分)
↓ [実際の通勤]
会社到着(実際:70分)
→ 予測を更新:次回は65分と予測

会社に着くまで予測を更新できません。

TD学習の場合

家を出発(全体予測:60分)
↓ 10分
最初の駅(ここまで10分、残り予測:50分)
→ でも駅の掲示板を見ると「会社まで55分」と表示
→ 予測誤差:5分の過小評価が判明
→ この時点で全体予測を修正:65分

各地点で予測を更新できます。

TD誤差とは何か

上記の例で、「残り50分と思っていたが、実際は55分だった」という5分の差がTD誤差です。

より正確に言うと、TD誤差は(実際に経験した即時的な結果)+(次の地点での予測)-(現在の予測)です。この誤差を使って、現在の予測を改善します。

ブートストラップ:予測で予測を改善

TD学習の特徴的な概念がブートストラップ(Bootstrap) です。

強化学習におけるブートストラップとは何か

通常、何かを推定する際は「真の値」を使います。しかしブートストラップでは、別の「推定値」を使って推定します。通勤時間の例で説明すると次のようになります。

ブートストラップを使わない場合(モンテカルロ法)

  • 家での予測:60分
  • 会社到着時の実際の時間:70分(これが真の値)
  • 更新:予測を真の値(70分)に近づける

ブートストラップを使う場合(TD学習)

  • 家での予測:60分
  • 駅での状況:
    • ここまで10分かかった(実際の値)
    • 駅から会社まで55分の予測(これは推定値)
    • 合計:10分 + 55分 = 65分
  • 更新:予測を65分(推定値を含む)に近づける

なぜ「ブートストラップ」と呼ぶのか

「ブートストラップ」は「自分の靴紐を引っ張って自分を持ち上げる」という慣用句から来ています。自分自身の推定値を使って、自分自身を改善するという自己参照的な性質を表しています。

ブートストラップの利点と課題

利点として、即座の学習(完全な結果を待たずに学習開始)、メモリ効率(過去の全情報を保存する必要がない)があります。また継続的タスク対応(終了のない問題でも学習可能)であることも重要な利点です。

課題として、バイアス(推定値に誤差があると、それが伝播する)、初期値依存(最初の推定が悪いと収束が遅い)があります。また理論的複雑性(収束の保証がより複雑)という問題もあります。

TD誤差の数学的定義

基本的な定義

時刻tでのTD誤差\delta_tは以下のように定義されます。

TD誤差の解釈

TD誤差の各項の意味を詳しく見てみましょう。

  1. V(s_t) - 現在の予測
    状態s_tから得られる累積報酬の現在の推定値

  2. r_t + \gamma V(s_{t+1}) - 新しい情報に基づく予測

    • 実際に得られた即時報酬r_t
    • 次状態の価値の割引値\gamma V(s_{t+1})
    • これらの和が「1ステップ進んだ後の新しい見積もり」
  3. \delta_t - 予測誤差

    • 正の値:現在の予測が過小評価
    • 負の値:現在の予測が過大評価
    • ゼロ:予測が正確

ベルマン方程式との関係

TD誤差とベルマン方程式の関係を理解するために、まずベルマン方程式を思い出しましょう。

ベルマン方程式の復習

第3回の記事で学んだベルマン方程式は、「ある状態の価値」と「次の状態の価値」の関係を表します。

V^\pi(s) = \mathbb{E}_\pi[r_t + \gamma V^\pi(s_{t+1}) | s_t = s]

これは「状態sの真の価値は、即時報酬と次状態の価値(割引後)の期待値に等しい」という意味です。

現在の推定値での書き換え

今、私たちが持っている価値関数の推定値をV(s)とします(真の値V^\pi(s)ではなく)。もしV(s)が完璧な推定なら、ベルマン方程式が成り立つはずです。

V(s_t) = \mathbb{E}_\pi[r_t + \gamma V(s_{t+1}) | s_t = s_t]

実際の経験との比較

実際に行動して得られた結果は次の通りです。

  • 即時報酬:r_t(実際の値)
  • 次状態:s_{t+1}(実際に遷移した状態)
  • 次状態の推定価値:V(s_{t+1})

これらから、「もし今の推定が正しければ、V(s_t)はこの値になるべき」という値が計算できます。

\text{あるべき値} = r_t + \gamma V(s_{t+1})

TD誤差の意味づけ

TD誤差は、この「あるべき値」と「現在の推定値」の差です。

\delta_t = [r_t + \gamma V(s_{t+1})] - V(s_t)

つまり、TD誤差は次のことを表します。

  • ベルマン方程式の残差 - 現在の推定値がベルマン方程式をどれだけ満たしていないか。
  • 推定の改善方向 - どちらの方向に修正すべきかを示す。

期待値とTD誤差

もしV = V^\pi(真の価値関数)なら、期待値でベルマン方程式が成立します。このとき、TD誤差の期待値はゼロになります。

\mathbb{E}_\pi[\delta_t | s_t = s] = 0

つまり、真の価値関数では、TD誤差の期待値はゼロになります。これが、TD誤差を使って価値関数を改善できる理論的根拠です。

TD(0)アルゴリズム

基本的な更新式

TD誤差を使った最も基本的な学習アルゴリズムがTD(0) です。

TD(0)の「0」は何を意味するのか

TD(0)の括弧内の「0」は、何ステップ先まで実際の報酬を使うかを表します。

  • TD(0) - 0ステップ先まで実際の報酬を使用
    つまり、1ステップ目(r_t)のみ実際の報酬、それ以降は推定値V(s_{t+1})を使用

  • TD(1) - 1ステップ先まで実際の報酬を使用
    r_t + \gamma r_{t+1} + \gamma^2 V(s_{t+2})

  • TD(n) - nステップ先まで実際の報酬を使用
    r_t + \gamma r_{t+1} + ... + \gamma^n r_{t+n} + \gamma^{n+1} V(s_{t+n+1})

つまり、TD(0)は最も即座の更新で、最も推定に依存し、最もシンプルな手法です。

アルゴリズムの流れ

  1. 状態s_tで行動a_tを選択。
  2. 報酬r_tと次状態s_{t+1}を観測。
  3. TD誤差\delta_tを計算。
  4. 価値関数を更新。
  5. 次のステップへ進む(エピソード終了を待たない)。

実装のポイント

  1. オンライン更新 - 各ステップで即座に価値関数を更新。
  2. 終端状態の扱い - 終端状態では次状態の価値を0として計算。
  3. メモリ効率 - エピソード全体を保存する必要がない。

モンテカルロ法との比較

更新タイミングの違い

TD学習とモンテカルロ法の最も重要な違いは更新のタイミングです。

項目 モンテカルロ法 TD学習
更新タイミング エピソード終了後 各ステップ
必要な情報 完全な累積報酬G_t 1ステップの情報(r_t, s_{t+1})
学習の即時性 遅延学習 オンライン学習
メモリ使用 エピソード全体を保存 現在の状態のみ
継続的タスク 適用不可 適用可能

推定のターゲットの違い

両手法の更新式を比較してみましょう。

モンテカルロ法

V(s_t) \leftarrow V(s_t) + \alpha [G_t - V(s_t)]

TD(0)

V(s_t) \leftarrow V(s_t) + \alpha [r_t + \gamma V(s_{t+1}) - V(s_t)]

  • MC法:実際の累積報酬G_tをターゲットとする
  • TD法:ブートストラップ推定値r_t + \gamma V(s_{t+1})をターゲットとする

バイアスと分散のトレードオフ

TD学習とモンテカルロ法は、バイアスと分散のトレードオフの関係にあります。

モンテカルロ法

  • バイアスなし - 実際の累積報酬を使用
  • 高分散 - エピソードの確率的変動の影響を受けやすい
  • 多くのサンプルが必要だが、真の値に収束

TD学習

  • バイアスあり - ブートストラップによる推定値を使用
  • 低分散 - 1ステップの変動のみの影響
  • 少ないサンプルで安定するが、初期値の影響を受ける

TD学習の制御問題への拡張

制御問題とは何か

これまでのTD(0)では、与えられた方策\piの価値関数V^\pi(s)を推定する方策評価を扱ってきました。しかし、強化学習の最終目標は最適方策を見つけることです。

方策評価 vs 制御問題

  • 方策評価(Policy Evaluation)

    • 「この方策はどれくらい良いか。」を評価
    • 固定された方策\piの価値V^\pi(s)を求める
    • これまで学んだTD(0)の範囲
  • 制御問題(Control Problem)

    • 「どうやったら最良の方策を見つけられるか。」を解決
    • 最適方策\pi^*そのものを探索・学習
    • 方策の評価と改善を繰り返す

なぜ行動価値関数Q(s,a)が必要か

制御問題では、行動を選択する必要があります。状態価値関数V(s)だけでは、どの行動を選ぶべきかが分からないため、**行動価値関数Q(s,a)**を学習します。

  • V(s) - 状態sの価値(行動は固定方策で決まる)。
  • Q(s,a) - 状態sで行動aを取った時の価値(行動選択に使える)。

最適行動はa^* = \arg\max_a Q(s,a)です。

SARSA:方策オン型TD制御

TD誤差の概念を行動価値関数Q(s,a)に拡張すると、SARSAアルゴリズムが得られます。

SARSAという名前は更新に使う要素の頭文字から来ています。(S, A, R, S, A)は「状態、行動、報酬、次状態、次行動」を表します。

Q学習:方策オフ型TD制御

Q学習は、次状態での最大Q値を使用する方策オフ型アルゴリズムです。

SARSAとQ学習の違い

両者の本質的な違いは、次状態の価値をどう見積もるかにあります。

  • SARSA - 実際に選択される行動a_{t+1}の価値を使用(方策オン型)。
  • Q学習 - 最適な行動の価値を使用(方策オフ型)。

方策オン型・オフ型の判定基準

アルゴリズムが方策オン型か方策オフ型かは、以下の基準で判定できます。

  • 方策オン型 - 更新に使う行動を現在の方策でサンプリング(実際に選択)。例:SARSAではa_{t+1}を現在の方策\piでサンプリング。

  • 方策オフ型 - 更新に使う行動を方策以外のルール(最大化など)で決定。例:Q学習では\max_a Q(s_{t+1}, a)という最大化で決定。

この違いは、実際の学習結果に大きな影響を与えます。有名な崖歩き問題(Cliff Walking) を例に説明しましょう。

崖歩き問題のシナリオ

崖の縁を歩くロボットを想像してください。スタート地点からゴールまで、2つのルートがあります。崖の縁を通る最短ルートは各ステップで-1の報酬ですが、もしランダムな行動で崖に落ちると-100の大きなペナルティを受けます。一方、崖から離れた安全なルートは遠回りなので、各ステップで-2の報酬となります。

学習中、ε-グリーディ方策(ε=0.1)により、10%の確率でランダムな行動を取るとします。

SARSAが学ぶもの

SARSAは実際に取る行動を考慮します。崖の縁では、10%の確率でランダム行動により落下する可能性があることを学習に組み込みます。その結果、「崖の縁は期待値的にリスクが高い」と判断し、遠回りでも安全なルートを選ぶようになります。これは、実際の実行時の方策(探索を含む)での期待値を最大化しているためです。

Q学習が学ぶもの

一方、Q学習は「もし最適に行動したら」という仮定で学習します。最適な行動を取れば崖に落ちることはないので、崖の縁の最短ルートを最も価値が高いと学習します。しかし実際の実行時には探索でランダム行動を取るため、学習した最適ルートと実際の性能に乖離を生じる可能性があります。

この違いから、SARSAは「実行時の現実的な性能」を重視し、Q学習は「理想的な最適性能」を追求すると言えます。どちらが良いかは、問題設定や安全性の要求によって変わります。

実践とrl_srcライブラリでの実装

rl_srcでの実装アーキテクチャ

本シリーズで継続して開発しているrl_srcライブラリでは、TD学習も前回のモンテカルロ法と統一されたアーキテクチャで実装されています。

🔗 rl-src: 強化学習ライブラリ

TD学習戦略の実装

TD学習の核心となるTD(0)戦略の実装を詳しく見ていきましょう。rl_src/src/agents/strategies/td_learning.pyにあるTDZeroStrategyクラスが、本記事で解説したTD(0)アルゴリズムを実装しています。

基本的な構造

class TDZeroStrategy(ModelFreeStrategy):
    def __init__(self, epsilon=0.1, learning_rate=0.1, gamma=0.9, initial_value=0.0):
        # ε-貪欲方策のパラメータ
        self.epsilon = epsilon
        # 学習率α
        self.learning_rate = learning_rate
        # 割引率γ
        self.gamma = gamma
        # 状態価値関数V(s)を辞書で管理
        self.V = {}

TD誤差の計算と価値更新

実装の中心となるのはupdate_policyメソッドです。このメソッドでは、本記事で解説したTD誤差の計算と価値関数の更新を実装しています。

def update_policy(self, experience: Experience) -> None:
    state = experience.observation
    next_state = experience.next_observation
    
    # TD誤差の計算
    if experience.done:
        # 終端状態:V(s') = 0
        td_error = experience.reward - self.V[state]
    else:
        # 通常の遷移
        td_error = experience.reward + self.gamma * self.V[next_state] - self.V[state]
    
    # 価値関数の更新
    self.V[state] += self.learning_rate * td_error

この実装は、本記事で示した更新式をそのまま反映しています。

V(s_t) \leftarrow V(s_t) + \alpha [r_t + \gamma V(s_{t+1}) - V(s_t)]

終端状態の特別な扱いにも注目してください。エピソードが終了した場合、次状態の価値は0として扱います。

ε-貪欲方策による行動選択

get_policyメソッドでは、学習した価値関数を基にε-貪欲方策で行動を選択します。各行動のQ値を推定し、最適行動を高確率で選択しつつ、εの確率で探索します。

def get_policy(self, observation, available_actions):
    # 各行動のQ値を推定
    q_values = {action: self._estimate_q_value(state, action) 
                for action in available_actions}
    
    # 最適行動を決定
    best_action = max(q_values.keys(), key=lambda a: q_values[a])
    
    # ε-貪欲方策の確率分布を生成
    explore_prob = self.epsilon / len(available_actions)
    action_probs = {}
    for action in available_actions:
        if action == best_action:
            # 最適行動:(1-ε) + ε/|A|
            action_probs[action] = (1.0 - self.epsilon) + explore_prob
        else:
            # その他の行動:ε/|A|
            action_probs[action] = explore_prob

Q値の推定

状態価値関数V(s)から行動価値関数Q(s,a)を推定する仕組みも実装されています。これは経験から学習した報酬モデルと遷移モデルを使用して、以下の式で計算されます。

Q(s,a) \approx \mathbb{E}[r|s,a] + \gamma \sum_{s'} P(s'|s,a) V(s')

実装では、過去の経験から報酬の期待値と遷移確率を推定し、Q値を近似的に計算しています。

デモンストレーション

実際の動作はrl_src/examples/td_learning_demo.pyで確認できます。このデモでは、3×3のグリッドワールドでTD(0)学習の動作を観察できます。

デモの実行方法

# rl_srcディレクトリで実行
python examples/td_learning_demo.py

学習過程の観察

デモでは以下の要素を観察できます。

  1. TD誤差の収束過程

    • 各エピソードでTD誤差を記録し、学習の進行とともに誤差が減少する様子を可視化
    • TD誤差が小さくなることは、価値関数がベルマン方程式を満たすようになることを意味する。
  2. 価値関数の進化

    • エピソード0、10、25、50、75、99での価値関数をヒートマップで表示
    • ゴール付近から高い価値が伝播していく様子が観察できる。
  3. エピソード報酬の改善

    • 学習が進むにつれて、より少ないステップでゴールへ到達できるようになる。
    • 移動平均を表示することで、学習の安定性も確認できる。

実行結果の例

=== TD(0) Learning Demo ===

Grid World (3x3)
Start: (0, 0), Goal: (2, 2)

Training TD(0) agent...
Episode 25/100: Avg Reward = -8.44, Avg |TD Error| = 0.2341
Episode 50/100: Avg Reward = -5.12, Avg |TD Error| = 0.1523
Episode 75/100: Avg Reward = -4.28, Avg |TD Error| = 0.0912
Episode 100/100: Avg Reward = -4.00, Avg |TD Error| = 0.0523

Training completed in 0.35 seconds

Final Value Function:
  State (0, 0): V = -5.832
  State (0, 1): V = -4.925
  State (0, 2): V = -3.937
  State (1, 0): V = -4.925
  State (1, 1): V = -3.937
  State (1, 2): V = -2.710
  State (2, 0): V = -3.937
  State (2, 1): V = -2.710
  State (2, 2): V = 0.000

学習後の方策実行

デモの最後では、学習した価値関数を使って最適経路を実行します。

=== Learned Policy Demonstration ===
Starting from: (0, 0)
Step 1: State (0, 0) -> Action right -> State (0, 1), Reward: -1
Step 2: State (0, 1) -> Action right -> State (0, 2), Reward: -1
Step 3: State (0, 2) -> Action down -> State (1, 2), Reward: -1
Step 4: State (1, 2) -> Action down -> State (2, 2), Reward: 0

Goal reached! Total reward: -3, Steps: 4

最短経路(4ステップ)でゴールに到達していることが確認できます。

可視化ファイル

デモを実行すると、以下の2つの画像ファイルが生成されます。

  1. td_learning_progress.png

    • 上段:エピソード報酬の推移と移動平均
    • 下段:TD誤差の収束過程
  2. td_value_function_evolution.png

    • 異なるエピソードでの価値関数のヒートマップ
    • 学習の進行とともに適切な価値が形成される様子

モンテカルロ法との比較

TD学習の特徴として、モンテカルロ法と比べて以下の点が観察できます。

  • 即座の学習 - 各ステップで価値が更新されるため、1エピソード目から改善が始まる。
  • 安定した収束 - TD誤差が徐々に減少し、滑らかに収束する。
  • メモリ効率 - エピソード全体を保存する必要がなく、現在の状態情報のみで学習可能である。

これらの実装例を通じて、本記事で解説したTD学習の理論が実際のコードでどのように実現されているかを確認できます。

次回予告:より高度なTD学習手法への発展

TD学習の重要性

本記事で学んだTD学習は、強化学習において非常に重要な基盤となります。特にTD誤差という概念は、現代の深層強化学習においても中心的な役割を果たしています。

TD学習で学んだ以下の概念は、これからの学習で頻繁に登場します。

  • ブートストラップ - 推定値を使った推定の改善
  • オンライン学習 - 各ステップでの即座な更新
  • バイアス・分散トレードオフ - 推定の精度と安定性のバランス

次回の記事:多段階TD学習とEligibility Trace

次回の記事では、TD(0)の理解を基に、より高度なTD学習手法について学びます。

次回記事の内容予定

  • n-step TD学習 - 複数ステップの実際の報酬を使用して、TD(0)とモンテカルロ法の中間的性質を実現
  • TD(λ) - 指数的減衰による過去の状態への信用割り当て
  • Eligibility Trace - 効率的な実装とメモリ管理の仕組み

これらの手法は、TD(0)の即時性とモンテカルロ法の正確性を組み合わせ、学習の効率と安定性を大幅に改善します。

まとめ

本記事で学んだこと

  1. TD誤差の本質

    • 予測と新しい情報の差
    • ベルマン方程式の誤差項
    • 学習シグナルとしての役割
  2. TD学習の利点

    • オンライン学習可能
    • メモリ効率的
    • 継続的タスクに適用可能
  3. ブートストラップ

    • 予測を使って予測を改善
    • バイアスと分散のトレードオフ
  4. 制御への拡張

    • SARSA(方策オン型)
    • Q学習(方策オフ型)

TD誤差の重要性

TD誤差は強化学習において中心的な役割を果たします。

  • 学習の駆動力 - 価値関数の改善方向を示す
  • 収束の指標 - 学習の進行状況を測る
  • 発展的手法の基礎 - 多くの現代的手法がTD誤差を活用

強化学習ロードマップ

この記事シリーズでは、以下の順序で強化学習の核心概念を学んでいきます。

  1. 基礎理論 - MDP、価値関数、ベルマン方程式(完了)
  2. モンテカルロ法 - モデルフリー学習の出発点(完了)
  3. 時間差分学習 - TD誤差とTD(0)、SARSA、Q学習(本記事)
  4. 🔄 高度なTD手法 - n-step TD、TD(λ)、Eligibility Trace(次回)
  5. 🔜 深層強化学習への橋渡し - 関数近似と深層学習の導入
  6. 🔜 方策ベース手法 - Policy Gradient、REINFORCE
  7. 🔜 Actor-Criticアーキテクチャ - 価値ベースと方策ベースの統合
  8. 🔜 現代的手法 - PPO等の実用的アルゴリズム

TD誤差という概念は、これから学ぶすべての高度な手法の基盤となります。特に深層強化学習でも、TD誤差は価値関数の学習信号として中心的な役割を果たし続けます。

Discussion