對價值誤差做梯度下降
一旦價值是個帶參數的函數,學習就是最佳化:沿著梯度把 w 往下推,縮小價值誤差。對某個目標為 U 的狀態,平方誤差是 (U − v̂(s,w))²,而隨機梯度下降(stochastic gradient descent)以正比於 (U − v̂(s,w)) 乘上 v̂ 的梯度的步幅來更新 w。對線性方法而言,v̂ 的梯度就是特徵向量 x(s),所以更新極其簡單:w ← w + α·(U − wᵀx(s))·x(s)。
如果目標 U 是蒙地卡羅回報——一個實際取樣到的總獎勵——那麼 U 不依賴 w,這就是真正的梯度下降,會收斂到最佳的最小平方擬合。麻煩從我們用自助法讓 U 變便宜的那一刻開始。
一个小球在弯曲的损失曲面上随梯度下降逐步滚向最低点的交互演示。
自助法弄壞了梯度
時序差分學習(temporal-difference learning)使用一個更便宜、變異更低的目標:當下獎勵加上對下一個狀態的折扣估計,U = r + γ·v̂(s′,w)。這就是自助法(bootstrapping)——目標是用我們自己當前的估計建出來的。但現在 U 含有 w。平方誤差的誠實梯度,必須同時對 v̂(s,w) 與 v̂(s′,w) 微分。
半梯度方法(semi-gradient methods)作弊——而且是故意的。它們把自助目標當成固定常數,忽略它對 w 的依賴,只對 v̂(s,w) 微分。更新維持上面那個簡單形式,其中 U = r + γ·v̂(s′,w)。它不是任何目標函數的真梯度,這就是「半」的由來——但在同策略加線性特徵下它會收斂、它快、而且這正是樸素 TD 與 Sarsa 實際在做的事。
半梯度 TD(0) 更新:方括号中的 TD 误差只乘以 v̂ 的梯度,忽略目标对 w 的依赖。
半梯度 TD 落腳何處:TD 不動點
半梯度 TD 並不最小化價值誤差。它收斂到一個不同的解,稱為 TD 不動點(TD fixed point),最好透過向價值空間投影(projection onto value space)來理解。想像你的特徵能表示的所有價值函數,是「所有可能價值函數」這個巨大空間裡的一個平面。真實價值通常落在那個平面之外。一次 Bellman 回填會把價值推離平面(朝向真理);投影則把它彈回最近的可表示點。TD 不動點就是「回填再投影」之後價值維持不變的那一點。
直接解出不動點:LSTD
如果我們要的是某個線性系統的 TD 不動點,為什麼要用小小的梯度步一步步爬過去?最小平方時序差分(least-squares temporal difference, LSTD)以封閉形式直接算出它。它在資料上累積兩個統計量——一個矩陣與一個向量,分別摘要特徵與 TD 目標——然後解一個線性系統,求出滿足不動點方程的權重。沒有步幅、不用上千次掃描;它是資料效率最高的線性 TD 方法。
代價是計算與記憶體:建立並反轉那個矩陣的成本約是特徵數量的平方(求解則是三次方),所以 LSTD 在數百個特徵時大放異彩,但百萬個特徵時就不行。它是半梯度 TD 的批次對應版,也是第 5 篇擬合方法的跳板。
誠實的替代方案:殘差梯度
如果半梯度方法忽略部分梯度讓你不安,殘差梯度方法(residual gradient methods)做誠實的事:同時對 v̂(s,w) 與自助的 v̂(s′,w) 微分,給出均方 Bellman 誤差的真梯度。因為它是真正的梯度,即使在異策略下也保證收斂——不作弊、不發散。
残差梯度更新保留了额外的 −γ∇v̂(s′,w) 项,诚实地也对自举目标求导。
那為什麼不是人人都用它?它通常較慢,而且在隨機環境中有偏誤——最小化 Bellman 誤差傾向學出過度平滑的價值,而且要做到無偏需要對下一狀態取兩個獨立樣本。殘差梯度以速度與準確度換取安全。要把這三者——速度、異策略安全、真目標——同時握住,正是我們接下來透過致命三元組要攻克的難題。