Skip to content

s20 深度强化学习:DQN 与 Policy Gradient

WARNING

🧪 Beta公测版本提示:教程主体已完成,正在优化细节,欢迎大家提Issue反馈问题或建议。

表格装不下像素和关节角:用网络逼近 Q 或直接输出 πdemo.py 会跑一个小网格上的 DQN/REINFORCE 对照。TD 目标与策略梯度 E[Glogπ] 在折叠里。

一、Q-Table 的末日:从离散到连续


一、Q-Table 的末日:从离散到连续

上一节我们学习了 Q-Learning,它在 GridWorld(10×10=100 个状态)上表现很好。但现实世界中的任务远没有那么简单:

  • 自动驾驶:传感器数据(摄像头 + 雷达 + GPS)= 连续高维向量 → 状态空间是 Rn,不可能建表
  • Atari 游戏210×160×3 像素 = 100800 维,如果用表格存储,宇宙中的所有原子都不够
  • 机器人控制:关节角度、速度、力矩都是连续值 → 状态和动作都是连续空间

面对连续/高维状态空间,表格方法的三个核心假设全部崩溃

  1. 状态枚举:无法列出所有可能状态(连续空间有无穷多个)
  2. 独立学习:无法在相似状态之间共享经验(看到一张略微偏移的图片,Q-Table 完全不知如何应对)
  3. 内存需求:状态数 × 动作数的表格在百万量级就不可行

解决方案:用一个可微的函数逼近器(神经网络)来近似 Q(s,a),而非存储离散的查找表。这就是 Deep Q-Network(DQN) 的核心思想。

函数逼近 = 泛化。神经网络学会了"语义相似的状态应该有相似的 Q 值",从而大幅减少所需经验。

DQN 架构——神经网络替代 Q-Table

图解说明:输入状态(或像素),输出每个离散动作的 Q。目标网络慢同步,经验回放打乱时间相关。

数字例。 当前 Q(s,)=0.5,走一步 r=0.1smaxaQθ¯(s,a)=0.8γ=0.9。TD 目标 0.1+0.72=0.62。损失 12(0.620.5)2,梯度把 Q(s,) 往 0.62 拉。若用同一网络既当预测又当目标,目标跟着跑,训练会抖——所以冻一份 θ¯

逐步推导:DQN 损失与 REINFORCE 梯度(点击展开)

DQN 回归目标 y=r+γmaxaQθ¯(s,a)(终止则 y=r)。损失 E[(yQθ(s,a))2]。回放缓冲打破 (st,st+1) 相关;目标网每 Cθ¯θ。Double DQN:用 θargmax,用 θ¯ 估值,减轻过估计。

REINFORCE:θJ=E[tGtθlogπθ(atst)]Gt 方差大。减基线 Gtb(st) 不改期望(E[logπ]=0)。Actor-Critic 用 Vw(s)b。连续动作常用高斯策略,均值由网络输出。


二、Deep Q-Network (DQN)

2.1 从 Q-Table 到 Q-Network

Q-Learning 使用 Q(s,a) 表格,DQN 使用参数化函数 Qθ(s,a)

方式表示查询
Q-TableQ[state_idx][action_idx]直接查表,O(1)
DQNQθ(s,a) 神经网络前向传播一次,$O(

DQN 的输入是状态 s(可以是原始像素、传感器向量等),输出是所有可能动作的 Q 值:

Qθ(s)=[Qθ(s,a1),Qθ(s,a2),,Qθ(s,an)]

这样,一次前向传播就能得到所有动作的 Q 值,效率极高。

2.2 DQN 两大创新

直接将 Q-Learning 的更新规则套用到神经网络上会导致严重的训练不稳定。DeepMind 在 2013 年的奠基性工作中引入了两个关键创新:

创新 1:经验回放(Experience Replay)

神经网络训练通常假设样本是独立同分布(i.i.d.)的。但强化学习的经验是顺序产生的——连续的 (st,at,rt,st+1) 之间高度相关。如果你用连续的样本来训练神经网络,更新方向会过度受到最近经验的影响。

经验回放的解决方案:维护一个重放缓冲区 D={(s,a,r,s)},存储最近的 N 条经验(例如 N=10000)。每次更新时,从缓冲区中随机采样一个小批量(mini-batch)。这样做的三个好处:

  1. 打破相关性:随机采样让每个 batch 中的经验来自不同时间和策略,近似 i.i.d.
  2. 提高数据效率:每条经验可以被反复使用多次,而不是用过即弃
  3. 平滑学习:从多样化的经验中学习,减少策略振荡

经验回放——打破序列相关性

创新 2:目标网络(Target Network)

Q-Learning 的 TD 目标中包含 maxaQ(s,a)。如果同一个网络既产生预测值 Q(s,a) 又产生目标值 Q(s,a),那么更新 Qθ 会同时改变目标和预测——就像追逐自己尾巴的狗,导致训练发散。

DQN 的解决方案:维护两个网络:

  • 在线网络(Online Network)Qθ:用于选择动作和计算当前 Q 值,每一步都更新
  • 目标网络(Target Network)Qθ:用于计算 TD 目标中的 maxaQ(s,a)每隔 C 步才从在线网络复制一次权重θθ

2.3 DQN 损失函数

DQN 的损失函数就是一个回归问题——让 Qθ(s,a) 逼近 TD 目标:

L(θ)=E(s,a,r,s)D[(r+γmaxaQθ(s,a)Qθ(s,a))2]

其中:

  • Qθ(s,a):在线网络的输出(当前预测)
  • Qθ(s,a):目标网络的输出(稳定目标)
  • 注意:梯度只通过在线网络反向传播,目标网络被视为常数

2.4 DQN 算法流程

初始化在线网络 Q_θ,目标网络 Q_θ⁻ = Q_θ
初始化经验回放缓冲区 D(容量 N)

重复(每个 episode):
    初始化状态 s
    重复(每步):
        以 ε-贪婪策略选择动作 a(基于 Q_θ)
        执行 a,观察 r 和 s'
        将 (s, a, r, s') 存入 D
        从 D 中随机采样 mini-batch B
        计算 TD 目标: y = r + γ·max_{a'} Q_θ⁻(s', a')  (如果 s' 是终止态,y = r)
        计算损失: L = (1/|B|)·Σ (y - Q_θ(s,a))²
        执行梯度下降更新 θ
        每隔 C 步: θ⁻ ← θ
        s ← s'

三、Policy Gradient:直接学习策略

3.1 价值方法的局限性

DQN 属于基于价值的方法——它学习 Q 函数,再由 Q 函数推导出策略(π(s)=argmaxaQ(s,a))。这在离散动作空间中工作得很好,但有几个根本限制:

  1. 确定性策略argmax 产生的策略是确定的——在同一个状态下永远选择同一个动作,这在某些场景(如博弈)中是可被对手利用的
  2. 连续动作困难:当动作空间是连续的(如机器人关节力矩),需要在整个动作空间中取 argmax,这是个优化问题本身
  3. 策略改进的平滑性:Q 值的微小变化可能导致策略的剧烈变化(argmax 不连续)

基于策略的方法绕过了 Q 值这个中间层,直接参数化并优化策略 πθ(a|s)

3.2 REINFORCE 算法

REINFORCE 是最经典的策略梯度算法。核心思路:

定义目标函数 J(θ) 为期望累计奖励:

J(θ)=Eτπθ[trt]

策略梯度定理告诉我们:

θJ(θ)=Eτπθ[t=0Tθlogπθ(at|st)Gt]

其中 Gt=k=tTγktrk 是从时间步 t 开始的累计回报(Return)。

直觉解释

  • θlogπθ(at|st):告诉我们应该如何调整参数来增加选择动作 at 的概率
  • Gt:加权因子——如果 Gt 很大(好的动作序列),大力增加概率;如果 Gt 很小(坏的动作序列),小幅增加甚至减少概率

REINFORCE 的算法流程:

初始化策略网络 π_θ
重复(每个 episode):
    用 π_θ 采样一条完整轨迹 τ = (s_0, a_0, r_0, ..., s_T)
    计算每一步的回报 G_t
    更新: θ ← θ + α Σ_t ∇_θ log π_θ(a_t|s_t) · G_t

REINFORCE 的缺点是高方差——不同轨迹的累计回报可能相差巨大。这引出了 Actor-Critic 方法。

策略梯度——直接优化策略网络


四、Actor-Critic 方法

4.1 为什么需要 Critic?

REINFORCE 用完整的累计回报 Gt 作为每个动作的"好坏"信号。但这引入了高方差——有些轨迹碰巧好(幸运的探索),有些碰巧差,但 REINFORCE 会同等对待。

解决方案:不要用原始的 Gt,而用一个学习到的价值函数来做更准确的评估——这就是 Critic

Actor-Critic 架构包含两个网络:

  • Actor πθ(a|s):策略网络,决定做什么(演员)
  • Critic Vϕ(s):价值网络,评估刚才做得怎么样(评论家)

4.2 优势函数

我们不直接使用 Gt,而是使用优势函数(Advantage Function)

A(s,a)=Q(s,a)V(s)

优势函数衡量的是:"执行动作 a 比在状态 s 下的平均水平好多少"。使用优势函数可以大幅降低梯度的方差。

在实践中,优势函数的估计使用 TD 误差 δt

δt=rt+γV(st+1)V(st)

Actor 用 δt 来更新策略,Critic 用 δt2 来更新价值函数。

4.3 A2C / A3C

  • A2C(Advantage Actor-Critic):同步版本,多个 worker 并行采样,收集完所有梯度后一次性更新
  • A3C(Asynchronous Advantage Actor-Critic):异步版本,每个 worker 独立采样、计算梯度并更新全局网络,无需等待其他 worker

Actor-Critic 方法结合了两种方法的优点:

  • 从策略梯度继承:可以直接输出随机策略、处理连续动作
  • 从价值方法继承:利用 bootstrapping 降低方差、提高样本效率

Actor-Critic 架构图


五、三种方法的对比

维度Value-Based (DQN)Policy-Based (REINFORCE)Actor-Critic (A2C)
学习对象Q 函数 Qθ(s,a)策略 $\pi_{\theta}(as)$
策略类型确定性(argmaxQ随机性(概率分布)随机性(概率分布)
动作空间离散离散 + 连续离散 + 连续
样本效率高(经验回放)低(on-policy)中等
方差低(bootstrapping)高(Monte Carlo)低(advantage)
偏差有偏(bootstrapping)无偏(Monte Carlo)有偏(bootstrapping)
稳定性需目标网络需 baseline需同时训练两个网络
典型应用Atari 游戏简单控制任务复杂连续控制

没有一种方法在所有场景下都最优。选择取决于动作空间的类型、样本获取成本、以及是否需要随机策略。


六、从 Atari 到 AlphaGo:深度 RL 的里程碑

理解深度强化学习的完整版图,有必要快速回顾它的关键里程碑:

  • 2013: DQN (DeepMind) — 首次用 CNN + Q-Learning 在 Atari 2600 游戏上达到人类水平,发表于 NIPS 2013
  • 2015: DQN Nature 版 — 加入目标网络和经验回放,发表于 Nature,标志着"从像素到动作"的端到端学习成为现实
  • 2016: AlphaGo (DeepMind) — 策略网 + 价值网 + MCTS,击败李世石。下一节会单独把自我对弈和 PUCT 讲开,而不是一句「就是 REINFORCE」带过
  • 2017: PPO (OpenAI) — 用裁剪把 on-policy 更新锁在旧策略邻域里,后面会单独成章
  • 2019: OpenAI Five / AlphaStar — 在 Dota 2 和星际争霸 2 上达到职业水平,展示 RL 在复杂多智能体场景中的潜力
  • 2022: RLHF — 把 PPO 接到大语言模型上(人类反馈 → 奖励模型 → 策略优化)
  • 2024–2025: GRPO / DeepSeek-R1 — 用组内相对奖励代替 Critic,做可验证的推理强化学习

自我对弈、近端更新、组相对优势,都值得各自讲清楚,再接到 LLM 上。下一节先看棋:网络负责感觉,树负责算清。


七、本节小结

概念一句话
DQN用神经网络 Qθ(s) 近似 Q 值,处理高维连续状态
经验回放从缓冲区随机采样历史经验,打破序列相关性
目标网络冻结目标 Q 值的计算网络,防止训练振荡
策略梯度直接优化策略 πθ,通过 logπ 加权回报更新
REINFORCE最基础的策略梯度算法,用完整轨迹的累计回报 Gt
Actor-CriticActor(策略)+ Critic(价值),用优势函数降方差
优势函数A(s,a)=Q(s,a)V(s),衡量"比平均好多少"
A2C同步多 worker 的 Actor-Critic,用 n 步回报 + 优势函数

下一节 AlphaGo:自我对弈与 MCTS。之后是 PPOGRPO,最后才把这些优化器接到 RLHF 的 token 序列上。

📥 Code

FileViewDownload
demo.pyOpenDownload
exercise.pyOpenDownload

参考

  1. Mnih, V., et al. (2015). Human-level control through deep reinforcement learning. Nature. (DQN) [doi:10.1038/nature14236]
  2. Williams, R. J. (1992). Simple Statistical Gradient-Following Algorithms for Connectionist Reinforcement Learning. Machine Learning. (REINFORCE) [doi:10.1007/BF00992696]
  3. Mnih, V., et al. (2016). Asynchronous Methods for Deep Reinforcement Learning. ICML 2016. (A3C) [arXiv:1602.01783]
  4. Schulman, J., et al. (2017). Proximal Policy Optimization Algorithms. (PPO) [arXiv:1707.06347]
  5. Silver, D., et al. (2016). Mastering the game of Go with deep neural networks and tree search. Nature. (AlphaGo) [doi:10.1038/nature16961]