第 2 课:Monte Carlo、TD 与偏差—方差

参考答案版:包含完整代码实现与问答题深度参考解析。建议先独立完成练习题后再展开核对。

本课目标与完成标准

学完后你应能:比较 MC 与 TD(0),并实现带终止掩码的一步 TD 目标。

通过必须同时满足:

  • 独立补齐本课唯一的代码填空题,并通过给定检查;
  • 三个问答题均说明因果链,而不是只报术语;
  • 能指出至少一个正确性边界和一个性能取舍;
  • 总分不低于 8/10,且没有一票否决级概念错误。

前置关系

  • 课程前置:Python、概率期望、基本深度学习
  • 本课在路线中的作用:MC 等完整回报后监督价值;TD 用当前价值估计 bootstrap 下一状态,能在线更新。

核心心智模型

1. 它是什么,解决什么问题

在强化学习中,评估状态价值函数 V(s)V(s) 的核心方法分为两大学派:蒙特卡洛方法(Monte Carlo, MC)与时间差分方法(Temporal Difference, TD)。

  • 蒙特卡洛方法(MC)是非自举(Non-bootstrapping)的代表:智能体必须完整运行完整个 Episode 达到终止状态,利用整条轨迹的真实未来折现回报之和 Gt=∑k=0T−t−1γkrt+kG_t = \sum_{k=0}^{T-t-1} \gamma^k r_{t+k} 作为样本真值,通过监督回归更新价值网络;
  • 时间差分方法(TD(0))是自举(Bootstrapping)的代表:智能体仅需单步环境交互转移 (st,at,rt,st+1)(s_t, a_t, r_t, s_{t+1}),利用当前价值网络对后继状态的预测值 V(st+1)V(s_{t+1}) 构建即时更新目标 yt=rt+γ(1−dt)V(st+1)y_t = r_t + \gamma (1 - d_t) V(s_{t+1}),实现完全在线(Online)与流式更新。

它们解决的核心工程问题是样本效率(Sample Efficiency)、更新延迟与方差—偏差权衡(Variance-Bias Trade-off):

  • 蒙特卡洛方法直接采样真实自然回报,其期望严格收敛于真实期望价值(无偏差,Zero Bias),但由于一条长轨迹中每一步的动作探索与环境转移随机性会累乘叠加,导致样本方差极其巨大(高方差,High Variance),且无法在未完结的长任务中实时更新;
  • TD(0) 仅仅引入了单步转移的即时奖励随机性,方差极小(低方差,Low Variance),但由于用自身未收敛的网络预测值去更新自身(Bootstrapping),必然引入严重的结构性偏差(有偏差,Biased)。两者的数学统一催生了多步 TD(nn-step TD)与广义优势估计(GAE)。

2. 它如何工作

蒙特卡洛与时间差分单步更新流程如图 2-1 与图 2-2 所示:

  1. 备份图结构对比(图 2-1):

flowchart TD
    subgraph MC["蒙特卡洛 (MC) 备份"]
        S_mc["状态 S_t"] --> A_mc["完整轨迹采样"] --> End_mc["终止状态 S_T (真实累计 G_t)"]
    end
    subgraph TD["时间差分 (TD(0)) 备份"]
        S_td["状态 S_t"] --> A_td["一步转移"] --> S_next["引导自举 (Bootstrapping) R + γ V(S_{t+1})"]
    end

图 2-1:蒙特卡洛全轨迹采样与时间差分单步自举机制对比

  • 如图 2-1 所示,MC 的备份路径(Backup Path)必须垂直贯穿整个时间轴,从 StS_t 一路延伸至终止叶节点 STS_T。任何在 Episode 中途发生更新的尝试都是不可能的;
  • TD(0) 则在第 1 层决策步处将计算图截断:它将即时奖励 rtr_t 与下一状态估计 V(st+1)V(s_{t+1}) 缝合,直接用“即时局部转移 + 下一状态价值预期”作为当前状态的监督信号。
  1. TD(0) 单步闭环更新动力学(图 2-2):

flowchart LR
    State["输入当前状态 S_t"] --> Pred["价值网络预测 V(S_t)"]
    State --> EnvStep["环境单步交互得到 R_{t+1}, S_{t+1}"]
    EnvStep --> Target["计算 TD 目标: y = R_{t+1} + γ V(S_{t+1})"]
    Pred & Target --> Loss["TD 误差: δ = y - V(S_t)"]
    Loss --> Grad["梯度反传更新网络权重: θ ← θ + α δ ∇V"]

图 2-2:TD(0) 单步时序差分更新与闭环学习流程

  • 前向预测与单步观测:输入当前状态 sts_t,网络预测价值 V̂θ(st)\hat{V}_\theta(s_t)。环境执行动作后返回四元组 (st,at,rt,st+1,terminated)(s_t, a_t, r_t, s_{t+1}, \text{terminated});
  • 构建 TD 目标(TD Target): ytTD=rt+γ⋅(1−terminated)⋅V̂θ−(st+1) y_t^{\text{TD}} = r_t + \gamma \cdot (1 - \text{terminated}) \cdot \hat{V}_{\theta^-}(s_{t+1}) 其中 terminated\text{terminated} 标志位在智能体进入环境物理终止态时严格为 1,阻断未来价值自举;
  • 时序差分误差(TD Error)与半梯度反传: δt=ytTD−V̂θ(st) \delta_t = y_t^{\text{TD}} - \hat{V}_\theta(s_t) 定义均方误差损失 ℒ(θ)=12(ytTD−V̂θ(st))2\mathcal{L}(\theta) = \frac{1}{2} (y_t^{\text{TD}} - \hat{V}_\theta(s_t))^2。在反向传播中,目标项 ytTDy_t^{\text{TD}} 必须执行 detach()(半梯度 Semi-gradient 机制),参数更新公式为: θ←θ+α⋅δt⋅∇θV̂θ(st) \theta \leftarrow \theta + \alpha \cdot \delta_t \cdot \nabla_\theta \hat{V}_\theta(s_t) δt\delta_t 既是驱动价值网络更新的无偏学习信号,也是表征“现实与期望落差”的核心惊喜度指标。

3. 正确性条件与常见误区

  • 终止掩码反转与截断混淆(The Termination Bug): 在计算 TD 目标时,代码必须严格遵循 r+γ⋅(1−terminated)⋅V(s′)r + \gamma \cdot (1 - \text{terminated}) \cdot V(s')。常见灾难性 Bug 是将 Gym 返回的 truncated(超时)也当作 terminated 将价值置零,或者在布尔判断中漏掉取反逻辑。若智能体撞墙死亡时,漏掉了终止阻断,把 γV(sdead)\gamma V(s_{\text{dead}}) 累加进目标值,会导致死亡惩罚被后继虚假的高估状态直接抹平,策略永远无法学会规避死亡。

  • 全梯度反传破坏收敛性(The Full-gradient Pitfall): 在深度学习框架中,若没有对 yt=r+γV(st+1)y_t = r + \gamma V(s_{t+1}) 施加 next_val.detach(),计算图的反向传播将会同时沿着 V̂(st)\hat{V}(s_t) 与 V̂(st+1)\hat{V}(s_{t+1}) 计算梯度。这违反了 Bellman 压缩映射理论前提,使得目标网络随当前网络同步漂移,引发神经网络参数的自激震荡与非线性发散。

  • POMDP 下的自举幻觉(Bootstrap Illusions in POMDP): TD 自举的理论基石是马尔可夫性:st+1s_{t+1} 必须完整包含评估未来价值所需的全部信息。当环境存在部分可观测性(POMDP)时,单个状态无法区分不同历史,V(st+1)V(s_{t+1}) 存在系统性认知扭曲,TD 自举会将这种扭曲以闭环形式无限放大;而 MC 由于直接基于全局终局结果验证,在弱 POMDP 场景下反而表现出更好的全局鲁棒性。

4. 性能与工程取舍

  • 在线实时更新 vs 离线批处理: MC 必须常驻内存缓存全轨迹直到终止,无法支持持续流式交互;TD(0) 支持随步更新(Step-by-step),内存开销恒定为 O(1)O(1),对在线服务和实时边缘端强化学习极其友好。

  • 方差—偏差的黄金分割点:nn-step TD 与 GAE:

    • 单纯的 MC(n→∞n \to \infty):偏差为 0,方差极大,需数万倍样本量方能收敛;
    • 单纯的 TD(0)(n=1n = 1):方差极小,但强依赖初始网络猜测,在稀疏奖励场景下信息反向传导极慢(每次更新仅向前推进 1 步);
    • 工业界实践(如 PPO、IMPALA):几乎统一采用多步混合目标(nn-step TD 或 GAE(λ\lambda)),利用衰减参数 λ∈[0.9,0.98]\lambda \in [0.9, 0.98] 对不同步数的 TD 目标做指数加权平滑,以极小的偏差代价换取方差的大幅骤降。

具体演示:单布尔值对 TD 目标的决定性影响

假定当前转移观测为即时奖励 r=1.0r = 1.0,折现因子 γ=0.9\gamma = 0.9,价值网络对后继状态给出的预测为 V(s′)=5.0V(s') = 5.0:

  • 场景 A(正常转移,terminated = False): y=r+γ⋅(1−0)⋅V(s′)=1.0+0.9×5.0=5.5 y = r + \gamma \cdot (1 - 0) \cdot V(s') = 1.0 + 0.9 \times 5.0 = 5.5 智能体认为未来充满希望,当前状态应当吸收后续的 4.5 分折现价值。

  • 场景 B(达到物理终局,terminated = True): y=r+γ⋅(1−1)⋅V(s′)=1.0+0.9×0.0=1.0 y = r + \gamma \cdot (1 - 1) \cdot V(s') = 1.0 + 0.9 \times 0.0 = 1.0 物理世界在此刻终结,后续价值被严格截断归零。

对比可见,仅一个布尔标志位的翻转,计算出的目标真值差距高达 5.5−1.0=4.55.5 - 1.0 = 4.5(相差超过 450%)。如果掩码逻辑写错,会导致单步 TD Error 产生高达 4.5 的虚假梯度冲击,瞬间将 Critic 网络冲垮。

实践任务:唯一代码填空题

补齐向量化 TD(0) 目标。

规则:只能修改 TODO/______ 所在位置;不要删除断言或放宽误差。代码注释说明了每个边界条件。

Code
def td_target(reward, next_value, terminated, gamma):
    """标量版本;terminated 为 bool。"""
    # TODO:只补齐下面这个表达式。
    return ______

assert td_target(1., 5., False, .9) == 5.5
assert td_target(1., 5., True, .9) == 1.0

检查方法

运行本单元格;所有 assert 必须通过。另手工构造一个边界输入,解释预期结果。

提交时请给出:补齐后的代码、实际运行输出(环境不可用时注明“仅静态审查”)以及对失败用例的解释。

Q1

不要背定义:请从输入、状态变化和输出三个阶段解释“Monte Carlo、TD 与偏差—方差”的工作机制。

你的答案:

Q2

训练曲线突然高估所有终止前状态,首先检查哪个 mask?为什么?

你的答案:

Q3

稀疏奖励长轨迹中,你会先用 MC 还是 n-step TD?给出选择依据。

你的答案:

评分与通过规则

  • 代码 4 分:正常输入 2 分,边界输入 1 分,解释实现 1 分;
  • Q1~Q3 各 2 分;
  • 一票否决:结果碰巧正确但核心因果链错误、删除边界检查、把未运行结果说成实测。

需要提示时按四级机制请求:概念区域 → 具体方向 → 关键局部 → 完整答案。

参考答案(仅 answer 分支)

先完成题目再核对。即使代码一致,也要能解释关键步骤,并尝试更换一个输入规模。

Code
def td_target(reward, next_value, terminated, gamma):
    """标量版本;terminated 为 bool。"""
    # 参考实现:表达式直接对应上文不变量。
    return reward + gamma * (0.0 if terminated else next_value)

assert td_target(1., 5., False, .9) == 5.5
assert td_target(1., 5., True, .9) == 1.0

Q1 参考答案

  1. 输入阶段(交互四元组与表征提取):输入由智能体与环境交互的单步转移样本 (st,at,rt,st+1)(s_t, a_t, r_t, s_{t+1})、指示是否进入物理吸收态的终止掩码 terminated、以及超参数折扣因子 γ\gamma。价值网络(Critic)接收状态张量,前向推理生成当前状态估计 V̂(st)\hat{V}(s_t) 与后继状态估计 V̂(st+1)\hat{V}(s_{t+1})。

  2. 状态变化阶段(目标合成与时序差分收缩):

    • 自举目标合成:算法依据布尔掩码阻断终止态自举,合成单步目标值 yt=rt+γ(1−terminated)V̂(st+1)y_t = r_t + \gamma (1 - \text{terminated}) \hat{V}(s_{t+1})。相比蒙特卡洛(MC)必须累加完整轨迹所有未来随机动作的真实回报 Gt=∑γkrt+kG_t = \sum \gamma^k r_{t+k},TD(0) 将未来期望折现收敛至单点 V(st+1)V(s_{t+1});
    • 残差计算与半梯度更新:在对 yty_t 执行 detach() 阻断梯度的前提下,计算单步时序差分误差 δt=yt−V̂(st)\delta_t = y_t - \hat{V}(s_t)。优化器沿均方误差梯度方向执行更新:θ←θ+αδt∇V̂(st)\theta \leftarrow \theta + \alpha \delta_t \nabla \hat{V}(s_t),使当前预测向 Bellman 局部投影面逼近。
  3. 输出阶段(基线校准与方差控制):输出更新后的价值函数参数,以及无偏的即时 TD 误差标量 δt\delta_t。该标量既衡量了环境转移带来的“意外程度”,又作为策略梯度(Policy Gradient)的低方差优势代理基准。TD(0) 以轻微的初始网络估计偏差为代价,彻底消除了蒙特卡洛在长序列中由多步随机性复合累乘导致的巨大方差。

Q2 参考答案

必须首先严密排查 terminated 终止掩码(特别是 done 信号中物理终局与时限截断的解耦逻辑):

  1. 掩码漏阻断导致虚假自举:若环境在触发物理死亡或终局(如掉下悬崖、生命值归零、游戏结束)时,terminated 标志因命名混淆或逻辑反转被误判为 False,更新公式将变为 yt=rfail+γV̂(sdead)y_t = r_{\text{fail}} + \gamma \hat{V}(s_{\text{dead}})。

  2. 吸收态正向残差污染与逆向扩散:物理吸收态的未来真值严格为 0,但神经网络在未充分遍历的死亡状态上通常输出随机初始化的非零正值。一旦漏掉清零掩码,后继虚假正价值就会被乘以 γ\gamma 强行计入目标,使原本受到惩罚的危险状态获得极高的虚假正回报;

  3. Bellman 误差回流放大:由于时间差分递归特性,这种错误的目标高估会沿着历史轨迹一步步反向倒灌到死亡发生前的倒数第 1 步、倒数第 2 步直至整条轨迹,导致智能体彻底丧失对危险的敬畏,甚至主动寻求撞墙或自杀。

Q3 参考答案

在稀疏奖励的长轨迹任务中,工程首选是多步时间差分(nn-step TD,例如设置 n=16∼64n=16 \sim 64 或自适应 GAE),坚决不走纯 MC 或纯 TD(0) 的极端:

  1. 纯 TD(0) 的致命缺陷(信息传播极度迟缓):在长达 1000 步且仅末步给 +1 奖励的稀疏任务中,单步 TD(0) 每次迭代只能将非零信号向前传导 1 步。要将终点奖励传递给起点状态,算法至少需要完成上千次端到端样本采样与价值更新循环,在训练初期前序状态的 Critic 预测全为 0,Actor 策略梯度完全失活;

  2. 纯 MC 的致命缺陷(样本极度稀疏与方差爆炸):纯蒙特卡洛虽然能把末端奖励直接赋给历史所有决策步,但在极其稀疏的环境中,99.9% 的采样轨迹回报全为 0。极少数偶然成功的轨迹与海量失败轨迹混合,导致回报方差呈指数级放大,梯度剧烈震荡导致策略频繁发生灾难性遗忘;

  3. nn-step TD 的破局机制:nn-step TD 通过构造前向滑动窗口目标 yt(n)=∑k=0n−1γkrt+k+γnV(st+n)y_t^{(n)} = \sum_{k=0}^{n-1} \gamma^k r_{t+k} + \gamma^n V(s_{t+n}),以 nn 步为跨度成倍加速稀疏奖励向历史状态的逆向渗透,同时通过第 nn 步的价值自举截断后续长程不确定性,在奖励传播速度与梯度方差之间取得了最佳工程平衡点。

参考资料

资料用于建立事实基线;面试回答仍需用自己的语言组织。