MC 與 TD 之間的旋鈕
TD(0) 往前看一步,然後自助。蒙地卡羅則一路看到回合結束。何不往前看某個步數——比如 3 步或 10 步——然後才退回到你的價值估計?這正是 n 步回報(n-step return)的想法,它把 MC 與 TD 之間的抉擇變成一顆可調的旋鈕。
n 步回報使用接下來 n 個真實獎勵,然後以走了 n 步後所到達狀態的價值來自助:G(n) = r₁ + γr₂ + … + γⁿ⁻¹rₙ + γⁿ·V(sₙ)。當 n = 1 時這就是 TD(0) 目標;當 n 走到回合結束時,它就成了完整的蒙地卡羅回報。介於兩者之間的一切則在偏差與變異數之間平滑地權衡。
n 步回報將 n 個真實獎勵與一次自舉估值相結合:n = 1 即 TD(0),n → ∞ 即蒙地卡洛。
n 步 TD 的實作
n 步時間差分(n-step temporal-difference)在你又看到 n 個獎勵之後,把 V(sₜ) 朝 G(n) 更新。具體做法是保留最近 n 個轉移的小緩衝區;當緩衝區滿了,就能為其中最舊的狀態計算 n 步回報並更新它。這仍然是完全線上的——你只是延遲了 n 步。
# n-step return for the state at time t (assumes rewards r[t+1..t+n] available)
G = 0.0
for k in range(n):
G += (gamma ** k) * r[t + 1 + k] # n real rewards
if t + n < T: # not yet terminal
G += (gamma ** n) * V[s[t + n]] # bootstrap off the n-th state
V[s[t]] += alpha * (G - V[s[t]]) # n-step TD update經驗上,中等的 n(常落在 4 到 16 之間)往往勝過兩個極端:比 TD(0) 多的獎勵代表偏差更小,但不走到完整回報又代表變異數比蒙地卡羅小。代價是 n 現在成了你必須選擇的超參數,而單一固定的 n 是個很鈍的工具。
曲線顯示隨視界增加偏差下降、方差上升,總誤差在中間取得最小。
把所有 n 平均起來:λ 回報
與其押注在單一個 n,何不對所有的 n 取平均?λ 回報對每個 n 步回報形成幾何加權平均,n 步回報的權重為 (1−λ)·λⁿ⁻¹。單一參數 λ ∈ [0, 1] 現在控制你實際上看多遠:λ = 0 退化為單步 TD(0),λ = 1 則還原為完整的蒙地卡羅回報。這個平均後的目標就是 TD(λ) 的核心。
λ 回報以幾何權重 (1−λ)λⁿ⁻¹ 對所有 n 步回報取平均,用一個參數調節 MC 與 TD 之間的整個旋鈕。
用這種方式定義目標——向前看跨越許多視界——稱為前向視角(forward view)。它在概念上漂亮又清楚,但照字面看它仍需要未來的獎勵,所以你無法線上計算。解法是強化學習中最優雅的技巧之一。
資格痕跡:後向視角
資格痕跡(eligibility traces)讓你線上且增量地達成 λ 回報的效果,完全不必等待。想法是:保存一個短期記憶,即痕跡 e(s),標記每個狀態最近被拜訪的時間與頻率。每一步痕跡以 γλ 衰減,而目前狀態的痕跡被加上一筆。接著把單一個 TD 誤差 δ 依痕跡比例廣播給所有狀態。
# TD(lambda), backward view — applied every step
delta = r + gamma * V[s_next] - V[s]
e[s] += 1.0 # mark current state as eligible
for x in all_states:
V[x] += alpha * delta * e[x] # one error updates many states
e[x] *= gamma * lam # traces decay each step值得注意的是,這個後向視角(backward view)——功勞回流到最近拜訪過的狀態——在數學上(離線時)等價於前向視角的 λ 回報。它也優雅地解決了功勞分配問題:當獎勵終於到來時,它會立刻強化通往該處的那串狀態與動作,並依各自貢獻的近因縮放。
實務上如何選 λ(與 n)
目前為止全都是預測——為固定策略估計價值。代理人真正的目標是控制:找出一個好策略。下一篇把這些預測方法變成控制演算法——Sarsa、Q 學習與期望 Sarsa。