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学完后你应能:比较 MC 与 TD(0),并实现带终止掩码的一步 TD 目标。
通过必须同时满足:
在强化学习中,评估状态价值函数 的核心方法分为两大学派:蒙特卡洛方法(Monte Carlo, MC)与时间差分方法(Temporal Difference, TD)。
它们解决的核心工程问题是样本效率(Sample Efficiency)、更新延迟与方差—偏差权衡(Variance-Bias Trade-off):
蒙特卡洛与时间差分单步更新流程如图 2-1 与图 2-2 所示:
图 2-1:蒙特卡洛全轨迹采样与时间差分单步自举机制对比
图 2-2:TD(0) 单步时序差分更新与闭环学习流程
detach()(半梯度 Semi-gradient 机制),参数更新公式为: 是驱动价值网络更新的学习信号,也表示“现实与期望的落差”。只有当 等于真实 时, 才是优势 的无偏估计。终止掩码反转与截断混淆(The Termination Bug): 在计算 TD 目标时,代码必须严格遵循 。常见灾难性 Bug 是将 Gym 返回的 truncated(超时)也当作 terminated 将价值置零,或者在布尔判断中漏掉取反逻辑。若智能体撞墙死亡时,漏掉了终止阻断,把 累加进目标值,会导致死亡惩罚被后继虚假的高估状态直接抹平,策略永远无法学会规避死亡。
全梯度反传破坏收敛性(The Full-gradient Pitfall): 在深度学习框架中,若没有对 施加 next_val.detach(),计算图的反向传播将会同时沿着 与 计算梯度。这相当于残差梯度(Residual Gradient)方法:它最小化的是 Bellman 残差而不是逼近 TD 不动点,在随机转移下会偏向错误解(需要对 双重采样才无偏),实践中通常学得更慢。标准做法是半梯度 TD。
POMDP 下的自举幻觉(Bootstrap Illusions in POMDP): TD 自举的理论基石是马尔可夫性: 必须完整包含评估未来价值所需的全部信息。当环境存在部分可观测性(POMDP)时,单个状态无法区分不同历史, 存在系统性认知扭曲,TD 自举会将这种扭曲以闭环形式无限放大;而 MC 由于直接基于全局终局结果验证,在弱 POMDP 场景下反而表现出更好的全局鲁棒性。
在线实时更新 vs 离线批处理: MC 必须常驻内存缓存全轨迹直到终止,无法支持持续流式交互;TD(0) 支持随步更新(Step-by-step),内存开销恒定为 ,对在线服务和实时边缘端强化学习极其友好。
方差—偏差的黄金分割点:-step TD 与 GAE:
假定当前转移观测为即时奖励 ,折现因子 ,价值网络对后继状态给出的预测为 :
场景 A(正常转移,terminated = False): 智能体认为未来充满希望,当前状态应当吸收后续的 4.5 分折现价值。
场景 B(达到物理终局,terminated = True): 物理世界在此刻终结,后续价值被严格截断归零。
对比可见,一个布尔标志位的翻转使目标相差 。如果掩码逻辑写错,每个终止转移都会带入 4.5 的目标误差,并经自举传播到前面的状态。
补齐向量化 TD(0) 目标。
规则:只能修改 TODO/______ 所在位置;不要删除断言或放宽误差。代码注释说明了每个边界条件。
运行本单元格;所有 assert 必须通过。另手工构造一个边界输入,解释预期结果。
提交时请给出:补齐后的代码、实际运行输出(环境不可用时注明“仅静态审查”)以及对失败用例的解释。
不要背定义:请从输入、状态变化和输出三个阶段解释“Monte Carlo、TD 与偏差—方差”的工作机制。
你的答案:
训练曲线突然高估所有终止前状态,首先检查哪个 mask?为什么?
你的答案:
稀疏奖励长轨迹中,你会先用 MC 还是 n-step TD?给出选择依据。
你的答案:
需要提示时按四级机制请求:概念区域 → 具体方向 → 关键局部 → 完整答案。
先完成题目再核对。即使代码一致,也要能解释关键步骤,并尝试更换一个输入规模。
输入阶段(交互四元组与表征提取):输入由智能体与环境交互的单步转移样本 、指示是否进入物理吸收态的终止掩码 terminated、以及超参数折扣因子 。价值网络(Critic)接收状态张量,前向推理生成当前状态估计 与后继状态估计 。
状态变化阶段(目标合成与时序差分收缩):
detach() 阻断梯度的前提下,计算单步时序差分误差 。优化器沿均方误差梯度方向执行更新:,使当前预测向 Bellman 局部投影面逼近。输出阶段(基线校准与方差控制):输出更新后的价值函数参数,以及即时 TD 误差标量 ( 不准确时它是有偏的优势估计)。该标量既衡量了环境转移带来的“意外程度”,又作为策略梯度(Policy Gradient)的低方差优势代理基准。TD(0) 以轻微的初始网络估计偏差为代价,消除了蒙特卡洛在长序列中由多步随机性复合累乘导致的巨大方差。
必须首先严密排查 terminated 终止掩码(特别是 done 信号中物理终局与时限截断的解耦逻辑):
掩码漏阻断导致虚假自举:若环境在触发物理死亡或终局(如掉下悬崖、生命值归零、游戏结束)时,terminated 标志因命名混淆或逻辑反转被误判为 False,更新公式将变为 。
吸收态正向残差污染与逆向扩散:物理吸收态的未来真值严格为 0,但神经网络在死亡状态上的输出通常不为 0,且可能偏高。一旦漏掉清零掩码,后继虚假正价值就会被乘以 强行计入目标,使原本受到惩罚的危险状态获得极高的虚假正回报;
Bellman 误差回流放大:由于时间差分递归特性,这种错误的目标高估会沿着历史轨迹一步步反向倒灌到死亡发生前的倒数第 1 步、倒数第 2 步直至整条轨迹,导致智能体丧失对危险的敬畏,甚至主动寻求撞墙或自杀。
在稀疏奖励的长轨迹任务中,通常先用 -step TD(如 )或 GAE,而不是纯 MC 或纯 TD(0):
纯 TD(0) 传播慢:1000 步、仅末步给 +1 的任务里,每轮更新只把非零信号向前推 1 步,前段状态的价值长期接近 0,策略梯度几乎没有信号;
纯 MC 方差大:末端奖励能直接赋给所有步,但成功轨迹很少,少数非零回报决定梯度,估计波动大,需要更多样本;
-step TD 的折中: 每次把信号推进 步,同时在第 步自举,截断后续的随机性,在传播速度与方差之间折中(详见第 4 节)。
资料用于建立事实基线;面试回答仍需用自己的语言组织。
---
title: "第 2 课:Monte Carlo、TD 与偏差—方差"
jupyter: python3
---
## 本课目标与完成标准
学完后你应能:比较 MC 与 TD(0),并实现带终止掩码的一步 TD 目标。
通过必须同时满足:
- 独立补齐本课唯一的代码填空题,并通过给定检查;
- 三个问答题均说明因果链,而不是只报术语;
- 能指出至少一个正确性边界和一个性能取舍;
- 总分不低于 8/10,且没有一票否决级概念错误。
## 前置关系
- 课程前置:Python、概率期望、基本深度学习
- 本课在路线中的作用:MC 等完整回报后监督价值;TD 用当前价值估计 bootstrap 下一状态,能在线更新。
## 核心心智模型
### 1. 它是什么,解决什么问题
在强化学习中,评估状态价值函数 $V(s)$ 的核心方法分为两大学派:**蒙特卡洛方法(Monte Carlo, MC)**与**时间差分方法(Temporal Difference, TD)**。
- **蒙特卡洛方法(MC)**是非自举(Non-bootstrapping)的代表:智能体必须完整运行完整个 Episode 达到终止状态,利用整条轨迹的真实未来折现回报之和 $G_t = \sum_{k=0}^{T-t-1} \gamma^k r_{t+k}$ 作为样本真值,通过监督回归更新价值网络;
- **时间差分方法(TD(0))**是自举(Bootstrapping)的代表:智能体仅需单步环境交互转移 $(s_t, a_t, r_t, s_{t+1})$,利用当前价值网络对后继状态的预测值 $V(s_{t+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),只要 $V(s_{t+1})$ 有误差,目标就带有偏差(**有偏差,Biased**);$V$ 等于真实 $V^\pi$ 时这一偏差消失。两者的数学统一催生了多步 TD($n$-step TD)与广义优势估计(GAE)。
### 2. 它如何工作
蒙特卡洛与时间差分单步更新流程如图 2-1 与图 2-2 所示:
1. **备份图结构对比(图 2-1)**:
```{=html}
<div class="fd fd-flow" role="img"><div class="fd-stack"><div class="fd-comp fd-td"><div class="fd-sg" data-nid="MC" data-depth="0"><div class="fd-sg-title">蒙特卡洛 (MC) 备份</div><div class="fd-stack"><div class="fd-comp fd-td"><div class="fd-rank"><div class="fd-node fd-box" data-nid="S_mc">状态 S_t</div></div><div class="fd-gap" style="--gl:44px;--gt:38px"></div><div class="fd-rank"><div class="fd-node fd-box" data-nid="A_mc">完整轨迹采样</div></div><div class="fd-gap" style="--gl:44px;--gt:38px"></div><div class="fd-rank"><div class="fd-node fd-box" data-nid="End_mc">终止状态 S_T (真实累计 G_t)</div></div></div></div></div></div><div class="fd-comp fd-td"><div class="fd-sg" data-nid="TD" data-depth="0"><div class="fd-sg-title">时间差分 (TD(0)) 备份</div><div class="fd-stack"><div class="fd-comp fd-td"><div class="fd-rank"><div class="fd-node fd-box" data-nid="S_td">状态 S_t</div></div><div class="fd-gap" style="--gl:44px;--gt:38px"></div><div class="fd-rank"><div class="fd-node fd-box" data-nid="A_td">一步转移</div></div><div class="fd-gap" style="--gl:44px;--gt:38px"></div><div class="fd-rank"><div class="fd-node fd-box" data-nid="S_next">引导自举 (Bootstrapping) R + γ V(S_{t+1})</div></div></div></div></div></div></div><i class="fd-e" data-s="S_mc" data-t="A_mc" data-k="solid" data-h="1" data-b="0"></i><i class="fd-e" data-s="A_mc" data-t="End_mc" data-k="solid" data-h="1" data-b="0"></i><i class="fd-e" data-s="S_td" data-t="A_td" data-k="solid" data-h="1" data-b="0"></i><i class="fd-e" data-s="A_td" data-t="S_next" data-k="solid" data-h="1" data-b="0"></i></div>
```
<p class="caption" align="center"><em>图 2-1:蒙特卡洛全轨迹采样与时间差分单步自举机制对比</em></p>
- 如图 2-1 所示,MC 的备份路径(Backup Path)必须垂直贯穿整个时间轴,从 $S_t$ 一路延伸至终止叶节点 $S_T$。任何在 Episode 中途发生更新的尝试都是不可能的;
- TD(0) 则在第 1 层决策步处将计算图截断:它将即时奖励 $r_t$ 与下一状态估计 $V(s_{t+1})$ 缝合,直接用“即时局部转移 + 下一状态价值预期”作为当前状态的监督信号。
2. **TD(0) 单步闭环更新动力学(图 2-2)**:
```{=html}
<div class="fd fd-flow" role="img"><div class="fd-stack"><div class="fd-comp fd-lr" data-minw="1083"><div class="fd-rank"><div class="fd-node fd-box" data-nid="State">输入当前状态 S_t</div></div><div class="fd-gap" style="--gl:44px;--gt:38px"></div><div class="fd-rank fd-few"><div class="fd-node fd-box" data-nid="Pred">价值网络预测 V(S_t)</div><div class="fd-node fd-box" data-nid="EnvStep">环境单步交互得到 R_{t+1}, S_{t+1}</div></div><div class="fd-gap" style="--gl:44px;--gt:38px"></div><div class="fd-rank fd-few"><div class="fd-node fd-box" data-nid="Target">计算 TD 目标: y = R_{t+1} + γ V(S_{t+1})</div><div class="fd-dummy" data-nid="~d0_2"></div></div><div class="fd-gap" style="--gl:44px;--gt:38px"></div><div class="fd-rank"><div class="fd-node fd-box" data-nid="Loss">TD 误差: δ = y - V(S_t)</div></div><div class="fd-gap" style="--gl:44px;--gt:38px"></div><div class="fd-rank"><div class="fd-node fd-box" data-nid="Grad">梯度反传更新网络权重: θ ← θ + α δ ∇V</div></div></div></div><i class="fd-e" data-s="State" data-t="Pred" data-k="solid" data-h="1" data-b="0"></i><i class="fd-e" data-s="State" data-t="EnvStep" data-k="solid" data-h="1" data-b="0"></i><i class="fd-e" data-s="EnvStep" data-t="Target" data-k="solid" data-h="1" data-b="0"></i><i class="fd-e" data-s="Pred" data-t="Loss" data-k="solid" data-h="1" data-b="0" data-via="~d0_2"></i><i class="fd-e" data-s="Target" data-t="Loss" data-k="solid" data-h="1" data-b="0"></i><i class="fd-e" data-s="Loss" data-t="Grad" data-k="solid" data-h="1" data-b="0"></i></div>
```
<p class="caption" align="center"><em>图 2-2:TD(0) 单步时序差分更新与闭环学习流程</em></p>
- **前向预测与单步观测**:输入当前状态 $s_t$,网络预测价值 $\hat{V}_\theta(s_t)$。环境执行动作后得到转移样本 $(s_t, a_t, r_t, s_{t+1}, \text{terminated})$;
- **构建 TD 目标(TD Target)**:
$$ y_t^{\text{TD}} = r_t + \gamma \cdot (1 - \text{terminated}) \cdot \hat{V}_{\theta^-}(s_{t+1}) $$
其中 $\text{terminated}$ 标志位在智能体进入环境物理终止态时严格为 1,阻断未来价值自举;
- **时序差分误差(TD Error)与半梯度反传**:
$$ \delta_t = y_t^{\text{TD}} - \hat{V}_\theta(s_t) $$
定义均方误差损失 $\mathcal{L}(\theta) = \frac{1}{2} (y_t^{\text{TD}} - \hat{V}_\theta(s_t))^2$。在反向传播中,目标项 $y_t^{\text{TD}}$ 必须执行 `detach()`(半梯度 Semi-gradient 机制),参数更新公式为:
$$ \theta \leftarrow \theta + \alpha \cdot \delta_t \cdot \nabla_\theta \hat{V}_\theta(s_t) $$
$\delta_t$ 是驱动价值网络更新的学习信号,也表示“现实与期望的落差”。只有当 $\hat{V}$ 等于真实 $V^\pi$ 时,$\delta_t$ 才是优势 $A^\pi(s_t, a_t)$ 的无偏估计。
### 3. 正确性条件与常见误区
- **终止掩码反转与截断混淆(The Termination Bug)**:
在计算 TD 目标时,代码必须严格遵循 $r + \gamma \cdot (1 - \text{terminated}) \cdot V(s')$。常见灾难性 Bug 是将 Gym 返回的 `truncated`(超时)也当作 `terminated` 将价值置零,或者在布尔判断中漏掉取反逻辑。若智能体撞墙死亡时,漏掉了终止阻断,把 $\gamma V(s_{\text{dead}})$ 累加进目标值,会导致死亡惩罚被后继虚假的高估状态直接抹平,策略永远无法学会规避死亡。
- **全梯度反传破坏收敛性(The Full-gradient Pitfall)**:
在深度学习框架中,若没有对 $y_t = r + \gamma V(s_{t+1})$ 施加 `next_val.detach()`,计算图的反向传播将会同时沿着 $\hat{V}(s_t)$ 与 $\hat{V}(s_{t+1})$ 计算梯度。这相当于残差梯度(Residual Gradient)方法:它最小化的是 Bellman 残差而不是逼近 TD 不动点,在随机转移下会偏向错误解(需要对 $s_{t+1}$ 双重采样才无偏),实践中通常学得更慢。标准做法是半梯度 TD。
- **POMDP 下的自举幻觉(Bootstrap Illusions in POMDP)**:
TD 自举的理论基石是马尔可夫性:$s_{t+1}$ 必须完整包含评估未来价值所需的全部信息。当环境存在部分可观测性(POMDP)时,单个状态无法区分不同历史,$V(s_{t+1})$ 存在系统性认知扭曲,TD 自举会将这种扭曲以闭环形式无限放大;而 MC 由于直接基于全局终局结果验证,在弱 POMDP 场景下反而表现出更好的全局鲁棒性。
### 4. 性能与工程取舍
- **在线实时更新 vs 离线批处理**:
MC 必须常驻内存缓存全轨迹直到终止,无法支持持续流式交互;TD(0) 支持随步更新(Step-by-step),内存开销恒定为 $O(1)$,对在线服务和实时边缘端强化学习极其友好。
- **方差—偏差的黄金分割点:$n$-step TD 与 GAE**:
- 单纯的 MC($n \to \infty$):偏差为 0,方差大,需要更多样本才能收敛;
- 单纯的 TD(0)($n = 1$):方差极小,但强依赖初始网络猜测,在稀疏奖励场景下信息反向传导极慢(每次更新仅向前推进 1 步);
- 工业界实践(如 PPO、IMPALA):几乎统一采用多步混合目标($n$-step TD 或 GAE($\lambda$)),利用衰减参数 $\lambda \in [0.9, 0.98]$ 对不同步数的 TD 目标做指数加权平滑,以极小的偏差代价换取方差的大幅骤降。
## 具体演示:单布尔值对 TD 目标的决定性影响
假定当前转移观测为即时奖励 $r = 1.0$,折现因子 $\gamma = 0.9$,价值网络对后继状态给出的预测为 $V(s') = 5.0$:
- **场景 A(正常转移,`terminated = False`)**:
$$ 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 + \gamma \cdot (1 - 1) \cdot V(s') = 1.0 + 0.9 \times 0.0 = 1.0 $$
物理世界在此刻终结,后续价值被严格截断归零。
对比可见,一个布尔标志位的翻转使目标相差 $5.5 - 1.0 = 4.5$。如果掩码逻辑写错,每个终止转移都会带入 4.5 的目标误差,并经自举传播到前面的状态。
## 实践任务:唯一代码填空题
补齐向量化 TD(0) 目标。
规则:只能修改 `TODO`/`______` 所在位置;不要删除断言或放宽误差。代码注释说明了每个边界条件。
```{python}
#| course_role: exercise
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 分;
- 一票否决:结果碰巧正确但核心因果链错误、删除边界检查、把未运行结果说成实测。
需要提示时按四级机制请求:概念区域 → 具体方向 → 关键局部 → 完整答案。
::: {.callout-tip collapse="true" title="💡 点击展开参考答案与详细代码实现" icon="false"}
## 参考答案(仅 answer 分支)
先完成题目再核对。即使代码一致,也要能解释关键步骤,并尝试更换一个输入规模。
```{python}
#| course_role: solution
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. **输入阶段(交互四元组与表征提取)**:输入由智能体与环境交互的单步转移样本 $(s_t, a_t, r_t, s_{t+1})$、指示是否进入物理吸收态的终止掩码 `terminated`、以及超参数折扣因子 $\gamma$。价值网络(Critic)接收状态张量,前向推理生成当前状态估计 $\hat{V}(s_t)$ 与后继状态估计 $\hat{V}(s_{t+1})$。
2. **状态变化阶段(目标合成与时序差分收缩)**:
- **自举目标合成**:算法依据布尔掩码阻断终止态自举,合成单步目标值 $y_t = r_t + \gamma (1 - \text{terminated}) \hat{V}(s_{t+1})$。相比蒙特卡洛(MC)必须累加完整轨迹所有未来随机动作的真实回报 $G_t = \sum \gamma^k r_{t+k}$,TD(0) 将未来期望折现收敛至单点 $V(s_{t+1})$;
- **残差计算与半梯度更新**:在对 $y_t$ 执行 `detach()` 阻断梯度的前提下,计算单步时序差分误差 $\delta_t = y_t - \hat{V}(s_t)$。优化器沿均方误差梯度方向执行更新:$\theta \leftarrow \theta + \alpha \delta_t \nabla \hat{V}(s_t)$,使当前预测向 Bellman 局部投影面逼近。
3. **输出阶段(基线校准与方差控制)**:输出更新后的价值函数参数,以及即时 TD 误差标量 $\delta_t$($\hat{V}$ 不准确时它是有偏的优势估计)。该标量既衡量了环境转移带来的“意外程度”,又作为策略梯度(Policy Gradient)的低方差优势代理基准。TD(0) 以轻微的初始网络估计偏差为代价,消除了蒙特卡洛在长序列中由多步随机性复合累乘导致的巨大方差。
### Q2 参考答案
必须首先严密排查 **`terminated` 终止掩码(特别是 `done` 信号中物理终局与时限截断的解耦逻辑)**:
1. **掩码漏阻断导致虚假自举**:若环境在触发物理死亡或终局(如掉下悬崖、生命值归零、游戏结束)时,`terminated` 标志因命名混淆或逻辑反转被误判为 `False`,更新公式将变为 $y_t = r_{\text{fail}} + \gamma \hat{V}(s_{\text{dead}})$。
2. **吸收态正向残差污染与逆向扩散**:物理吸收态的未来真值严格为 0,但神经网络在死亡状态上的输出通常不为 0,且可能偏高。一旦漏掉清零掩码,后继虚假正价值就会被乘以 $\gamma$ 强行计入目标,使原本受到惩罚的危险状态获得极高的虚假正回报;
3. **Bellman 误差回流放大**:由于时间差分递归特性,这种错误的目标高估会沿着历史轨迹一步步反向倒灌到死亡发生前的倒数第 1 步、倒数第 2 步直至整条轨迹,导致智能体丧失对危险的敬畏,甚至主动寻求撞墙或自杀。
### Q3 参考答案
在稀疏奖励的长轨迹任务中,通常先用 **$n$-step TD(如 $n = 16 \sim 64$)或 GAE**,而不是纯 MC 或纯 TD(0):
1. **纯 TD(0) 传播慢**:1000 步、仅末步给 +1 的任务里,每轮更新只把非零信号向前推 1 步,前段状态的价值长期接近 0,策略梯度几乎没有信号;
2. **纯 MC 方差大**:末端奖励能直接赋给所有步,但成功轨迹很少,少数非零回报决定梯度,估计波动大,需要更多样本;
3. **$n$-step TD 的折中**:$y_t^{(n)} = \sum_{k=0}^{n-1} \gamma^k r_{t+k} + \gamma^n V(s_{t+n})$ 每次把信号推进 $n$ 步,同时在第 $n$ 步自举,截断后续的随机性,在传播速度与方差之间折中(详见第 4 节)。
## 参考资料
- [GAE paper](https://arxiv.org/abs/1506.02438)
资料用于建立事实基线;面试回答仍需用自己的语言组织。
:::
::: {.course-pagination}
[**← 上一课**<br>第 1 课:MDP、回报与 Bellman ...](lesson01_mdp_return.qmd){.pagination-link .pagination-prev}
[**下一课 →**<br>第 3 课:策略梯度与基线](lesson03_policy_gradient.qmd){.pagination-link .pagination-next}
:::