第 7 课:DQN:回放、目标网络与过估计

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

本课目标与完成标准

学完后你应能:解释 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;θ)Q(s, a; \theta);

  2. 自举更新(Bootstrapping):目标值依赖于网络自身的当前预测 r+γmax⁡a′Q(s′,a′)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):

flowchart TD
    subgraph EnvInteraction["环境采样流"]
        Step["(s, a, r, s', done)"] --> Buffer["经验回放缓冲区 (Replay Buffer)"]
    end
    subgraph QNetworks["双网络解耦结构"]
        Buffer -->|均匀随机采样 Batch| TrainQ["在线 Q 网络 Q(s, a; θ)"]
        Buffer --> TargetQ["目标 Q 网络 Q(s', a'; θ^-)"]
        TargetQ -->|计算目标 y| Loss["Bellman 均方差损失"]
        TrainQ -->|预测 Q 值| Loss
    end
    TrainQ -.->|定期同步参数 θ^- = θ| TargetQ

图 7-1:DQN 经验回放缓冲与目标网络时间解耦架构

智能体根据在线网络 θ\theta 配合 ϵ\epsilon-greedy 探索策略与环境交互,将单步转移五元组 (st,at,rt,st+1,terminated)(s_t, a_t, r_t, s_{t+1}, \text{terminated}) 存入经验池 𝒟\mathcal{D}。训练时从中均匀随机抽取 Mini-batch,彻底消除相邻状态间的时序自相关性,大幅提升每个转移样本的重用率。

  1. 标准 DQN 目标构建与最大化过估计缺陷(图 7-2):

flowchart LR
    Sample["从 Replay Buffer 采样 (s, a, r, s', d)"] --> DoubleDQN{"是否使用 Double DQN?"}
    DoubleDQN -->|是| Decouple["在线网络选动作 a* = argmax Q(s', .; θ) ➔ 目标网络算价值 Q(s', a*; θ^-)"]
    DoubleDQN -->|否| Standard["目标网络直接计算 max Q(s', .; θ^-) [存在过估计]"]
    Decouple & Standard --> ComputeLoss["计算 Huber/MSE 损失并执行反向传播"]
    ComputeLoss --> Sync{"达到 target_update 步数?"}
    Sync -->|是| SoftSync["更新目标网络权重 θ^-"]

图 7-2:DQN 与 Double DQN 目标估计及网络参数同步执行流程

在标准 DQN 中,利用冻结的目标网络参数 θ−\theta^- 构造 Bellman 最优目标: ytDQN=rt+γ(1−terminatedt)maxa′∈𝒜Q(st+1,a′;θ−) y_t^{\text{DQN}} = r_t + \gamma (1 - \text{terminated}_t) \max_{a' \in \mathcal{A}} Q(s_{t+1}, a'; \theta^-) 根据简森不等式与统计极值特性,若各个动作的 Q 估值带有均值为 0 的无偏估计噪声 ϵa\epsilon_a,则 𝔼[max⁡a(Q*(s,a)+ϵa)]≥max⁡aQ*(s,a)\mathbb{E}[\max_a (Q^*(s, a) + \epsilon_a)] \ge \max_a Q^*(s, a)。max\max 操作符会系统性选取噪声最大的那个动作,导致 Q 估值发生严重的系统性过估计(Maximization Bias)。

  1. Double DQN 的动作选择与价值评估解耦机制(图 7-2): Double DQN(Van Hasselt 等, 2015)巧妙地通过双网络分工化解了最大化偏差:
    • 第一步(选择动作):使用正在频繁更新的在线网络 θ\theta 寻找使 Q 值最大的候选动作:a*=arg⁡max⁡a′Q(st+1,a′;θ)a^* = \arg\max_{a'} Q(s_{t+1}, a'; \theta);
    • 第二步(评估价值):使用相对冻结稳定的目标网络 θ−\theta^- 计算该候选动作的实际折现价值: ytDoubleDQN=rt+γ(1−terminatedt)Q(st+1,a*;θ−) y_t^{\text{DoubleDQN}} = r_t + \gamma (1 - \text{terminated}_t) Q(s_{t+1}, a^*; \theta^-) 由于在线网络选出的动作与目标网络的评估噪声统计独立,彻底消除了由于单网络取最大值带来的虚高偏差。
  2. 参数同步策略: 在线网络计算 Huber Loss 或 MSE 损失后进行反向传播更新 θ\theta。目标网络 θ−\theta^- 采用两种同步方案:
    • 硬同步(Hard Update):每隔 CC 个训练步,将在线参数一次性拷贝给目标网络(θ−←θ\theta^- \leftarrow \theta);
    • 软同步(Polyak Update):每步进行微小滑动平均更新:θ−←τθ+(1−τ)θ−\theta^- \leftarrow \tau \theta + (1 - \tau) \theta^-(通常 τ=0.005\tau = 0.005)。

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

  • 目标值计算图必须阻断反传(Stop-Gradient): 在计算 yty_t 时,目标网络的前向计算必须严格脱离梯度图(with torch.no_grad(): 或 y.detach())。若允许梯度回传进目标网络,均方误差损失会退化为引导两套网络参数寻找同向漂移的病态平凡解(例如全输出常数),彻底瓦解 Bellman 算子的收敛性。

  • 终止状态自举掩码: 在计算目标值时,若环境进入物理终止态(terminated = True),后继价值必须严格截断置零(yt=rty_t = r_t)。如果漏乘 (1 - terminated),即使目标网络参数再稳定,终止态的高估残差也会反向污染全局价值曲面。

  • 经验池分布偏移的合法性认知: 初学者常误以为“经验池中保存着几十万步以前由旧策略生成的劣质样本,会破坏当前训练”。事实上,Q-learning 是纯粹的 Off-Policy 算法,只要经验池覆盖的状态动作空间满足充分探索假设,任何历史行为策略采样的数据在数学上都能无偏地逼近 Bellman 最优算子 𝒯*Q\mathcal{T}^* Q 的不动点。

4. 性能与工程取舍

  • 优先经验回放(Prioritized Experience Replay, PER)的偏差代价: 标准 DQN 均匀采样经验池,导致智能体将大量计算算力浪费在那些早已掌握、TD Error 极小的简单样本上。PER 按照样本时序差分误差绝对值 |δi|α|\delta_i|^\alpha 赋予抽样优先级,极大加速了对稀有高价值样本的学习;但由于改变了状态采样的先验分布,引入了采样偏差,必须在反向传播时引入重要性采样权重 wi=(N⋅P(i))−βw_i = (N \cdot P(i))^{-\beta} 进行梯度纠偏,增加了数据结构维护复杂度(SumTree 树状数组)。

  • 显存与内存架构优化(Frame Stacking Buffer): 在处理像素级状态时,通常需要将最近 4 帧图像堆叠作为单个时步状态输入卷积网络以捕捉运动速度。若每个转移样本都独立存储 4×84×844 \times 84 \times 84 的浮点张量,一百万容量的回放池将消耗数十 GB 显存。工业界标准实现只在环形数组中以 uint8 存储单帧图片,在采样批次时动态根据索引偏移切片拼接,将物理内存开销直接削减至原来的 1/4 以下。

具体演示:DQN 目标值构建数值演算

假设当前单步转移为:即时奖励 r=1.0r = 1.0,折扣因子 γ=0.9\gamma = 0.9。目标网络对下一状态预测的 3 个候选离散动作 Q 值为 next_q_values = [2.0, 5.0, 4.0]:

  • 场景 1(正常未终止转移,terminated = False):
    • 贪婪动作取值:max⁡a′Q(s′,a′;θ−)=max⁡([2.0,5.0,4.0])=5.0\max_{a'} Q(s', a'; \theta^-) = \max([2.0, 5.0, 4.0]) = 5.0;
    • 构造 Bellman 最优目标:y=r+γ×5.0=1.0+0.9×5.0=5.5y = r + \gamma \times 5.0 = 1.0 + 0.9 \times 5.0 = 5.5;
  • 场景 2(智能体遭遇物理死亡/通关,terminated = True):
    • 终止掩码生效,后继期望被强制截断归零:y=r+γ×0.0=1.0y = r + \gamma \times 0.0 = 1.0。

对比可见,终止状态与非终止状态的目标真值产生高达 4.5 的落差,该目标将作为当前在线网络预测值 Q(s,a;θ)Q(s, a; \theta) 的强监督回归基准。

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

补齐 DQN 标量目标。

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

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

检查方法

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

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

Q1

不要背定义:请从输入、状态变化和输出三个阶段解释“DQN:回放、目标网络与过估计”的工作机制。

你的答案:

Q2

把 target network 也参与反向传播,会形成怎样的追逐目标?

你的答案:

Q3

稀有高价值样本适合 prioritized replay;它引入什么采样偏差?

你的答案:

评分与通过规则

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

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

参考答案(仅 answer 分支)

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

Code
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)中均匀随机采样批次五元组数据 (st,at,rt,st+1,terminated)(s_t, a_t, r_t, s_{t+1}, \text{terminated}),彻底打破输入数据帧之间的时序马尔可夫相关性。在线 Q 网络与目标 Q 网络(冻结参数 θ−\theta^-)分别接收当前状态 sts_t 与后继状态 st+1s_{t+1}。

  2. 状态变化阶段(解耦目标构建与误差反向回传):

    • 最优目标合成:利用目标网络计算下一状态所有动作的 Q 估值,并结合终止掩码生成 Bellman 最优目标 yt=rt+γ(1−terminated)max⁡a′Q(st+1,a′;θ−)y_t = r_t + \gamma (1 - \text{terminated}) \max_{a'} Q(s_{t+1}, a'; \theta^-)(在 Double DQN 中则由在线网络选动作、目标网络估价值);
    • 梯度反传与动量同步:在对 yty_t 执行 stop_gradient(detach())的前提下,在线 Q 网络计算当前动作均方误差或平滑 Huber 损失 ℒ(θ)=1B∑(yt−Q(st,at;θ))2\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;θ)Q(s, a; \theta)。在离线控制中直接提取最大价值对应的确定性动作 a*=arg⁡max⁡aQ(s,a)a^* = \arg\max_a Q(s, a),借助双网络解耦消除了传统非线性 Q-learning 容易陷入的数值发散恶疾。

Q2 参考答案

若错误地让目标网络(Target Network)也参与反向传播计算梯度(即在更新 θ\theta 时把 yt=rt+γmax⁡a′Q(s′,a′;θ)y_t = r_t + \gamma \max_{a'} Q(s', a'; \theta) 作为一个完全可导的完整计算图),会形成致命的“追逐移动目标”(Chasing a Moving Target)自激循环与病态收敛塌缩:

  1. Bellman 压缩映射性质彻底丧失:Q-learning 的数学收敛基石是 Bellman 最优算子 𝒯*\mathcal{T}^* 是一个压缩映射(Contraction Mapping)。这一理论严格要求更新目标 yty_t 是一个“外生给定”的不动点逼近基准。若目标随参数同步求导,优化目标被篡改为最小化 (Q(s,a;θ)−r−γQ(s′,a′;θ))2(Q(s, a; \theta) - r - \gamma Q(s', a'; \theta))^2;

  2. 退化平凡解陷阱(Trivial Constant Solutions):神经网络会非常聪明地找到一种“抄近道”的方式来将损失降为 0——例如若环境奖励 r=0r = 0,只要令所有权重大致为 0,使得所有状态动作的 Q(s,a)≡0Q(s, a) \equiv 0,此时 0−0=00 - 0 = 0,均方误差瞬间为 0!网络根本不会去拟合真实的折现回报,而是塌缩到无意义的平凡解;

  3. 自激正反馈发散:一旦某个动作由于初始化微小扰动获得了略高的 Q 值,在求导时该高估会同时出现在预测项与目标项中,导致梯度不断强化自身的高估,引发 Q 值以指数级速度向正无穷或负无穷剧烈爆炸(Exploding Q-values)。

Q3 参考答案

优先经验回放(Prioritized Experience Replay, PER)根据样本的时序差分误差绝对值(P(i)∝|δi|αP(i) \propto |\delta_i|^\alpha)提高困难样本的抽样概率,虽然显著加速了关键轨迹的学习,但不可避免地引入了非均匀采样分布偏差(Sampling Distribution Bias):

  1. 改变了期望积分的测度空间:标准 Q-learning 依赖于对真实经验状态分布的无偏期望 𝔼(s,a,r,s′)∼𝒟[(y−Q)2]\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 必须通过重要性采样权重 wi=(1N⋅1P(i))βw_i = \left( \frac{1}{N} \cdot \frac{1}{P(i)} \right)^\beta 对每个样本的反向传播梯度进行反比缩放(通常让退火参数 β\beta 从 0.4 线性增长到 1.0)。被高频采样的样本获得较小的梯度更新权重,低频样本获得较大的权重补偿,在保证重点样本被优先访问的同时,在数学上完整恢复了期望梯度的无偏性。

参考资料

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