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 课:Monte Carlo、TD 与偏差—方差
参考答案版:包含完整代码实现与问答题深度参考解析。建议先独立完成练习题后再展开核对。
本课目标与完成标准
学完后你应能:比较 MC 与 TD(0),并实现带终止掩码的一步 TD 目标。
通过必须同时满足:
- 独立补齐本课唯一的代码填空题,并通过给定检查;
- 三个问答题均说明因果链,而不是只报术语;
- 能指出至少一个正确性边界和一个性能取舍;
- 总分不低于 8/10,且没有一票否决级概念错误。
前置关系
- 课程前置:Python、概率期望、基本深度学习
- 本课在路线中的作用:MC 等完整回报后监督价值;TD 用当前价值估计 bootstrap 下一状态,能在线更新。
核心心智模型
1. 它是什么,解决什么问题
在强化学习中,评估状态价值函数 的核心方法分为两大学派:蒙特卡洛方法(Monte Carlo, MC)与时间差分方法(Temporal Difference, TD)。
- 蒙特卡洛方法(MC)是非自举(Non-bootstrapping)的代表:智能体必须完整运行完整个 Episode 达到终止状态,利用整条轨迹的真实未来折现回报之和 作为样本真值,通过监督回归更新价值网络;
- 时间差分方法(TD(0))是自举(Bootstrapping)的代表:智能体仅需单步环境交互转移 ,利用当前价值网络对后继状态的预测值 构建即时更新目标 ,实现完全在线(Online)与流式更新。
它们解决的核心工程问题是样本效率(Sample Efficiency)、更新延迟与方差—偏差权衡(Variance-Bias Trade-off):
- 蒙特卡洛方法直接采样真实自然回报,其期望严格收敛于真实期望价值(无偏差,Zero Bias),但由于一条长轨迹中每一步的动作探索与环境转移随机性会累乘叠加,导致样本方差极其巨大(高方差,High Variance),且无法在未完结的长任务中实时更新;
- TD(0) 仅仅引入了单步转移的即时奖励随机性,方差极小(低方差,Low Variance),但由于用自身未收敛的网络预测值去更新自身(Bootstrapping),必然引入严重的结构性偏差(有偏差,Biased)。两者的数学统一催生了多步 TD(-step TD)与广义优势估计(GAE)。
2. 它如何工作
蒙特卡洛与时间差分单步更新流程如图 2-1 与图 2-2 所示:
- 备份图结构对比(图 2-1):
图 2-1:蒙特卡洛全轨迹采样与时间差分单步自举机制对比
- 如图 2-1 所示,MC 的备份路径(Backup Path)必须垂直贯穿整个时间轴,从 一路延伸至终止叶节点 。任何在 Episode 中途发生更新的尝试都是不可能的;
- TD(0) 则在第 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) 单步时序差分更新与闭环学习流程
- 前向预测与单步观测:输入当前状态 ,网络预测价值 。环境执行动作后返回四元组 ;
- 构建 TD 目标(TD Target): 其中 标志位在智能体进入环境物理终止态时严格为 1,阻断未来价值自举;
- 时序差分误差(TD Error)与半梯度反传: 定义均方误差损失 。在反向传播中,目标项 必须执行
detach()(半梯度 Semi-gradient 机制),参数更新公式为: 既是驱动价值网络更新的无偏学习信号,也是表征“现实与期望落差”的核心惊喜度指标。
3. 正确性条件与常见误区
终止掩码反转与截断混淆(The Termination Bug): 在计算 TD 目标时,代码必须严格遵循 。常见灾难性 Bug 是将 Gym 返回的
truncated(超时)也当作terminated将价值置零,或者在布尔判断中漏掉取反逻辑。若智能体撞墙死亡时,漏掉了终止阻断,把 累加进目标值,会导致死亡惩罚被后继虚假的高估状态直接抹平,策略永远无法学会规避死亡。全梯度反传破坏收敛性(The Full-gradient Pitfall): 在深度学习框架中,若没有对 施加
next_val.detach(),计算图的反向传播将会同时沿着 与 计算梯度。这违反了 Bellman 压缩映射理论前提,使得目标网络随当前网络同步漂移,引发神经网络参数的自激震荡与非线性发散。POMDP 下的自举幻觉(Bootstrap Illusions in POMDP): TD 自举的理论基石是马尔可夫性: 必须完整包含评估未来价值所需的全部信息。当环境存在部分可观测性(POMDP)时,单个状态无法区分不同历史, 存在系统性认知扭曲,TD 自举会将这种扭曲以闭环形式无限放大;而 MC 由于直接基于全局终局结果验证,在弱 POMDP 场景下反而表现出更好的全局鲁棒性。
4. 性能与工程取舍
在线实时更新 vs 离线批处理: MC 必须常驻内存缓存全轨迹直到终止,无法支持持续流式交互;TD(0) 支持随步更新(Step-by-step),内存开销恒定为 ,对在线服务和实时边缘端强化学习极其友好。
方差—偏差的黄金分割点:-step TD 与 GAE:
- 单纯的 MC():偏差为 0,方差极大,需数万倍样本量方能收敛;
- 单纯的 TD(0)():方差极小,但强依赖初始网络猜测,在稀疏奖励场景下信息反向传导极慢(每次更新仅向前推进 1 步);
- 工业界实践(如 PPO、IMPALA):几乎统一采用多步混合目标(-step TD 或 GAE()),利用衰减参数 对不同步数的 TD 目标做指数加权平滑,以极小的偏差代价换取方差的大幅骤降。
具体演示:单布尔值对 TD 目标的决定性影响
假定当前转移观测为即时奖励 ,折现因子 ,价值网络对后继状态给出的预测为 :
场景 A(正常转移,
terminated = False): 智能体认为未来充满希望,当前状态应当吸收后续的 4.5 分折现价值。场景 B(达到物理终局,
terminated = True): 物理世界在此刻终结,后续价值被严格截断归零。
对比可见,仅一个布尔标志位的翻转,计算出的目标真值差距高达 (相差超过 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 分;
- 一票否决:结果碰巧正确但核心因果链错误、删除边界检查、把未运行结果说成实测。
需要提示时按四级机制请求:概念区域 → 具体方向 → 关键局部 → 完整答案。