Day 1 · MC / TD / DP 的关系
每日一问 · Day 1 · 2026-08-21
每日一问 · DAY 1

同一个方程,三种算它的办法
蒙特卡罗、时序差分、动态规划的关系

一句话:三者在解同一个方程——Bellman 期望方程 ,区别只在右边那个期望怎么估:DP 用模型把所有分支加权算干净,MC 干脆一路走到终点、用真实回报替掉它,TD 只走一步、剩下的用自己现在的估计顶上。所以 TD 不是第三条路线,它是从 MC 拿了「采样」、从 DP 拿了「自举」,拼出来的。

§ 1示例:三站地铁线

这一问不是比谁强,是问它们到底是不是一家人。所以先不推公式,先让三种方法在同一集经验上各算一次,看看给出的数差多少。

例子小到能在脑子里跑完:一条三站的地铁线。状态 终点,每走一站都要么刚好赶上(奖励 ),要么等一班车(),各一半概率。因为三步必然到站,取

真值不用算法也能写出来:每走一站的期望代价是 ,剩几站就乘几——

现在跑一集。随附脚本里 seed = 8 的第一集是「 / 赶上 / 」,奖励序列 ,所以这一集从 出发实际拿到的回报是

三张值表都从 开始,步长先取 (把步长这个干扰项去掉,直接看各自认的目标)。问: 该改成多少?

算法它认的目标是什么算出来
MC这一集从 真实拿到的整条回报 −2.0000
TD(0)第一步的奖励 + 现在对 的估计:−1.0000
DP第一步的期望奖励 + 现在对 的估计:−0.5000
全宽穷举 条等概率轨迹的回报全枚举,取平均−1.5000
这三个数不是三个答案,是同一个答案的三种估法。−2 背了三步的运气,−1 只背了第一步的,−0.5 一步都没背(它查了模型)。而第四行 −1.5000 正好是真值——因为它两个方向都没省:既没有只采一条边,也没有半路停下来接估计。这张表的四行,等下会变成 §6 那个 2×2 的四个格子。
符号约定,沿用第 0 课。一集里的时刻(走到第几站),DP 扫描的遍数(整张表刷了第几遍)。两者不混用: 是「第 k 稿值表」, 是「这一集第 t 步所在的站」。

§ 2动态规划

DP 的立场是:我不试,我查表。它手里有环境模型 ,所以能把「下一步会怎样」的所有可能按概率加权算清楚,一次都不用真跑。

把这件事写成一个算子。给定策略 Bellman 期望算子 把一张值表变成下一张值表:

这个式子读一遍就够了:站在 ,把所有可能走的路各走一遍(不是真走,是按概率算),每条路算「这一步拿到的奖励 + 打折后接上现在对落点的估计」,再按概率平均。

当前这一稿值表在状态 上的数。它是输入也是输出——右边用旧的,左边写新的。
策略:在 选动作 的概率。评估固定策略时它是已知的。
环境模型:在 ,转到 并拿到奖励 的概率。这是 DP 唯一比另外两个多要的东西,也是它全部麻烦的来源。
这一步的即时奖励。注意它在求和号里面——DP 用的是它的期望,不是某一次的取值。
折扣因子,。本例取 1。
这两个求和号就是「全宽」三个字的全部含义:一个分支都不漏。

定理(唯一解)  作用一次不变的唯一一张表:。也就是说,Bellman 期望方程和「真值表」是同一件事的两种说法。

定理(-收缩) 当 时,对任意两张表 。于是从任意 出发反复刷,误差按 掉:

放到三站地铁上:只有一个动作, 消失;后继只有一个站,两种奖励各一半,于是整个算子塌成一行——

开始,每遍把三站同时刷一次(同步更新,右边一律用上一稿):

1−0.5000−0.5000−0.5000情报只从终点往回走了一站
2−1.0000−1.0000−0.5000 已经到位
3−1.5000−1.0000−0.5000三站全部精确
4−1.5000−1.0000−0.5000不动了,这就是答案
一个坑:这里 ,收缩定理明明用不了,凭什么 3 遍就精确?因为收敛在这里靠的不是折扣,是必然终止 的后继是终止状态,值恒为 0、不含任何估计;刷第 2 遍时 就干净了,第 3 遍轮到 。刷满 3 遍之后,式子里再也找不到 的影子,所以初值取什么都一样。这类「有限步必到终点」的策略叫 proper policy,它自带一套收敛结论。折扣任务里才用 -收缩那一套——见第 1 课的停机界。

§ 3蒙特卡罗

MC 的立场正相反:我没有模型,但我能跑。既然 按定义就是回报的期望,那就多跑几集,拿样本平均去顶那个期望。

这个式子读一遍就够了: 出发,把这一集剩下的奖励一路打折加起来,加到终止为止;这条真实的累计量就叫回报 注意 一个估计值都没有——全是真数出来的。

从时刻 起的折扣回报。它是一个样本,不是一个估计:这一集运气好就大,运气差就小。
这一集终止的时刻。MC 要求 有限——不终止就没有 ,整个方法就没法启动。
被访问过的次数。首访 MC 每集最多记一次,每访 MC 记每一次。
步长。取 时,下面那个增量式恰好就是样本均值,一点都不多不少。

定理(无偏) 。这不是近似,是定义本身——所以 MC 的目标永远无偏,一天都没偏过。

定理(收敛) 首访 MC 的样本均值以概率 1 收敛到 (强大数定律),并且标准误按 掉。写成在线增量形式就是:

回到地铁: 是三次独立掷币的和,只有四个取值,概率是 ——

均值正是真值(无偏),但一次抽样能落到 0,也能落到 −3。 时我们照单全收,于是 §1 里 一步就被拽到了 −2。


§ 4时序差分

TD 的立场是个折中:我也没有模型,但我不想等到终点。走一步,拿到真奖励 ,然后直接用自己现在对 的估计把后面全顶掉。

这个式子读一遍就够了:「我原来以为值这么多,走一步之后我觉得值那么多,差多少就补一点点」。差的那一块 就是 TD 误差,这一问里所有事情都绕着它转。

TD 误差:走一步之后对同一个状态的两次说法之差。它是 TD 唯一的信号源。
采样来的一步奖励。随机,但只随机这一步——这是 TD 方差小的全部原因。
自己现在的估计——用估计顶替了还没走完的部分。这个词叫自举(bootstrapping):拿估计去改进估计。
步长。因为目标本身是抖的, 不能取 1 硬跟——那样只会被噪声牵着走。

定理(TD(0) 收敛;Sutton 1988,Dayan 1992,Jaakkola–Jordan–Singh 1994) 在表格表示下,若每个状态被访问无穷多次,且步长满足 Robbins–Monro 条件 ,则 以概率 1 成立。

但真正回答今天这一问的,是下面这个恒等式。对 TD 的目标关于「下一步会走到哪」取期望:

左边是 TD 抽一次得到的数,右边是 DP 算出来的那个加权和。两边严格相等:TD 的目标就是 DP 目标的一个无偏样本。

TD 和 DP 不是两种思路,是同一个备份的两种算法。DP 把 老老实实乘出来;TD 没有 ,就用一次抽样代替那个求和号,再用小步长 把抽样噪声磨平。这正是 Robbins–Monro 随机逼近的标准套路——所以 TD 不需要模型:期望被采样替掉了。

§ 5统一的更新模板

把 §2–§4 摞在一起,会发现三个式子的骨架是同一根:

剩下的差别,全在「目标」那一格里填什么:

算法目标要模型吗要等终止吗用自己的估计吗
DP,且 不要
MC不要不用
TD(0)不要不要
三者在解同一个 Bellman 期望方程,分歧只在「右边那个期望怎么估」。DP 用模型把它算干净,MC 用一整条真实轨迹替掉它,TD 用一步采样加一个估计凑出它。看懂这一行,这一问就答完了一半——另一半是它们各自为此付了什么代价(§7)。
交互 · 同一条轨迹,三张表并排长
MC集末回填
TD(0)每步就改
DP不看经验
按「走一步」开始。三张表都从 0.00 出发,交给它们的是同一条随机轨迹。
0 现在在 起点 MC 最大误差 1.5000 TD 最大误差 1.5000 DP 最大误差 1.5000
每格下面的小字是该站真值。DP 那一行完全没看这条轨迹——它每过一集刷一遍全宽备份,纯粹为了和另外两行对齐节奏。
盯住三件事。其一,TD 那行每走一步就动一格,MC 那行整集不动、到终点才一次性回填三格——这就是「能不能在线学」。其二,DP 那行三集之内必然停在真值上,而且再也不动;另外两行永远在真值附近抖,抖的幅度就是采样噪声。其三,把 α 拖到 1,MC 那行会被单集运气甩出去很远,TD 那行要稳得多——这就是 §7 要算的方差。

§ 6宽度与深度

现在可以把关系画出来了。三个算法的差别,其实是两个互相独立的开关

开关一 · 宽度  右边那个期望,是采样一条边,还是按模型加权所有边
开关二 · 深度  往下走,是走一步就接估计(自举),还是一路走到终止

两个开关各两档,拼出四个格子。格子里的数就是 §1 那张表——同一集经验,同一个

采样一条边(无模型)按模型加权所有边(全宽)
走一步就接估计
(自举)
TD(0) −1.0000一步真奖励 + 一个估计 DP −0.5000一步期望奖励 + 一个估计
一路走到终止
(不自举)
MC −2.0000一整条真实回报 全宽穷举 −1.50008 条轨迹全枚举 = 真值

把这四格画成备份图,一眼就能看出省了什么:

DP:一步 · 全宽TD(0):一步 · 一条边MC:到底 · 一条边全宽 + 到底 = 精确解
圆圈是状态,空心方块是「接上去的那个估计 」,实心方块是终止,虚线是没去采的那条边。左一 DP:只往下一层,但两条边都算——省了深度,没省宽度。左二 TD(0):也只往下一层,但只走真正采到的那一条——深度宽度都省。左三 MC:只走一条边,可是一直走到实心方块为止——省了宽度,没省深度。右一:两个都不省,于是它根本不是算法,是精确解(在这条链上就是 −1.5000)。
TD 就是 MC 的采样 DP 的自举。它从 MC 那里学会「不需要模型,采一条边就行」,从 DP 那里学会「不必走到底,接上现在的估计就行」。两样都拿,于是两样的好处它都占一点,两样的毛病也都沾一点——这正是下一节要算的量。至于第四格,它提醒你一件事:这三个算法,本质上都是在「省算力」这件事上做取舍,谁都没打算比精确解更准。

§ 7方差、偏差与回传速度

7.1 方差

把三个目标的分布画出来(都在真值处比,即 ,这样偏差不掺进来):

MC 目标 G 与 TD 目标 r+γV(s2) 的分布:同为 −1.5 均值,标准差 0.8660 对 0.5000
左:三个目标的均值都是 −1.5,但 MC 的目标散在 四个点上,TD 的只散在两个点上,DP 的完全集中在一点。右:标准差 0.8660 / 0.5000 / 0.0000。比值 ——正好是「三步的随机性 vs 一步的随机性」,方差是 3 比 1。

这个 不是巧合,是手算得到的: 是三次独立掷币的和,方差 ;TD 的目标里只有 是随机的,方差 MC 每多走一步,就多背一步的运气;TD 永远只背一步。

7.2 偏差

代价在另一头。MC 的目标永远无偏(§3 的定理),TD 的目标却依赖当前这张表准不准。起步时 ,TD 在 的目标期望是

整整偏了 1.0000,方向还是偏乐观。这笔偏差只会随着 自己变准而慢慢消掉——而 又要等 先准。自举省下来的方差,是用「情报回传得慢」换的。

7.3 回传速度

三站地铁上 MC 与 TD 的学习曲线,以及 DP 三遍备份就精确的水平线
左:同一批经验、同一个 。MC(橙)比 TD(绿)抖得明显,两条都在真值 −1.5 附近晃;点线是 DP——它一条经验都没用,刷 3 遍就压在真值上再也不动。右:500 次重复取平均的 RMS 误差,第 200 集 MC 0.1445、TD 0.1268
目标方差差了 1.7320 倍,最后 RMS 只差 1.14 倍——差额来自自举引入的偏差。TD 在方差上省下的那部分,被「 要等 准、 要等 准」这条回传链吃掉了一大半。凡是听到「TD 方差小所以更好」,都得先问一句:好在第几集?这个问题的完整答案就在下一节。

§ 8n 步方法与 TD(λ)

既然分歧只是「走几步才接估计」,那 1 和 之间就是连续的。把 TD 的目标往下多走几步:

这个式子读一遍就够了: 就是自举的接入点——在第 步之前全用真数据,第 步之后交给估计。于是 就是 TD(0), 大到够走完这一集就是 MC,中间全是没名字的算法。再把所有 按几何权重混起来,就是 TD():

三站太短,看不出名堂。把线路加长到 10 站(规则不变),扫一遍

十站线路上 n=1,2,4,10 的 RMS 误差随集数变化,以及三个经验预算下各自最优 α 的成绩
左: 固定,双对数轴。前期 越大越好(MC 领先),但曲线会交叉——第 231 集 TD 反超 MC,此后一直领先。右:给每个经验预算都把 各自调到最好,再除以该预算下的最好成绩。100 集时 MC 赢(TD 差 1.50 倍),400 集时中间的 2000 集时 TD 赢(MC 差 1.31 倍)。
谁更好这个问题没有固定答案,答案取决于你有多少经验。经验少的时候,自举的偏差还没磨掉,MC 的「无偏」更占优;经验多起来之后,偏差已经磨掉,TD 的「低方差」开始占优。中间那段则由中间的 赢——这就是 -step 和 TD() 存在的全部理由:它们不是折中的妥协,是这条轴上真正的最优点。

顺带一提,另一个开关(采样 全宽)上也有一整排中间产物:Expected SARSA 把「采一条边」换回「按 加权所有动作」,树备份、Dyna 则是把学到的模型拿回来做几步 DP。两个开关,两条连续轴,几乎所有值函数方法都是这个平面上的一个点。

8.1 批量下的分家

前面说三者收敛到同一个 ——那是数据无穷时。数据有限、反复训练到收敛(batch 情形)时,两者的目标本身就不同:batch MC 最小化训练集上的均方误差,batch TD(0) 则收敛到「把这批数据当成一个 MDP 来估、再精确求解」的答案(certainty equivalence)。

在这条链上可以看得很清楚。先给它一批每集都从 出发的数据(20 集):

完全一样。原因也简单:每一集恰好经过每一站各一次,「先把每集的和求出来再平均」和「先把每站平均出来再求和」是同一件事。要让它们分家,得让访问次数不齐。于是换一批起点随机的数据(30 集,三站分别被访问 7 / 22 / 30 次):

离真值 −1.5000
batch MC−1.0000−1.1818−0.66670.5000
batch TD−1.3095−1.1667−0.66670.1905

差了 0.3095,而且 TD 明显更靠近真值。为什么?MC 估 时只认经过 的那 7 集,其余 23 集在它眼里跟 无关;TD 认的是「 走一步会到 」这条结构,于是那 23 集里关于 的经验,全被它借过来用了。这正是自举真正的好处:它让经验在状态之间流动。


§ 9适用边界与小结

关系说清楚了,最后把适用边界界定清楚——每个方法都有一个「到这里就不灵了」的地方:

动态规划 DP

适用
模型已知、状态不多。零方差,收敛极快(本例 3 遍精确),还能当另外两个的参照答案
失效
——现实里通常没有。就算有,一次备份要扫整个状态空间,维数一高立刻做不动(第 1 课那张 4×4 表的规模上限)。

蒙特卡罗 MC

适用
无偏、不需要模型、不怕模型错,而且可以只算你关心的那几个状态。评估阶段和早期训练特别好用。
失效
必须终止(持续任务直接出局);方差随轨迹长度线性涨;必须等一集走完才能更新,学不了在线,也用不上中途的信息。

时序差分 TD

适用
不要模型、不要终止、每一步都能学,方差还小。所以 Q-learning、SARSA、DQN、Actor-Critic 里的 Critic,全是 TD。
失效
目标有偏,而且偏差要靠回传慢慢磨;一旦把「自举」和「函数逼近」「off-policy」凑齐,就是致命三角,收敛保证全丢(Stage 1)。

八句话收尾,能背下来这一问就过了:

  1. 三者在解同一个方程:,分歧只在右边那个期望怎么估
  2. 更新的骨架也是同一根:,换的只是「目标」两个字。
  3. 两个正交的开关:宽度(采一条边 / 按模型加权所有边)、深度(走一步接估计 / 走到终止)。
  4. TD = MC 的采样 + DP 的自举;两个开关都不省的那一格不是算法,是精确解。
  5. :TD 的目标是 DP 目标的无偏样本,TD 就是对 DP 备份做随机逼近。
  6. 代价是对称的:MC 无偏但方差大(本例 倍),TD 方差小但有偏(起步偏 +1.0000),DP 两样都没有但要模型
  7. 谁更好取决于经验预算:100 集 MC 赢,400 集 赢,2000 集 TD 赢——-step 与 TD() 就活在这条轴上。
  8. 数据有限时它们连答案都不同:MC 拟合训练集,TD 拟合最大似然 MDP;自举真正的作用,是让经验在状态之间流动。
下一问会往「控制」那边走一步:为什么 Q-learning 敢用 而 SARSA 不敢——今天这一问停在策略评估上,还没碰到「一边学一边改策略」带来的那堆麻烦,而那才是 off-policy 与 on-policy 分家的地方。
本页所有数字都是跑出来的,不是抄的:真值 −1.5000、 那一集的 、三次 DP 扫描表、目标标准差 0.8660 / 0.5000、第 200 集的 0.1445 / 0.1268、十站线上的交叉点第 231 集、三个预算下的 1.50 / 1.00 / 1.31,以及 batch 两张表,全部来自同一个脚本(三站与十站两组实验 + 三张图的亮暗两版),整跑约 11 秒。
↑ 回到顶部