☰
时序差分学习:从贝尔曼方程到TD(λ)的强化学习核心算法
2026/10/1 5:34:01 网站建设 项目流程

学完蒙特卡洛那一章时,我隐约觉得哪里不对劲。MC的方法很直白:等一场游戏打完,用真实的累计回报去修正状态价值估计。这个逻辑没问题,可问题在于"等一场游戏打完"——在连续任务里根本没有"打完"这回事,在真实机器人实验里你也等不起那么久。当时我的直觉是:能不能走一步就修正一步?答案就是这第7章要讲的东西——时序差分(Temporal Difference,简称TD)。如果你正处在"读懂了贝尔曼方程,但不知道它怎么落地成算法"的阶段,这篇笔记应该能帮上忙。我会把每个更新式拆开,把"为什么这样写"的逻辑也说清楚。

1. 为什么"边走边学"能替代"跑完再改":TD思想的由来

1.1 蒙特卡洛方法的两处硬伤

先说清楚我们想解决什么问题。第4章里,蒙特卡洛方法用完整回合的累计回报 $G_t = r_{t+1}+\gamma r_{t+2}+\gamma^2 r_{t+3}+\dots$ 作为状态价值 $v_\pi(s)$ 的估计目标。给定一个策略 $\pi$,我们不断采样轨迹,对每个访问过的状态求这些回报的平均值,就能逼近真值 $v_\pi(s)$。

这个思路有两点让人不舒服:

  • 必须等到幕结束才能更新。如果任务没有终止状态(比如机器人持续搬运物品),或者一局要跑几小时,MC就非常尴尬——你只能干等。
  • 方差大。$G_t$ 是一长串随机奖励的累加和,中间任何一次随机抖动都会被放大。尤其当环境有较强的随机性时,MC的估计曲线会剧烈震荡,收敛速度肉眼可见地慢。

当时我自己的体会是:MC像"期末考试后才知道自己考砸了",但是考试已经结束,想改也来不及了。我们真正想要的是一个能"随堂测验、立刻反馈"的方法。

1.2 动态规划留下的钥匙:贝尔曼方程

而第3章动态规划其实给过一把钥匙——贝尔曼方程:

$$v_\pi(s) = \mathbb{E}\pi\left[ r_t + \gamma v\pi(s_{t+1}) \mid s_t = s \right]$$

它告诉我们:一个状态的价值,可以由"即时奖励 + 折扣后的后继状态价值"计算出来。动态规划的做法是用当前估计值 $v_k(s')$ 去算 $v_{k+1}(s)$,一遍遍迭代,这叫自举(bootstrapping)。

DP的问题是它需要一个完美模型:你得知道状态转移概率 $p(s'|s,a)$,还得能枚举所有后继状态。真实场景里,环境模型要么没有,要么不准。既然MC说"我可以采样",DP说"我可以用后继状态的价值",那为什么不把两者捏到一起?

1.3 TD的做法:走一步就更新

第7章给出的答案,就是利用贝尔曼方程做一步采样:

从状态 $s_t$ 按策略走一步,得到奖励 $r_t$ 和新状态 $s_{t+1}$。我们手头虽然没有真实后继价值,但有一份"当前估计值" $V(s_{t+1})$。那就把

$$r_t + \gamma V(s_{t+1})$$

当成一个"伪目标"(TD target),然后让 $V(s_t)$ 向它靠近:

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

你看,这个操作既没有等到回合结束(这是MC的特征),也没有计算期望(这是DP的特征),它走一步、采样一步、就地更新——所以叫时序差分。

我当时为了记住这件事,画过一张 "三选一" 的对比表,也放这里:

方法是否需要环境模型是否自举是否采样
动态规划 DP是是否
蒙特卡洛 MC否否是
时序差分 TD否是是

一句话总结:TD同时继承了DP的"自我预测"和MC的"经验采样",而且是增量式更新,不需要等结局。这个思想之后会反复出现,是整个强化学习算法家族最核心的骨架之一。

2. 拆开TD误差公式:一个数字案例与"有偏但方差小"的权衡

2.1 TD(0)的更新式:从贝尔曼期望到一步采样自举

教材里一般把最简单的单步更新叫 TD(0),下标0表示只看未来一步。它的完整形式是:

$$ V_t(s_t) = V_{t-1}(s_t) + \alpha_t \left[ r_t + \gamma V_{t-1}(s_{t+1}) - V_{t-1}(s_t) \right] $$

其中 $V_{t-1}$ 表示更新前的价值估计。方括号里的东西就是一个"误差信号",专门给它一个名字叫TD误差:

$$ \delta_t = r_t + \gamma V_{t-1}(s_{t+1}) - V_{t-1}(s_t) $$

注意一个细节:这里的 $r_t$ 是真实采样到的即时奖励,而 $\gamma V(s_{t+1})$ 用的是当前还不准确的估计值。所以 $\delta_t$ 不是"真实误差",它只是"当前估计与自举目标之差"。整个过程等于把状态价值往某个近似方向上"拉"了一小步。

如果要写成"旧值 + 增量"的形式,就是:

$$ V_t(s_t) = (1-\alpha_t)V_{t-1}(s_t) + \alpha_t (r_t + \gamma V_{t-1}(s_{t+1})) $$

我当初第一次看到这个式子,容易犯的迷糊是:它为什么只改 $s_t$ 的价值,而不改 $s_{t+1}$?原因很简单,我们手里关于状态 $s_{t+1}$ 的信息还不够(它只是被路过了一下,它的"下一跳"还没发生)。TD的哲学是"谁的经验谁先改",走到哪、改到哪。

2.2 一个三次轨迹的数字推演

光看公式还是不够,我建议你跟着我手推一个极简例子。假设三个非终止状态 $A \to B \to C \to T$($T$ 是终止状态),$\gamma=1$,所有初始价值为0,学习率 $\alpha=0.1$。

轨迹1:$A \to B$ 得 $r=0$;$B \to C$ 得 $r=0$;$C \to T$ 得 $r=1$。

  • 更新 $V(A)$:$\delta = 0 + 1\times 0 - 0 = 0$,不变。
  • 更新 $V(B)$:$\delta = 0 + 1\times 0 - 0 = 0$,不变。
  • 更新 $V(C)$:$\delta = 1 + 1\times 0 - 0 = 1$,$V(C)=0+0.1\times1=0.1$。

一次轨迹下来只有 $V(C)$ 变了,是不是很"抠门"?继续。

轨迹2:走同样的路。

  • 更新 $V(A)$:$\delta = 0 + 1\times 0 - 0 = 0$,还是不变。
  • 更新 $V(B)$:$\delta = 0 + 1\times 0.1 - 0 = 0.1$,$V(B)=0+0.1\times0.1=0.01$。
  • 更新 $V(C)$:$\delta = 1 + 1\times 0 - 0.1 = 0.9$,$V(C)=0.1+0.1\times0.9=0.19$。

看到了吗?$C$ 的经验开始往 $B$ 传递了。

轨迹3:

  • 更新 $V(A)$:$\delta = 0 + 1\times 0.01 - 0 = 0.01$,$V(A)=0.001$。
  • 更新 $V(B)$:$\delta = 0 + 1\times 0.19 - 0.01 = 0.18$,$V(B)=0.01+0.1\times0.18=0.028$。
  • 更新 $V(C)$:$\delta = 1 + 0 - 0.19 = 0.81$,$V(C)=0.19+0.1\times0.81=0.271$。

三幕下来,奖励信号像水波一样从终点往起点一层层反向扩散。TD更新的关键在这里:每个状态只需要等到下一跳发生,就能收到"后继状态传来的涟漪"。这正是"时序差分"名字里"时序"二字的含义——按时间顺序,把差异一步一步往回传。

2.3 为什么说TD"有偏但方差小"

蒙特卡洛的回报 $G_t$ 是真实奖励的累计,它不依赖任何估计值,所以是无偏的。代价是:因为要累加很多随机量,方差大。

TD的target $r_t+\gamma V(s_{t+1})$ 里面 $V(s_{t+1})$ 是估计值,一开始它根本不准,所以TD估计是有偏的。但它的好处是只依赖一次随机奖励和一次后继状态,随机性的来源少,方差明显低。

用一个不太严谨但很好记的比喻:MC是"期末考完看总分",一次考试可能因为题目难易起伏很大;TD是"边学边做单元测",小测验波动小,但测验卷子本身可能出得不够准。这两种方法在数学上一个对应无偏高方差,一个对应有偏低方差,没有绝对谁更好,只有你所在任务更在意哪一头。

3. 从估计状态到学会动作:SARSA、Q-learning与它们的分岔口

3.1 为什么必须转向行为值函数

到目前为止,TD都是在对状态价值 $V(s)$ 做估计。可做控制的时候,我们需要知道"在状态 $s$ 下哪个动作好",光知道状态的价值不够。比如两个状态价值相同,一个能到达高奖励区域,一个只能走来走去,策略改进会比较"动作"而不是"状态"。

所以从这一节开始,TD系列的主角换成了行为值函数 $Q(s,a)$。定义还是一样的贝尔曼期望形式,只是把条件从"状态"换成"状态-动作对":

$$q_\pi(s,a) = \mathbb{E}\pi\left[ r_t + \gamma q\pi(s_{t+1}, a_{t+1}) \mid s_t=s, a_t=a \right]$$

TD的单步更新变成了对 $Q$ 的更新。接下来麻烦的事来了:$a_{t+1}$ 怎么选?不同的选择方式,直接分裂出了两个著名的算法。

3.2 SARSA:用"实际采取的下一步动作"做目标

SARSA这个名字就是五个字母拼起来的:State-Action-Reward-State-Action。更新公式:

$$ Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha \left[ r_t + \gamma Q(s_{t+1}, a_{t+1}) - Q(s_t,a_t) \right] $$

注意,$a_{t+1}$ 是什么?它必须是当前策略 $\pi$ 实际下一步会采的那个动作。比如你用 $\epsilon$-greedy 探索,那 $a_{t+1}$ 就是真的用 $\epsilon$-greedy 选出来的动作,而不是"回头想想最贪心的动作"。因为这个原因,SARSA属于**on-policy(在线策略)**算法:它评价和优化的是同一个正在执行的策略。

我记得教材里曾用"悬崖行走"(Cliff Walking)这个任务做演示:起点在左下,终点在右下,中间是一排悬崖。用SARSA训练出来智能体通常绕着悬崖上边走,非常保守。原因很直观:SARSA把"当前策略可能的失足"也学到了Q值里,$\epsilon$ 探索阶段一旦掉下去过,它就知道那条路危险,下次宁可绕远。

3.3 Q-learning:用"所有动作里的最大值"做目标

Q-learning的思路更"贪婪":

$$ Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha \left[ r_t + \gamma \max_{a'} Q(s_{t+1}, a') - Q(s_t,a_t) \right] $$

它和SARSA唯一的差别,就是 $Q(s_{t+1},a_{t+1})$ 变成了 $\max_{a'} Q(s_{t+1}, a')$。这个 $\max$ 意味着:不管行为策略下一步实际选了哪个动作,更新时都假设"下一步会采取最优动作"。所以Q-learning可以一边用探索策略收集数据,一边学习最优策略对应的Q函数,属于**off-policy(离线策略)**算法。

这也是Q-learning在理论上的漂亮之处——它直接逼近最优值函数 $q_*$,而不依赖当前策略。回到悬崖行走:Q-learning学出的路径往往是贴着悬崖边缘的最短路径。因为它更新时假设"以后会走最贪心的动作",而最贪心的动作看起来风险低、路径短,于是它敢于冒险。

现实中的对比我后面还会细讲。但必须先提醒一句:SARSA学到的是"带探索动作的策略的最优价值",Q-learning学到的是"纯贪心策略的最优价值",所以两者最后的Q值不能直接拿来互相比较,它们根本不是同一个对象。

3.4 Expected SARSA:用期望来代替"最大"或"单样本"

SARSA的缺点是目标里包含随机采样的 $a_{t+1}$,方差偏大;Q-learning的缺点是 $\max$ 会带来过估计(会把噪声的最大值当成真实最大值)。

Expected SARSA夹在中间:用行为策略 $\pi$ 下的期望值来做目标:

$$ Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha \left[ r_t + \gamma \sum_{a'} \pi(a' \mid s_{t+1}) Q(s_{t+1}, a') - Q(s_t,a_t) \right] $$

这样既保留了 off-policy 的思路(你可以用任意策略采集数据,再用行为策略的期望做自举),又比单样本SARSA的方差小。如果 $\pi$ 是确定性贪心策略,那期望就退化成 $\max$,Expected SARSA就变成了Q-learning;如果 $\pi$ 是正在使用的探索策略,那它也等价于一个低方差的SARSA变体。这个式子看上去只是"习惯性把期望写出来",但在实际工程调参中非常有用,后面我做表格型实验时经常拿它当低方差baseline。

4. 收敛性不是凭感觉:TD的随机逼近视角与条件

4.1 把TD(0)看成Robins-Monro采样迭代

讲完算法本身,很多初学者会卡在"TD到底为什么能收敛?"上。我建议你把它放回上一章学的随机逼近框架里看。

策略评估的目标是求解贝尔曼方程 $v_\pi(s)=\mathbb{E}\pi[r+\gamma v\pi(s')]$,移项一下:

$$v_\pi(s) - \mathbb{E}\pi\left[r+\gamma v\pi(s')\right] = 0$$

这里未知数是函数 $v$,右边是0。我们想要找一个让这个方程成立的价值函数。但问题是我们不知道期望 $\mathbb{E}\pi$,只能采样到 $r_t$ 和 $s{t+1}$。那就可以用随机逼近的方式来解:把真实但不满足的"目标" $r_t+\gamma V_{t-1}(s_{t+1})$ 当成带噪声的观测,用增量式学习率 $\alpha_t$ 去更新。

所以TD(0)的更新

$$ V_t(s_t) = V_{t-1}(s_t) + \alpha_t \delta_t $$

本质上就是Robins-Monro迭代:更新方向是TD误差 $\delta_t$,而TD误差的期望恰好是"当前值与贝尔曼目标之差"。当 $\delta_t$ 的期望为0时,我们就到达了贝尔曼不动点。

4.2 表格型TD收敛需要什么条件

既然是随机逼近,自然要满足随机逼近的条件。几条我记忆很深的:

  • 学习率要满足 $\sum_t \alpha_t = \infty$ 且 $\sum_t \alpha_t^2 < \infty$。前者保证"任何初始离得远都能被拉到",后者保证"后期的随机抖动不会累积成发散"。实践中常用 $\alpha_t = \frac{1}{n+1}$ 或固定小学习率。
  • 每个状态(或状态-动作对)要被无限次访问。也就是说,你的探索策略必须保证状态空间能被"遍历",否则没被访问到的状态永远学不到。
  • 对于SARSA和Q-learning,收敛性还要求探索策略满足"每个动作在每个状态下都有非零概率被执行",比如 $\epsilon$-greedy 配合 $\epsilon \to 0$ 但不完全到0。

这里有个很容易踩的坑:TD的那一步更新只改了当前访问的那个状态,其他状态的价值完全不动。这意味着"访问到"本身是硬前提,而表格法下所有状态的访问频率不可能均匀。所以工程上通常要加足够大的 $\epsilon$ 或使用乐观初始化,否则某些"冷门状态"会被长期放弃,导致智能体永远不知道自己错过了什么好的转移。

4.3 一个反直觉点:有偏为什么还能收敛?

前面刚说过TD是有偏的,可它又能收敛到真值,这看起来矛盾。

我当时的理解是这样:TD的偏差不是"随机噪声导致的系统漂移",而是"用估计值代替真值带来的自举偏差"。每做一次更新,我们实际上是在贝尔曼方程的方向上前进一小步,就像在解一个自洽的方程组。只要迭代是压缩映射,并且采样噪声被学习率平均掉,序列就会收敛到方程组的解 $v_\pi$。换句话说,偏差只是"当前估值不够好"的偏差,不是"方向错了"的偏差。用望远镜来比喻:MC的望远镜看到了清晰但遥远的真实山体,不过手抖得厉害;TD的望远镜有一定模糊,但你每走一步都重新对焦,最终也能对到同一座山上。

5. 资格迹与TD(λ):在多步与一步之间找甜点

5.1 n步回报:从单步到多步的折中方案

TD(0)只往前走一步,蒙特卡洛走到终点。那能不能取中间,走两步、走三步?这就是n步TD的核心。

定义n步回报:

$$G_t^{(n)} = r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + \dots + \gamma^{n-1} r_{t+n-1} + \gamma^n V_{t}(s_{t+n})$$

前 $n-1$ 步用真实采样奖励,第 $n$ 步后用自举估计值。当 $n=1$,它就是TD(0);当 $n=\infty$,它就是MC。n越大,偏差越小、方差越大;n越小,偏差越大、方差越小。

这给了我们一个"旋钮":实际场景里,可以在偏差和方差之间拨动n。

5.2 λ-return:把所有n步回报加权平均

更进一步的想法是:不要只取某一个n,而是把 $n=1,2,3,\dots$ 的所有n步回报都综合起来,按权重组合。这就是 λ-return:

$$ G_t^\lambda = (1-\lambda) \sum_{n=1}^{\infty} \lambda^{n-1} G_t^{(n)} $$

权重 $ (1-\lambda)\lambda^{n-1}$ 共同组成一个和为1的分布:当 $\lambda=0$ 时权重全部落在 $G_t^{(1)}$ 上,退化成TD(0);当 $\lambda \to 1$ 时权重几乎全落在很远的n步回报上,接近MC。

这个公式看起来很美,但是有个问题:它需要"往未来看"足够多远才能计算 $G_t^{(n)}$,还是要等回合结束。这又回到"想在线更新"的困境了。

5.3 资格迹:前视转后视的工程魔法

为了解决"在线"问题,书里引入了资格迹(eligibility trace),把前视公式变成后视增量更新。

维护一个和V同样维度的迹 $z_t(s)$,每次碰到状态就"点亮"一下,然后随时间逐步衰减:

$$ z_t(s) = \gamma \lambda z_{t-1}(s) + \mathbf{1}{s_t = s} $$

更新所有状态的价值时,不只看当前状态的TD误差,而是让当前得到的TD误差 $\delta_t$ 按迹的强度去更新所有历史访问过的状态:

$$ V_{t+1}(s) = V_t(s) + \alpha_t \delta_t z_t(s) $$

直觉是这个样子的:你在连续走动的过程中,某个状态最近被访问过、或者经常被访问,它的"痕迹"就浓;如果中途走远了,之前状态的痕迹按 $\gamma\lambda$ 衰减。所以每一步虽然只计算当前这步的TD误差,但通过资格迹,这个误差被"分发"给之前所有相关状态,相当于在线的多步TD。前视公式算的是"目标",后视递推算的是"如何高效分配",两者在离线更新下等价,这正是 TD(λ) 的理论核心。

我在实现时有一个小建议:可以用"替换迹(replacing trace)"代替"累积迹(accumulating trace)",也就是每次访问到某状态时直接把迹置为1而不是加1,否则高频状态迹会无界增长,数值上容易爆掉。表格法里这个小改动不明显,但在线性函数近似里能明显提升稳定性。

实践上 $\lambda$ 我一般先取0.5到0.9之间做粗调;$\lambda$ 太靠近1,在非平稳环境中容易把噪声也累积进来;太靠近0又浪费了多步信息。现代深度强化学习算法里,有的直接做固定n步截断(如n-step DQN取n=3左右),有的用GAE——广义优势估计,本质就是把λ-return的思路平移到了优势函数上。你现在再看那些术语会觉得熟悉很多。

6. 从表格法到函数近似:学完这一章后我的几条实战体会

6.1 为什么后续所有"大名字"都绕不开TD

书看到这里,应该警惕一个误区:不要以为TD只是老旧的表格法。后面几章一旦引入函数近似,TD的基本结构依旧成立,只是 $V(s)$ 换成了参数化的 $V_w(s)$,更新目标变成了沿TD误差方向做梯度下降:

$$ w \leftarrow w + \alpha \left[ r_t + \gamma V_w(s_{t+1}) - V_w(s_t) \right] \nabla_w V_w(s_t) $$

之后你会碰到的 DQN、DDPG、PPO、SAC,价值估计部分无一例外都在用类似TD的结构。我在实验室跑机械臂抓取这类连续控制任务时,最常用的组合就是Actor-Critic:Critic用TD误差评估当前策略,Actor再用Critic给出的信号改进策略。TD是整个深度强化学习的"货币",你不在这一章把它想清楚,后面看代码会处处卡壳。

还要提一个"三大要素危局":当自举(TD)、函数近似、离策略三者同时出现时,价值估计有可能发散,这在表格法里不会发生。这就是为什么Q-learning配神经网络时需要目标网络、经验回放这些额外手段。不过这是后面章节的事了,在这一章先把表格法的扎实底座打好。

6.2 跑实验时踩过的几个坑

第一,α过大是真会发散的。表格法里我还试过 $\alpha=0.5$,看上去每个状态都有修正,但状态之间存在依赖,更新起来互相拉扯,曲线直接发散到无穷。稳妥的做法是先取0.05~0.1量级,跑一条曲线看震荡幅度再说。第二,探索率ε不能衰减太快。TD更新只触碰实际走过的状态-动作,ε太小意味着很多转移根本不会被探索,你学到的是一个残缺的Q值。我比较习惯让ε先保持0.1左右跑几千步,再慢慢降到0.01。

第三,画评估曲线别只跑一条轨迹。TD的更新本身方差小,但单次运行仍然有随机性;要对比算法时,最好至少固定10个随机种子,每个种子跑完取累计奖励曲线,再算均值和置信区间。之前看有人用Origin画强化学习置信区间曲线,其实就是把多条seed的结果做统计,别用单条曲线下结论。这个东西在真实机器人环境里尤其重要——机器人摩擦、关节响应这些都会给奖励带来额外方差,单次实验的曲线完全没有说服力。

第四,奖励尺度的敏感性。TD误差直接等于"即时奖励 + 后继价值估计 - 当前价值估计",如果奖励动不动就到几百几千,而价值估计还在个位数,那一开始学习时会非常颠簸。我习惯把奖励做一下缩放或裁剪,比如限制到 $[-1,1]$,让TD误差稳定在同一量级,收敛会顺很多。

6.3 我建议的学习路径

如果你和我一样是从公式入手,这章之后一定要做三件事:

  1. 手推一遍本章的数字例子,让误差传播的方向变成肌肉记忆;
  2. 在自写的网格环境里分别实现SARSA、Q-learning和Expected SARSA,跑通后对比它们的行为差异,用悬崖行走这种任务体会"保守"和"激进"的区别;
  3. 再写一个带资格迹的TD(λ)小demo,把 $\lambda$ 调成0、0.5、0.9,观察收敛速度的变化。

做完这三步,你再回头看深度强化学习的那些论文,会发现它们的核心思想其实和第7章的TD相差并不远——只不过把表换成了网络,把手工规则换成了自动梯度。带着"TD误差到底在哪一行"这个问题去读代码,比背公式有用得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询