Code
def dqn_target(reward, next_q_values, terminated, gamma):
"""next_q_values 是目标网络输出列表。"""
# TODO:只补齐下面这个表达式。
return ______
assert dqn_target(1., [2.,5.,4.], False, .9) == 5.5
assert dqn_target(1., [2.,5.,4.], True, .9) == 1.0学完后你应能:解释 DQN 三个稳定器并实现终止感知的 target-network 目标。
通过必须同时满足:
深度 Q 网络(Deep Q-Network, DQN)由 DeepMind 于 2015 年发表在《Nature》上,是强化学习历史上首次实现从原始高维像素输入端到端掌握 Atari 游戏人类级控制的里程碑算法。 在 DQN 诞生前,将深度神经网络引入非线性 Q-learning 一直面临着强化学习领域恶名昭彰的致命三要素(The Deadly Triad, Sutton & Barto):
函数近似(Function Approximation):使用深层非线性神经网络近似状态动作价值函数 ;
自举更新(Bootstrapping):目标值依赖于网络自身的当前预测 ;
离策略学习(Off-Policy Learning):用于参数更新的数据来自历史策略或探索策略(-greedy),与当前正在优化的确定性贪婪策略分布不一致。 当这三者同时存在时,时序差分更新不再满足压缩映射收敛保证,极易引发 Q 值估计的恶性自激震荡与指数级数值发散。
DQN 提出并确立了解决致命三要素的两大基石级工程稳定器:
DQN 与 Double DQN 的双网络解耦结构与更新时序如图 7-1 与图 7-2 所示:
图 7-1:DQN 经验回放缓冲与目标网络时间解耦架构
智能体根据在线网络 配合 -greedy 探索策略与环境交互,将单步转移五元组 存入经验池 。训练时从中均匀随机抽取 Mini-batch,消除相邻状态间的时序自相关性,大幅提升每个转移样本的重用率。
图 7-2:DQN 与 Double DQN 目标估计及网络参数同步执行流程
在标准 DQN 中,利用冻结的目标网络参数 构造 Bellman 最优目标: 根据简森不等式与统计极值特性,若各个动作的 Q 估值带有均值为 0 的无偏估计噪声 ,则 。 操作符会系统性选取噪声最大的那个动作,导致 Q 估值发生严重的系统性过估计(Maximization Bias)。
目标值计算图必须阻断反传(Stop-Gradient): 在计算 时,目标网络的前向计算必须严格脱离梯度图(with torch.no_grad(): 或 y.detach())。若允许梯度回传进目标网络,均方误差损失会退化为引导两套网络参数寻找同向漂移的病态平凡解(例如全输出常数),瓦解 Bellman 算子的收敛性。
终止状态自举掩码: 在计算目标值时,若环境进入物理终止态(terminated = True),后继价值必须严格截断置零()。如果漏乘 (1 - terminated),即使目标网络参数再稳定,终止态的高估残差也会反向污染全局价值曲面。
经验池分布偏移的合法性认知: 初学者常误以为“经验池中保存着几十万步以前由旧策略生成的劣质样本,会破坏当前训练”。事实上,Q-learning 是 Off-Policy 算法:在表格情形且经验覆盖充分时,任何行为策略采样的数据都可以用来逼近 Bellman 最优算子 的不动点。但在函数近似下,数据分布决定拟合误差落在哪里,过旧数据与当前策略访问的状态分布差距过大时仍会影响效果,这也是回放容量需要调节的原因。
优先经验回放(Prioritized Experience Replay, PER)的偏差代价: 标准 DQN 均匀采样经验池,导致智能体将大量计算算力浪费在那些早已掌握、TD Error 极小的简单样本上。PER 按照样本时序差分误差绝对值 赋予抽样优先级,极大加速了对稀有高价值样本的学习;但由于改变了状态采样的先验分布,引入了采样偏差,必须在反向传播时引入重要性采样权重 进行梯度纠偏,增加了数据结构维护复杂度(SumTree 树状数组)。
显存与内存架构优化(Frame Stacking Buffer): 在处理像素级状态时,通常需要将最近 4 帧图像堆叠作为单个时步状态输入卷积网络以捕捉运动速度。若每个转移样本都独立存储 与 两个 的 float32 张量,一百万容量的回放池约需 226 GB 内存(回放池通常放在 CPU 内存)。常见实现只在环形数组中以 uint8 存储单帧图片(约 7 GB),采样时根据索引偏移拼接出堆叠帧,内存约为前者的 1/32。
假设当前单步转移为:即时奖励 ,折扣因子 。目标网络对下一状态预测的 3 个候选离散动作 Q 值为 next_q_values = [2.0, 5.0, 4.0]:
terminated = False):
terminated = True):
对比可见,终止状态与非终止状态的目标真值产生高达 4.5 的落差,该目标将作为当前在线网络预测值 的强监督回归基准。
补齐 DQN 标量目标。
规则:只能修改 TODO/______ 所在位置;不要删除断言或放宽误差。代码注释说明了每个边界条件。
运行本单元格;所有 assert 必须通过。另手工构造一个边界输入,解释预期结果。
提交时请给出:补齐后的代码、实际运行输出(环境不可用时注明“仅静态审查”)以及对失败用例的解释。
不要背定义:请从输入、状态变化和输出三个阶段解释“DQN:回放、目标网络与过估计”的工作机制。
你的答案:
把 target network 也参与反向传播,会形成怎样的追逐目标?
你的答案:
稀有高价值样本适合 prioritized replay;它引入什么采样偏差?
你的答案:
需要提示时按四级机制请求:概念区域 → 具体方向 → 关键局部 → 完整答案。
先完成题目再核对。即使代码一致,也要能解释关键步骤,并尝试更换一个输入规模。
输入阶段(经验池随机抽样与特征提取):算法从大容量经验回放缓冲区(Replay Buffer)中均匀随机采样批次五元组数据 ,打破输入数据帧之间的时序马尔可夫相关性。在线 Q 网络与目标 Q 网络(冻结参数 )分别接收当前状态 与后继状态 。
状态变化阶段(解耦目标构建与误差反向回传):
stop_gradient(detach())的前提下,在线 Q 网络计算当前动作均方误差或平滑 Huber 损失 ,执行反向传播。目标网络 则定期执行硬同步(Hard Copy)或软滑动更新(Polyak Average)。输出阶段(平稳价值面与确定性贪婪策略):输出拟合收敛的高维动作价值函数 。在离线控制中直接提取最大价值对应的确定性动作 ,借助经验回放与目标网络缓解了非线性 Q-learning 容易出现的数值发散。
若让目标网络也参与反向传播(把 当作可导的计算图),优化的就不再是 TD 目标:
目标不再固定:半梯度更新把 当作给定标签。对 求导后,目标变成最小化 Bellman 残差 ,即残差梯度方法,目标网络的作用也随之消失;
梯度同时改动后继状态:梯度会把 也朝 推动,即用前一状态的估计去修改后继状态的价值,信息传播方向与 Bellman 备份相反;
随机环境中有偏且更慢:只有一个 样本时,Bellman 残差平方的期望多出一项由 随机性带来的方差,最小化它会偏向错误解(需要双重采样才无偏);实践中残差梯度通常收敛很慢。这也是 DQN 使用半梯度并冻结目标网络的原因。
优先经验回放(Prioritized Experience Replay, PER)根据样本的时序差分误差绝对值()提高困难样本的抽样概率,虽然显著加速了关键轨迹的学习,但不可避免地引入了非均匀采样分布偏差(Sampling Distribution Bias):
改变了期望积分的测度空间:标准 Q-learning 依赖于对真实经验状态分布的无偏期望 。PER 人为大幅拔高了高 TD Error 样本的抽样频次,压低了低误差样本,这相当于改变了损失函数的积分测度,使模型过度拟合异常噪声样本或不可预测的环境随机转移(Aleatoric Uncertainty);
系统性破坏 Bellman 期望收敛:若不对这种人为偏置进行校正,网络参数将持续向局部高方差状态倾斜,导致策略对常见平稳状态的价值估计发生系统性失真;
重要性采样权重(Importance Sampling Weights, ISW)纠偏: PER 必须通过重要性采样权重 对每个样本的反向传播梯度进行反比缩放(通常让退火参数 从 0.4 线性增长到 1.0)。被高频采样的样本获得较小的梯度更新权重,低频样本获得较大的权重补偿,在保证重点样本被优先访问的同时, 退火到 1 时期望梯度的偏差被完全校正(实现中通常还除以 做归一化)。
资料用于建立事实基线;面试回答仍需用自己的语言组织。
---
title: "第 7 课:DQN:回放、目标网络与过估计"
jupyter: python3
---
## 本课目标与完成标准
学完后你应能:解释 DQN 三个稳定器并实现终止感知的 target-network 目标。
通过必须同时满足:
- 独立补齐本课唯一的代码填空题,并通过给定检查;
- 三个问答题均说明因果链,而不是只报术语;
- 能指出至少一个正确性边界和一个性能取舍;
- 总分不低于 8/10,且没有一票否决级概念错误。
## 前置关系
- 课程前置:Python、概率期望、基本深度学习
- 本课在路线中的作用:DQN 用神经网络近似 Q,经验回放打破时序相关,目标网络减缓自举目标移动。
## 核心心智模型
### 1. 它是什么,解决什么问题
**深度 Q 网络(Deep Q-Network, DQN)**由 DeepMind 于 2015 年发表在《Nature》上,是强化学习历史上首次实现从原始高维像素输入端到端掌握 Atari 游戏人类级控制的里程碑算法。
在 DQN 诞生前,将深度神经网络引入非线性 Q-learning 一直面临着强化学习领域恶名昭彰的**致命三要素(The Deadly Triad, Sutton & Barto)**:
1. **函数近似(Function Approximation)**:使用深层非线性神经网络近似状态动作价值函数 $Q(s, a; \theta)$;
2. **自举更新(Bootstrapping)**:目标值依赖于网络自身的当前预测 $r + \gamma \max_{a'} Q(s', a')$;
3. **离策略学习(Off-Policy Learning)**:用于参数更新的数据来自历史策略或探索策略($\epsilon$-greedy),与当前正在优化的确定性贪婪策略分布不一致。
当这三者同时存在时,时序差分更新不再满足压缩映射收敛保证,极易引发 Q 值估计的恶性自激震荡与指数级数值发散。
DQN 提出并确立了解决致命三要素的两大基石级工程稳定器:
- **经验回放(Experience Replay Buffer)**:通过大容量环形队列打散时序关联,使批次样本近似独立同分布(I.I.D.);
- **独立目标网络(Target Network, $\theta^-$)**:将构造 Bellman 目标的网络参数与正在被梯度更新的在线网络解耦,打破“狗追自己尾巴”式的自激正反馈震荡。
### 2. 它如何工作
DQN 与 Double DQN 的双网络解耦结构与更新时序如图 7-1 与图 7-2 所示:
1. **经验回放采样与时序解耦(图 7-1)**:
```{=html}
<div class="fd fd-flow" role="img"><div class="fd-stack"><div class="fd-comp fd-td"><div class="fd-rank"><div class="fd-sg" data-nid="EnvInteraction" data-depth="0"><div class="fd-sg-title">环境采样流</div><div class="fd-stack"><div class="fd-comp fd-td"><div class="fd-rank"><div class="fd-node fd-box" data-nid="Step">(s, a, r, s', done)</div></div><div class="fd-gap" style="--gl:44px;--gt:38px"></div><div class="fd-rank"><div class="fd-node fd-box" data-nid="Buffer">经验回放缓冲区 (Replay Buffer)</div></div></div></div></div></div><div class="fd-gap" style="--gl:156px;--gt:53px"></div><div class="fd-rank"><div class="fd-sg" data-nid="QNetworks" data-depth="0"><div class="fd-sg-title">双网络解耦结构</div><div class="fd-stack"><div class="fd-comp fd-td"><div class="fd-rank"><div class="fd-node fd-box" data-nid="TrainQ">在线 Q 网络 Q(s, a; θ)</div></div><div class="fd-gap" style="--gl:163px;--gt:53px"></div><div class="fd-rank fd-few"><div class="fd-node fd-box" data-nid="TargetQ">目标 Q 网络 Q(s', a'; θ^-)</div><div class="fd-dummy" data-nid="~d0_1"></div></div><div class="fd-gap" style="--gl:104px;--gt:53px"></div><div class="fd-rank"><div class="fd-node fd-box" data-nid="Loss">Bellman 均方差损失</div></div></div></div></div></div></div></div><i class="fd-e" data-s="Step" data-t="Buffer" data-k="solid" data-h="1" data-b="0"></i><i class="fd-e" data-s="Buffer" data-t="TrainQ" data-k="solid" data-h="1" data-b="0">均匀随机采样 Batch</i><i class="fd-e" data-s="Buffer" data-t="TargetQ" data-k="solid" data-h="1" data-b="0"></i><i class="fd-e" data-s="TargetQ" data-t="Loss" data-k="solid" data-h="1" data-b="0">计算目标 y</i><i class="fd-e" data-s="TrainQ" data-t="Loss" data-k="solid" data-h="1" data-b="0" data-via="~d0_1">预测 Q 值</i><i class="fd-e" data-s="TrainQ" data-t="TargetQ" data-k="dash" data-h="1" data-b="0">定期同步参数 θ^- = θ</i></div>
```
<p class="caption" align="center"><em>图 7-1:DQN 经验回放缓冲与目标网络时间解耦架构</em></p>
智能体根据在线网络 $\theta$ 配合 $\epsilon$-greedy 探索策略与环境交互,将单步转移五元组 $(s_t, a_t, r_t, s_{t+1}, \text{terminated})$ 存入经验池 $\mathcal{D}$。训练时从中均匀随机抽取 Mini-batch,消除相邻状态间的时序自相关性,大幅提升每个转移样本的重用率。
2. **标准 DQN 目标构建与最大化过估计缺陷(图 7-2)**:
```{=html}
<div class="fd fd-flow" role="img"><div class="fd-stack"><div class="fd-comp fd-lr" data-minw="1363"><div class="fd-rank"><div class="fd-node fd-box" data-nid="Sample">从 Replay Buffer 采样 (s, a, r, s', d)</div></div><div class="fd-gap" style="--gl:44px;--gt:38px"></div><div class="fd-rank"><div class="fd-node fd-dec" data-nid="DoubleDQN">是否使用 Double DQN?</div></div><div class="fd-gap" style="--gl:58px;--gt:53px"></div><div class="fd-rank fd-few"><div class="fd-node fd-box" data-nid="Decouple">在线网络选动作 a* = argmax Q(s', .; θ) ➔ 目标网络算价值 Q(s', a*; θ^-)</div><div class="fd-node fd-box" data-nid="Standard">目标网络直接计算 max Q(s', .; θ^-) [存在过估计]</div></div><div class="fd-gap" style="--gl:44px;--gt:38px"></div><div class="fd-rank"><div class="fd-node fd-box" data-nid="ComputeLoss">计算 Huber/MSE 损失并执行反向传播</div></div><div class="fd-gap" style="--gl:44px;--gt:38px"></div><div class="fd-rank"><div class="fd-node fd-dec" data-nid="Sync">达到 target_update 步数?</div></div><div class="fd-gap" style="--gl:58px;--gt:53px"></div><div class="fd-rank"><div class="fd-node fd-box" data-nid="SoftSync">更新目标网络权重 θ^-</div></div></div></div><i class="fd-e" data-s="Sample" data-t="DoubleDQN" data-k="solid" data-h="1" data-b="0"></i><i class="fd-e" data-s="DoubleDQN" data-t="Decouple" data-k="solid" data-h="1" data-b="0">是</i><i class="fd-e" data-s="DoubleDQN" data-t="Standard" data-k="solid" data-h="1" data-b="0">否</i><i class="fd-e" data-s="Decouple" data-t="ComputeLoss" data-k="solid" data-h="1" data-b="0"></i><i class="fd-e" data-s="Standard" data-t="ComputeLoss" data-k="solid" data-h="1" data-b="0"></i><i class="fd-e" data-s="ComputeLoss" data-t="Sync" data-k="solid" data-h="1" data-b="0"></i><i class="fd-e" data-s="Sync" data-t="SoftSync" data-k="solid" data-h="1" data-b="0">是</i></div>
```
<p class="caption" align="center"><em>图 7-2:DQN 与 Double DQN 目标估计及网络参数同步执行流程</em></p>
在标准 DQN 中,利用冻结的目标网络参数 $\theta^-$ 构造 Bellman 最优目标:
$$ y_t^{\text{DQN}} = r_t + \gamma (1 - \text{terminated}_t) \max_{a' \in \mathcal{A}} Q(s_{t+1}, a'; \theta^-) $$
根据简森不等式与统计极值特性,若各个动作的 Q 估值带有均值为 0 的无偏估计噪声 $\epsilon_a$,则 $\mathbb{E}[\max_a (Q^*(s, a) + \epsilon_a)] \ge \max_a Q^*(s, a)$。$\max$ 操作符会系统性选取噪声最大的那个动作,导致 **Q 估值发生严重的系统性过估计(Maximization Bias)**。
3. **Double DQN 的动作选择与价值评估解耦机制(图 7-2)**:
Double DQN(Van Hasselt 等, 2015)巧妙地通过双网络分工化解了最大化偏差:
- 第一步(选择动作):使用正在频繁更新的**在线网络 $\theta$** 寻找使 Q 值最大的候选动作:$a^* = \arg\max_{a'} Q(s_{t+1}, a'; \theta)$;
- 第二步(评估价值):使用相对冻结稳定的**目标网络 $\theta^-$** 计算该候选动作的实际折现价值:
$$ y_t^{\text{DoubleDQN}} = r_t + \gamma (1 - \text{terminated}_t) Q(s_{t+1}, a^*; \theta^-) $$
选择与评估由不同网络完成,降低了取最大值带来的虚高偏差。由于目标网络是在线网络的滞后副本,两者误差并不完全独立,Double DQN 只能减小、不能完全消除最大化偏差。
4. **参数同步策略**:
在线网络计算 Huber Loss 或 MSE 损失后进行反向传播更新 $\theta$。目标网络 $\theta^-$ 采用两种同步方案:
- 硬同步(Hard Update):每隔 $C$ 个训练步,将在线参数一次性拷贝给目标网络($\theta^- \leftarrow \theta$);
- 软同步(Polyak Update):每步进行微小滑动平均更新:$\theta^- \leftarrow \tau \theta + (1 - \tau) \theta^-$(通常 $\tau = 0.005$)。
### 3. 正确性条件与常见误区
- **目标值计算图必须阻断反传(Stop-Gradient)**:
在计算 $y_t$ 时,目标网络的前向计算**必须严格脱离梯度图(`with torch.no_grad():` 或 `y.detach()`)**。若允许梯度回传进目标网络,均方误差损失会退化为引导两套网络参数寻找同向漂移的病态平凡解(例如全输出常数),瓦解 Bellman 算子的收敛性。
- **终止状态自举掩码**:
在计算目标值时,若环境进入物理终止态(`terminated = True`),后继价值必须严格截断置零($y_t = r_t$)。如果漏乘 `(1 - terminated)`,即使目标网络参数再稳定,终止态的高估残差也会反向污染全局价值曲面。
- **经验池分布偏移的合法性认知**:
初学者常误以为“经验池中保存着几十万步以前由旧策略生成的劣质样本,会破坏当前训练”。事实上,Q-learning 是 Off-Policy 算法:在表格情形且经验覆盖充分时,任何行为策略采样的数据都可以用来逼近 Bellman 最优算子 $\mathcal{T}^* Q$ 的不动点。但在函数近似下,数据分布决定拟合误差落在哪里,过旧数据与当前策略访问的状态分布差距过大时仍会影响效果,这也是回放容量需要调节的原因。
### 4. 性能与工程取舍
- **优先经验回放(Prioritized Experience Replay, PER)的偏差代价**:
标准 DQN 均匀采样经验池,导致智能体将大量计算算力浪费在那些早已掌握、TD Error 极小的简单样本上。PER 按照样本时序差分误差绝对值 $|\delta_i|^\alpha$ 赋予抽样优先级,极大加速了对稀有高价值样本的学习;但由于改变了状态采样的先验分布,引入了采样偏差,必须在反向传播时引入重要性采样权重 $w_i = (N \cdot P(i))^{-\beta}$ 进行梯度纠偏,增加了数据结构维护复杂度(SumTree 树状数组)。
- **显存与内存架构优化(Frame Stacking Buffer)**:
在处理像素级状态时,通常需要将最近 4 帧图像堆叠作为单个时步状态输入卷积网络以捕捉运动速度。若每个转移样本都独立存储 $s$ 与 $s'$ 两个 $4 \times 84 \times 84$ 的 float32 张量,一百万容量的回放池约需 226 GB 内存(回放池通常放在 CPU 内存)。常见实现只在环形数组中以 `uint8` 存储单帧图片(约 7 GB),采样时根据索引偏移拼接出堆叠帧,内存约为前者的 1/32。
## 具体演示:DQN 目标值构建数值演算
假设当前单步转移为:即时奖励 $r = 1.0$,折扣因子 $\gamma = 0.9$。目标网络对下一状态预测的 3 个候选离散动作 Q 值为 `next_q_values = [2.0, 5.0, 4.0]`:
- **场景 1(正常未终止转移,`terminated = False`)**:
- 贪婪动作取值:$\max_{a'} Q(s', a'; \theta^-) = \max([2.0, 5.0, 4.0]) = 5.0$;
- 构造 Bellman 最优目标:$y = r + \gamma \times 5.0 = 1.0 + 0.9 \times 5.0 = 5.5$;
- **场景 2(智能体遭遇物理死亡/通关,`terminated = True`)**:
- 终止掩码生效,后继期望被强制截断归零:$y = r + \gamma \times 0.0 = 1.0$。
对比可见,终止状态与非终止状态的目标真值产生高达 4.5 的落差,该目标将作为当前在线网络预测值 $Q(s, a; \theta)$ 的强监督回归基准。
## 实践任务:唯一代码填空题
补齐 DQN 标量目标。
规则:只能修改 `TODO`/`______` 所在位置;不要删除断言或放宽误差。代码注释说明了每个边界条件。
```{python}
#| course_role: exercise
def dqn_target(reward, next_q_values, terminated, gamma):
"""next_q_values 是目标网络输出列表。"""
# TODO:只补齐下面这个表达式。
return ______
assert dqn_target(1., [2.,5.,4.], False, .9) == 5.5
assert dqn_target(1., [2.,5.,4.], True, .9) == 1.0
```
### 检查方法
运行本单元格;所有 `assert` 必须通过。另手工构造一个边界输入,解释预期结果。
提交时请给出:补齐后的代码、实际运行输出(环境不可用时注明“仅静态审查”)以及对失败用例的解释。
### Q1
不要背定义:请从输入、状态变化和输出三个阶段解释“DQN:回放、目标网络与过估计”的工作机制。
**你的答案:**
### Q2
把 target network 也参与反向传播,会形成怎样的追逐目标?
**你的答案:**
### Q3
稀有高价值样本适合 prioritized replay;它引入什么采样偏差?
**你的答案:**
## 评分与通过规则
- 代码 4 分:正常输入 2 分,边界输入 1 分,解释实现 1 分;
- Q1~Q3 各 2 分;
- 一票否决:结果碰巧正确但核心因果链错误、删除边界检查、把未运行结果说成实测。
需要提示时按四级机制请求:概念区域 → 具体方向 → 关键局部 → 完整答案。
::: {.callout-tip collapse="true" title="💡 点击展开参考答案与详细代码实现" icon="false"}
## 参考答案(仅 answer 分支)
先完成题目再核对。即使代码一致,也要能解释关键步骤,并尝试更换一个输入规模。
```{python}
#| course_role: solution
def dqn_target(reward, next_q_values, terminated, gamma):
"""next_q_values 是目标网络输出列表。"""
# 参考实现:表达式直接对应上文不变量。
return reward if terminated else reward + gamma * max(next_q_values)
assert dqn_target(1., [2.,5.,4.], False, .9) == 5.5
assert dqn_target(1., [2.,5.,4.], True, .9) == 1.0
```
### Q1 参考答案
1. **输入阶段(经验池随机抽样与特征提取)**:算法从大容量经验回放缓冲区(Replay Buffer)中均匀随机采样批次五元组数据 $(s_t, a_t, r_t, s_{t+1}, \text{terminated})$,打破输入数据帧之间的时序马尔可夫相关性。在线 Q 网络与目标 Q 网络(冻结参数 $\theta^-$)分别接收当前状态 $s_t$ 与后继状态 $s_{t+1}$。
2. **状态变化阶段(解耦目标构建与误差反向回传)**:
- **最优目标合成**:利用目标网络计算下一状态所有动作的 Q 估值,并结合终止掩码生成 Bellman 最优目标 $y_t = r_t + \gamma (1 - \text{terminated}) \max_{a'} Q(s_{t+1}, a'; \theta^-)$(在 Double DQN 中则由在线网络选动作、目标网络估价值);
- **梯度反传与动量同步**:在对 $y_t$ 执行 `stop_gradient`(`detach()`)的前提下,在线 Q 网络计算当前动作均方误差或平滑 Huber 损失 $\mathcal{L}(\theta) = \frac{1}{B} \sum (y_t - Q(s_t, a_t; \theta))^2$,执行反向传播。目标网络 $\theta^-$ 则定期执行硬同步(Hard Copy)或软滑动更新(Polyak Average)。
3. **输出阶段(平稳价值面与确定性贪婪策略)**:输出拟合收敛的高维动作价值函数 $Q(s, a; \theta)$。在离线控制中直接提取最大价值对应的确定性动作 $a^* = \arg\max_a Q(s, a)$,借助经验回放与目标网络缓解了非线性 Q-learning 容易出现的数值发散。
### Q2 参考答案
若让目标网络也参与反向传播(把 $y_t = r_t + \gamma \max_{a'} Q(s', a'; \theta)$ 当作可导的计算图),优化的就不再是 TD 目标:
1. **目标不再固定**:半梯度更新把 $y_t$ 当作给定标签。对 $y_t$ 求导后,目标变成最小化 Bellman 残差 $(Q(s, a; \theta) - r - \gamma \max_{a'} Q(s', a'; \theta))^2$,即残差梯度方法,目标网络的作用也随之消失;
2. **梯度同时改动后继状态**:梯度会把 $\gamma Q(s', a')$ 也朝 $Q(s, a) - r$ 推动,即用前一状态的估计去修改后继状态的价值,信息传播方向与 Bellman 备份相反;
3. **随机环境中有偏且更慢**:只有一个 $s'$ 样本时,Bellman 残差平方的期望多出一项由 $s'$ 随机性带来的方差,最小化它会偏向错误解(需要双重采样才无偏);实践中残差梯度通常收敛很慢。这也是 DQN 使用半梯度并冻结目标网络的原因。
### Q3 参考答案
优先经验回放(Prioritized Experience Replay, PER)根据样本的时序差分误差绝对值($P(i) \propto |\delta_i|^\alpha$)提高困难样本的抽样概率,虽然显著加速了关键轨迹的学习,但不可避免地引入了**非均匀采样分布偏差(Sampling Distribution Bias)**:
1. **改变了期望积分的测度空间**:标准 Q-learning 依赖于对真实经验状态分布的无偏期望 $\mathbb{E}_{(s,a,r,s') \sim \mathcal{D}} [(y - Q)^2]$。PER 人为大幅拔高了高 TD Error 样本的抽样频次,压低了低误差样本,这相当于改变了损失函数的积分测度,使模型过度拟合异常噪声样本或不可预测的环境随机转移(Aleatoric Uncertainty);
2. **系统性破坏 Bellman 期望收敛**:若不对这种人为偏置进行校正,网络参数将持续向局部高方差状态倾斜,导致策略对常见平稳状态的价值估计发生系统性失真;
3. **重要性采样权重(Importance Sampling Weights, ISW)纠偏**:
PER 必须通过重要性采样权重 $w_i = \left( \frac{1}{N} \cdot \frac{1}{P(i)} \right)^\beta$ 对每个样本的反向传播梯度进行反比缩放(通常让退火参数 $\beta$ 从 0.4 线性增长到 1.0)。被高频采样的样本获得较小的梯度更新权重,低频样本获得较大的权重补偿,在保证重点样本被优先访问的同时,$\beta$ 退火到 1 时期望梯度的偏差被完全校正(实现中通常还除以 $\max_i w_i$ 做归一化)。
## 参考资料
- [DQN paper](https://www.nature.com/articles/nature14236)
资料用于建立事实基线;面试回答仍需用自己的语言组织。
:::
::: {.course-pagination}
[**← 上一课**<br>第 6 课:价值损失、熵与多目标优化](lesson06_value_entropy.qmd){.pagination-link .pagination-prev}
[**下一课 →**<br>第 8 课:SAC](lesson08_sac.qmd){.pagination-link .pagination-next}
:::