2.1 DQN 系列及其改进
2.1.1 背景与动机
在经典强化学习中(如 Q-Learning),如果状态空间或动作空间非常大乃至连续,那么用一个表格来存储 Q ( s , a ) Q(s,a) Q(s,a) 不再可行。为了解决该问题,可以使用神经网络来逼近 Q Q Q 函数,这就是 深度 Q 网络(Deep Q-Network,DQN) 的核心思想。
- 论文起源:DQN 由 DeepMind 团队提出(Mnih et al., 2013 & 2015),利用卷积神经网络来从原始像素(如 Atari 游戏画面)中学习特征,并输出各动作的 Q 值,大幅度提升了在 Atari 游戏上的表现。
- 核心要点:
- 用一个神经网络 Q ( s , a ; θ ) Q(s,a;\theta) Q(s,a;θ) 近似 Q 值;
- 通过最小化时序差分 (TD) 误差来更新 θ \theta θ。
Q 函数的神经网络逼近
对于离散动作环境,网络的输出层通常有 ∣ A ∣ |\mathcal{A}| ∣A∣ 个神经元,每个输出对应一个动作的 Q 值 Q ( s , a ) Q(s,a) Q(s,a)。输入为状态 s s s(可能是图像或其他向量),通过多层感知机 (MLP) 或卷积神经网络 (CNN) 获取特征后输出 Q 值。
2.1.2 DQN 原理与伪代码
(1) 关键改进:Experience Replay 与 Target Network
-
Experience Replay(经验回放)
- 将 Agent 与环境交互得到的经验 ( s , a , r , s ′ ) (s, a, r, s') (s,a,r,s′) 存储在一个 Replay Buffer 中;
- 每次训练时,从该 Buffer 中随机采样一个批量(mini-batch)数据进行梯度更新;
- 好处:
- 让样本分布更加独立同分布 (i.i.d.),打破连续时间步样本的相关性;
- 提高数据效率,能够反复使用历史数据进行训练。
-
Target Network(目标网络)
- DQN 中存在“自举 (bootstrapping)”:在更新 Q 值时,需要用到下一时刻的 Q 值;
- 如果使用同一个网络同时执行动作选择和目标计算,可能导致训练不稳定;
- 解决方案:维持一个“目标网络” Q ^ ( s , a ; θ − ) \hat{Q}(s,a;\theta^-) Q^(s,a;θ−),周期性(或软更新)将在线网络的参数 θ \theta θ 复制到 θ − \theta^- θ−;
- 当计算 TD 目标时,用的是目标网络的 Q 值,不随在线网络每次更新而变化过快。
(2) DQN 的核心更新公式
对于某条经验 ( s , a , r , s ′ ) (s, a, r, s') (s,a,r,s′),DQN 的 TD 目标 (Target) 为
y = r + γ max a ′ Q ^ ( s ′ , a ′ ; θ − ) \LARGE y = r + \gamma \max_{a'} \hat{Q}(s', a'; \theta^-) y=r+γa′maxQ^(s′,a′;θ−)
其中 Q ^ \hat{Q} Q^ 是目标网络。DQN 的损失函数为
L ( θ ) = E ( s , a , r , s ′ ) ∼ D [ ( y − Q ( s , a ; θ ) ) 2 ] \LARGE L(\theta) = \mathbb{E}_{(s,a,r,s')\sim \mathcal{D}} \Big[ \big( y - Q(s,a;\theta) \big)^2 \Big] L(θ)=E(s,a,r,s′)∼D[(y−Q(s,a;θ))2]
通过反向传播对 θ \theta θ 做梯度下降,最小化此均方误差。
(3) DQN 伪代码示例
以下是一段简化的伪代码流程:
Initialize Q network with random weights θ
Initialize target network with the same weights θ^- ← θ
Initialize replay buffer Dfor episode in 1 to max_episodes:s = env.reset()done = Falsewhile not done:# 1. epsilon-greedy 策略if random() < epsilon:a = random actionelse:a = argmax(Q(s, ·; θ))# 2. 与环境交互s_next, r, done, info = env.step(a)# 3. 存储经验D.append((s, a, r, s_next, done))# 4. 训练if len(D) > batch_size:# 4.1 从 D 中随机采样batch = sample(D, batch_size)(s_batch, a_batch, r_batch, s_next_batch, done_batch) = transform(batch)# 4.2 计算目标 yy = r_batch + γ * max(Q(s_next_batch, a'; θ^-), axis=1) * (1 - done_batch)# 4.3 计算当前 Q(s,a;θ),并最小化均方误差loss = MSE(Q(s_batch, a_batch; θ), y)do gradient descent on θ# 5. 每隔 C 步更新目标网络if step % C == 0:θ^- ← θ# 状态前移s = s_next# 6. 衰减 epsilonepsilon = max(epsilon_min, epsilon * epsilon_decay)
2.1.3 DQN 的改进算法
-
Double DQN
- 在计算 max a ′ Q ( s ′ , a ′ ) \max_{a'} Q(s',a') maxa′Q(s′,a′) 时会产生过估计问题;
- Double Q-Learning 思想:将动作选择与动作评估分别在两个网络中完成:
a ∗ = arg max a ′ Q ( s ′ , a ′ ; θ ) , y = r + γ Q ^ ( s ′ , a ∗ ; θ − ) \LARGE \begin{array}{l} a^* = \arg\max_{a'}Q(s',a';\theta), \\ y = r + \gamma \hat{Q}\big(s', a^*; \theta^-\big) \end{array} a∗=argmaxa′Q(s′,a′;θ),y=r+γQ^(s′,a∗;θ−) - 这样能够有效减小 Q 值的过估计偏差。
-
Dueling DQN
- 将网络拆分为状态价值函数 V ( s ) V(s) V(s) 和优势函数 A ( s , a ) A(s,a) A(s,a) 两个分支:
Q ( s , a ) = V ( s ) + A ( s , a ) − 1 ∣ A ∣ ∑ a ′ A ( s , a ′ ) \LARGE Q(s,a) = V(s) + A(s,a) - \frac{1}{|\mathcal{A}|}\sum_{a'}A(s,a') Q(s,a)=V(s)+A(s,a)−∣A∣1a′∑A(s,a′) - 能让网络更好地学习状态本身的价值,在某些情况下提升训练效率。
- 将网络拆分为状态价值函数 V ( s ) V(s) V(s) 和优势函数 A ( s , a ) A(s,a) A(s,a) 两个分支:
-
优先级回放(Prioritized Replay)
- 经验回放中,TD 误差较大的样本往往更有学习价值;
- 给每条经验分配一个“优先级” p i = ∣ δ i ∣ + ϵ p_i = | \delta_i | + \epsilon pi=∣δi∣+ϵ( δ i \delta_i δi 为 TD 误差);
- 采样时,根据 p i p_i pi 的大小进行加权随机采样,让高 TD 误差样本被更多关注;
- 注意需对更新进行重要性采样修正 (IS weights),以保证无偏性。
-
Rainbow DQN
- 将Double DQN、Dueling DQN、优先级回放、NoisyNet、Categorical DQN 等多种改进技术结合在一起,进一步增强效果。
2.2 Policy Gradient 系列
在 Q-Learning 类方法中,我们先估计 Q 值,然后通过贪心或近贪心选择动作;而策略梯度方法则直接对策略函数 π θ ( a ∣ s ) \pi_\theta(a|s) πθ(a∣s) 参数化并通过梯度上升来最大化期望回报。这类方法对连续动作空间尤其有效。
2.2.1 基本策略梯度(REINFORCE)
(1) 思想概述
- 策略 π θ ( a ∣ s ) \pi_\theta(a|s) πθ(a∣s) 是一个可微分的函数(如神经网络),输出在状态 s s s 时选择动作 a a a 的概率;
- 目标:最大化期望回报
J ( θ ) = E τ ∼ π θ [ ∑ t = 0 T r t ] \LARGE J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta} \left[ \sum_{t=0}^{T} r_t \right] J(θ)=Eτ∼πθ t=0∑Trt
其中 τ \tau τ 表示整个轨迹 e p i s o d e episode episode; - 核心:利用梯度上升, θ ← θ + α ∇ θ J ( θ ) \theta \leftarrow \theta + \alpha \nabla_\theta J(\theta) θ←θ+α∇θJ(θ)。
(2) REINFORCE 算法公式
对策略梯度的一个常见推导是:
∇ θ J ( θ ) = E τ ∼ π θ [ ∑ t = 0 T ∇ θ log π θ ( a t ∣ s t ) ⋅ G t ] \LARGE \nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta} \left[ \sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t|s_t) \cdot G_t \right] ∇θJ(θ)=Eτ∼πθ t=0∑T∇θlogπθ(at∣st)⋅Gt
其中 G t G_t Gt 是从时刻 t t t 开始的折扣回报(Return)。在实现中,常见做法是采样多个完整的episode,计算每个时间步的 log π θ ( a t ∣ s t ) \log \pi_\theta(a_t|s_t) logπθ(at∣st) 累积,再加权更新。
(3) REINFORCE 的特点
- 优点:实现简单;可以处理连续或离散动作空间;适用于高维输出;
- 缺点:方差大,收敛速度慢;需要对整条轨迹进行采样。
2.2.2 Actor-Critic 框架
为了降低纯策略梯度方法的高方差,在更新策略时引入价值函数的基线(Baseline)。这就带来了Actor-Critic框架。
- Actor:表示策略网络 π θ ( a ∣ s ) \pi_\theta(a|s) πθ(a∣s),输出动作概率(或连续动作的均值、方差等);
- Critic:表示价值网络 V ω ( s ) V^\omega(s) Vω(s) 或 Q ω ( s , a ) Q^\omega(s,a) Qω(s,a),用来评价当前策略的好坏。
(1) 基本思想
- 策略梯度中,如果我们用 G t − b t G_t - b_t Gt−bt 来取代 G t G_t Gt,只要 b t b_t bt 与动作无关,就不改变无偏性,可降低方差;
- 常见做法: b t b_t bt 用价值函数 V ω ( s t ) V^\omega(s_t) Vω(st) 近似;
- 这样,Critic 网络去学习一个状态价值函数或动作价值函数;Actor 在更新时参考 Critic 给出的基线或优势函数,减小更新的方差。
(2) A2C / A3C
- A2C(Advantage Actor-Critic):使用“优势函数” A ( s t , a t ) = Q ( s t , a t ) − V ( s t ) A(s_t,a_t) = Q(s_t,a_t) - V(s_t) A(st,at)=Q(st,at)−V(st) 来衡量某个动作相对平均水平的好坏;
- A3C(Asynchronous Advantage Actor-Critic):多线程/多进程异步采样,每个线程都有自己的 Actor 和 Critic,与环境交互并计算梯度,再将梯度同步到全局参数中;
- 优点:并行采样,效率更高;在当年的硬件条件下显著加速了训练。
(3) Actor-Critic 伪代码示例(单线程简化)
Initialize Actor πθ, Critic Vω
for episode in 1 to max_episodes:s = env.reset()done = Falsewhile not done:# 1. 从策略网络中采样动作a = sample from πθ(a|s)s_next, r, done, info = env.step(a)# 2. Critic 计算 TD 误差 δV_s = Vω(s)V_s_next = Vω(s_next) if not done else 0δ = r + γ * V_s_next - V_s# 3. 更新 CriticL_critic = δ^2ω ← ω - α_critic ∇ω L_critic# 4. 更新 ActorL_actor = - δ * log πθ(a|s) # 这是一种简化形式θ ← θ - α_actor ∇θ L_actors = s_next
2.3 高级算法
对于更复杂的场景,如连续动作或高维动作的控制,我们需要更先进的算法来保证训练的稳定性和效率。下面介绍几种主流算法:DDPG、TD3、PPO、SAC。
2.3.1 DDPG(Deep Deterministic Policy Gradient)
(1) 适用场景与思路
- 场景:连续动作空间(如机器人关节控制)。
- 核心思想:结合 Actor-Critic 思路,Actor 输出确定性动作(而非动作分布),Critic 学习 Q ω ( s , a ) Q^\omega(s,a) Qω(s,a)。
- 学习目标:最小化 Critic 给出的负 Q 值,让 Actor 朝着“使 Q 值更高的方向”更新。
(2) 算法要点
- Actor 网络 μ θ ( s ) \mu_\theta(s) μθ(s) ,输入状态输出一个确定性动作;
- Critic 网络 Q ω ( s , a ) Q^\omega(s,a) Qω(s,a),输入状态-动作,输出对应 Q 值;
- Replay Buffer + Target Network(类似 DQN)减少不稳定性;
- 更新:
- Critic 更新:最小化 TD 误差
L ( ω ) = ( r + γ Q ω ( s ′ , μ θ ( s ′ ) ) − Q ω ( s , a ) ) 2 \LARGE L(\omega) = \big(r + \gamma Q^\omega(s', \mu_\theta(s')) - Q^\omega(s,a)\big)^2 L(ω)=(r+γQω(s′,μθ(s′))−Qω(s,a))2 - Actor 更新:基于策略梯度
∇ θ J ≈ E [ ∇ a Q ω ( s , a ) ∣ a = μ θ ( s ) ∇ θ μ θ ( s ) ] \LARGE \nabla_\theta J \approx \mathbb{E}\left[\nabla_a Q^\omega(s,a)\big|_{a=\mu_\theta(s)} \nabla_\theta \mu_\theta(s)\right] ∇θJ≈E[∇aQω(s,a) a=μθ(s)∇θμθ(s)] - 同步目标网络的做法与 DQN 类似。
- Critic 更新:最小化 TD 误差
(3) 优势与局限
- 优势:适合连续动作;在一些机器人控制场景有良好表现;
- 局限:训练不稳定;对超参数和初始化较敏感;容易陷入局部最优或碰到多步预测误差累积。
2.3.2 TD3(Twin Delayed DDPG)
- 目的:解决 DDPG 中 Critic 的过估计问题与训练不稳定;
- 双 Critic:类似 Double DQN 的思想,两个独立的 Critic 网络取最小 Q 值作为目标,降低过估计;
- 延迟更新:Actor 网络的参数更新频率低于 Critic,先让 Critic 更充分地学习;
- 目标平滑:在下一个状态动作上加噪声,以减少因函数不平滑引起的过高估计;
- 综合这些改进,使 TD3 在连续控制任务上比 DDPG 更鲁棒。
2.3.3 PPO(Proximal Policy Optimization)
(1) 算法动机
- 场景:On-policy 策略梯度算法,兼具易实现、稳定和高效的特性;
- 问题:直接进行策略梯度更新,步长较大时会毁掉之前学到的策略,引发不稳定。
- 解决:PPO 在更新时约束新旧策略的差异,不使策略迭代步太大。
(2) 算法核心
- 使用**剪切(clipping)**的目标函数,限制更新幅度;
- 定义概率比
r t ( θ ) = π θ ( a t ∣ s t ) π θ old ( a t ∣ s t ) \LARGE r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_\text{old}}(a_t|s_t)} rt(θ)=πθold(at∣st)πθ(at∣st)
然后在优化时将其裁剪在一定范围内(如 [1- ϵ \epsilon ϵ, 1+ ϵ \epsilon ϵ]); - 这样可以兼顾:
- 收益提升(策略改进)
- 稳定性(不让新旧策略差别过大)
(3) 实践效果
- PPO 是当前深度强化学习中最常用的 on-policy 算法之一;
- 实现和调参相对友好,在 MuJoCo 或许多学术竞赛任务中表现出色。
2.3.4 SAC(Soft Actor-Critic)
(1) 核心理念:熵正则化
- SAC 是一种 off-policy 的 Actor-Critic 算法;
- 目标不仅是最大化回报,还要最大化策略的熵(entropy),鼓励策略尽量保持随机,以提升探索能力、提高鲁棒性;
- 通过在目标中加入熵项 α H ( π ( ⋅ ∣ s ) ) \alpha \mathcal{H}(\pi(\cdot|s)) αH(π(⋅∣s)),来平衡“高回报”与“高熵”之间的关系。
(2) 算法结构
- Actor:输出动作分布参数(高斯分布的均值、方差);
- Critic:有两个 Q 网络(双 Critic),取较小值来抑制过估计;
- 温度系数 α \alpha α:控制熵奖励权重,可以固定或自适应调参;
- off-policy:从 Replay Buffer 采样。
(3) 优势
- 稳定收敛:利用双 Critic + 目标平滑 + 熵正则;
- 高探索:让策略在训练前期保持足够随机,减少早期陷入局部最优;
- 在许多连续控制任务中性能优异,且收敛更稳定。
总结与对比
算法 | 特点 | 适用场景 | 优缺点 |
---|---|---|---|
DQN | 离散动作;用 NN 逼近 Q 值;Experience Replay & Target Network | Atari、离散控制 | 易实现;对离散动作较好;对连续动作需改进;存在过估计等问题 |
Double DQN | DQN 改进,解决过估计 | 与 DQN 相同 | 减小过估计,训练更稳定 |
Dueling DQN | 拆分状态价值和优势函数 | 与 DQN 相同 | 对无关动作时能更好提取状态价值 |
Prioritized Replay | 根据 TD 误差进行优先级采样 | 与 DQN 相同 | 数据利用率高,但需重要性采样修正 |
Policy Gradient (REINFORCE) | 直接对策略参数化,梯度上升 | 可处理离散或连续动作 | 实现简单;方差大,收敛慢 |
Actor-Critic (A2C/A3C) | 策略网络 + 价值网络,降低方差 | 常用在并行、多线程场景 | 训练速度快,易于扩展;可能仍有不稳定 |
DDPG | 基于 Actor-Critic,用确定性策略处理连续动作 | 机器人控制、模拟仿真等连续任务 | 适合连续动作;易陷入不稳定,需 carefully 调参 |
TD3 | 双 Critic + 延迟更新 + 目标平滑,改进 DDPG | 与 DDPG 同 | 更鲁棒,减少过估计;实现稍复杂 |
PPO | On-policy,使用剪切损失保证策略改进稳定 | 机器人、游戏等多种场景 | 易实现、效果好;在学术及工业上均较常用 |
SAC | Off-policy,熵正则化,鼓励探索 | 连续动作、高维控制 | 收敛稳定,探索充分;在许多基准任务中效果出色 |
通过上表,我们可以看到离散动作环境通常用 DQN 系列(或 Policy Gradient 的离散版),而连续动作环境往往使用 DDPG/TD3/PPO/SAC 等。具体选择哪种算法,一般需要根据环境特征、数据采集方式(on-policy 或 off-policy)、以及对稳定性和采样效率的要求做综合考量。
总结
- DQN 系列:适用于离散动作。DQN 引入 Experience Replay、Target Network,后续演化出 Double DQN、Dueling DQN、优先级回放、Rainbow 等。
- Policy Gradient 系列:适用于离散或连续动作,直接对策略进行参数化:
- 基本策略梯度(REINFORCE)概念最简单,但方差大;
- Actor-Critic 引入价值函数基线,降低方差,衍生出 A2C/A3C 等多线程并行方式。
- 高级算法:
- DDPG、TD3:典型的 off-policy Actor-Critic,用于连续动作;
- PPO:on-policy 策略梯度,带剪切损失,稳定性好;
- SAC:off-policy,双 Critic + 熵正则,探索充分、表现稳定。
掌握了深度强化学习主流算法的基本原理、核心公式和核心实现细节,并能够在常见基准环境(如 OpenAI Gym、Atari、MuJoCo 等)上独立训练和测试这些算法。这为后续在多智能体强化学习、人机协作指挥决策等更复杂场景的扩展奠定了坚实基础。