Files
2026-05-16 17:16:51 +08:00

181 lines
8.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 01-DQN-深度Q学习
draft: false
tags:
- DQN
- 深度Q网络
- 强化学习
- 深度强化学习
---
## 1. 从 Q-Learning 到 DQN数学基石
在进入深度学习之前,我们需要理解强化学习的核心:**最优策略的寻找**。
### 1.1 马尔可夫决策过程 (MDP)
强化学习通常建模为 MDP由五元组 $(S, A, P, R, \gamma)$ 组成。我们的目标是最大化 **累积期望回报**
$$G_t = \sum_{k=0}^{\infty} \gamma^k R_{t+k+1}$$
其中 $\gamma \in [0, 1]$ 是折扣因子,决定了对未来奖励的重视程度。
### 1.2 Q 函数与 Bellman 方程
**Q 函数(动作价值函数)** $Q^\pi(s, a)$ 表示在状态 $s$ 下采取动作 $a$,并在此后遵循策略 $\pi$ 所能获得的期望回报。
根据 **贝尔曼期望方程 (Bellman Expectation Equation)**Q 函数满足:
$$Q^\pi(s, a) = \mathbb{E}_{\pi} \left[ R(s, a) + \gamma \sum_{s'} P(s'|s,a) \sum_{a'} \pi(a'|s') Q^\pi(s', a') \right]$$
或者等价的递归形式:
$$Q^\pi(s, a) = \mathbb{E}_{s', r} \left[ r + \gamma V^\pi(s') \right]$$
其中状态价值函数 $V^\pi(s) = \sum_a \pi(a|s) Q^\pi(s, a)$。
**直觉解释:** Q 函数衡量的是”在特定状态下选择特定动作”的好坏,而 V 函数衡量的是”处于某个状态”的好坏。两者通过策略 $\pi$ 相互关联。
**贝尔曼最优方程 (Bellman Optimality Equation)** 最优 Q 函数 $Q^*$ 满足:
$$Q^*(s, a) = \mathbb{E}_{s' \sim P} \left[ R(s, a) + \gamma \sum_{s'} P(s'|s,a) \max_{a'} Q^*(s', a') \right]$$
**推导过程:**
1. 最优策略 $\pi^*$ 满足:对每个状态 $s$,选择使 Q 值最大的动作。
2. 因此 $V^*(s) = \max_a Q^*(s, a)$
3. 代入 Q 函数的定义:$Q^*(s, a) = R(s, a) + \gamma \sum_{s'} P(s'|s,a) V^*(s')$
4. 用 $V^*(s') = \max_{a'} Q^*(s', a')$ 替换,得到最终形式。
**物理意义:** 当前状态动作对的价值等于”即时奖励”加上”所有可能下一状态最优价值的折现期望”。这是一个递归定义,因为 $Q^*$ 出现在等式两边。
### 1.3 传统 Q-Learning 的局限
传统的 Q-Learning 使用一个表格Q-Table来存储所有状态动作对。
- **更新公式:** $Q(s, a) \leftarrow Q(s, a) + \alpha [R + \gamma \max_{a'} Q(s', a') - Q(s, a)]$
- **瓶颈:** 当状态空间 $S$ 是连续的(如图像)或维度极高时,表格法会遭遇“维度灾难”,无法存储也无法泛化。
---
## 2. DQN 的核心逻辑:函数拟合
DQN 的核心思想是:**用一个深度神经网络 $Q(s, a; \theta)$ 来替代 Q-Table。** 神经网络通过学习参数 $\theta$ 来模拟 $Q^*$ 函数。
### 2.1 损失函数推导
为了训练网络,我们需要定义一个损失函数。借鉴监督学习的思路,我们将 Bellman 方程的右边视为“标签”,左边视为“预测值”。
**目标值 (TD Target)**
$$y = R + \gamma \max_{a'} Q(s', a'; \theta)$$
**损失函数 (Mean Squared Error)**
$$L(\theta) = \mathbb{E}_{(s, a, r, s') \sim D} \left[ \left( y - Q(s, a; \theta) \right]^2 \right)$$
---
## 3. DQN 的两大制胜法宝
如果直接按照上述公式训练网络极难收敛。DQN 引入了两个关键机制来解决稳定性问题。
### 3.1 经验回放 (Experience Replay)
- **问题 1样本相关性** 强化学习的样本是 **时序相关的**——相邻时刻的 $(s_t, a_t, r_t, s_{t+1})$ 高度相似。这违反了机器学习中 IID独立同分布假设导致梯度估计是有偏的。
- **问题 2分布偏移** 当前策略 $\pi_\theta$ 决定了下一批样本的分布。旧策略采样的数据分布与当前策略不同,直接使用会破坏训练稳定性。
- **机制:** 将智能体的经验 $(s_t, a_t, r_t, s_{t+1})$ 存储在一个容量为 $N$ 的巨大 **Replay Buffer** $\mathcal{D}$ 中。训练时从中随机采样一个 Mini-batch $\{(s_j, a_j, r_j, s'_j)\}$。
- **打破相关性的原理:** 随机采样使得一个 Mini-batch 中的样本来自不同时间步它们之间的相关性被大幅削弱。同时Buffer 中可能包含不同策略下采集的数据,形成近似 IID 的混合分布。
- **超参数选择:** Buffer 大小通常为 $10^5$ 至 $10^6$。太小会限制数据多样性,太大可能导致早期经验被稀释(可用优先级回放 PER 改善)。
### 3.2 目标网络 (Target Network)
- **问题根源:** 在计算 TD Target $y_j = r_j + \gamma \max_{a'} Q(s'_j, a'_j; \theta^-)$ 时,如果目标值也使用正在更新的参数 $\theta$,会导致”自己追逐自己”的震荡现象。这是因为 $y$ 和 $Q(s,a;\theta)$ 都依赖同一个 $\theta$,优化过程会不断改变”靶心”。
- **机制:** 维护两个网络:
1. **评估网络 (Q-Network)** 参数为 $\theta$,负责实时计算 Q 值和梯度下降。
2. **目标网络 (Target Q-Network)** 参数为 $\theta^-$,专门用于计算稳定的 TD Target。
- **更新机制:** 每隔 $C$ 个训练步长,将 $\theta$ 复制给 $\theta^-$$\theta^- \leftarrow \theta$。这种”软更新”(或”硬更新”)确保目标网络的变化是离散的、稳定的。
- **为什么有效:** 在一个更新周期内,目标 $y$ 是固定的(因为 $\theta^-$ 暂时不变),而评估网络 $Q(s,a;\theta)$ 在不断接近这个固定目标。这解决了”移动靶心”问题。
- **直觉类比:** 想象你在练习射箭。目标网络就像一个固定的靶子(不随你每次射箭而移动),而评估网络是你的射击技术。通过不断逼近固定的靶子,你的动作才能逐步稳定。
---
## 4. DQN 训练全过程 (Algorithmic Flow)
1. 初始化经验池 $D$。
2. 初始化评估网络 $Q(\theta)$ 和目标网络 $Q(\theta^-)$,使 $\theta^- = \theta$。
3. **对于每一轮 (Episode)**
- 获取初始状态 $s$。
- **对于每一步 (Step)**
- 使用 **$\epsilon$-greedy** 策略选择动作:以 $\epsilon$ 概率随机探索,以 $1-\epsilon$ 概率选择 $a = \arg\max Q(s, a; \theta)$。
- 执行动作 $a$,观测 $r, s'$。
- 将 $(s, a, r, s')$ 存入 $D$。
- 从 $D$ 中随机采样 Batch。
- 计算目标值 $y_j = r_j + \gamma \max_{a'} Q(s'_j, a'_j; \theta^-)$。
- 通过梯度下降更新 $\theta$$\nabla_\theta (y_j - Q(s_j, a_j; \theta))^2$。
- 每隔 $C$ 步更新 $\theta^- = \theta$。
---
## 5. 可能出现的问题与改进方案
- **过拟合与估计过高 (Overestimation Bias)** DQN 经常倾向于高估 Q 值,因为 $\max$ 操作会将正向误差放大。
- _改进_ **Double DQN**。使用评估网络选动作,目标网络算价值。
- **样本利用率不均:** 并不是所有经验都同样重要。
- _改进_ **Prioritized Experience Replay (PER)**。根据 TD-error 大小设置采样优先级。
- **网络结构冗余:** 某些状态下,动作对结果影响不大。
- _改进_ **Dueling DQN**。将 Q 网络分为状态价值 $V(s)$ 和优势函数 $A(s, a)$ 两部分。
---
## 6. 向 Policy Gradient 进发
DQN 虽然强大,但它有天然的缺陷:无法处理 **连续动作空间**,且无法学习 **随机策略**。为了解决这些问题,我们需要转向 **策略梯度 (Policy Gradient)** 方法。
- **A2C (Advantage Actor-Critic)**
它结合了 Value-based 和 Policy-based。**Actor** 负责选动作(策略),**Critic** 负责评价动作的好坏(价值)。通过引入 **优势函数 (Advantage)** $A(s, a) = Q(s, a) - V(s)$ 来降低梯度的方差。
- **PPO (Proximal Policy Optimization)**
目前工业界最常用的算法。它解决了 Policy Gradient 步长难确定的问题。通过 **重要性采样 (Importance Sampling)****裁剪 (Clipping) 机制**,确保策略更新不会偏离太远,从而极大地提升了训练的鲁棒性。
> **笔记要点回顾:**
>
> - Q-Learning 依靠 Bellman 方程更新表格。
>
> - DQN 将表格换成神经元,用经验回放打碎相关性,用目标网络稳定目标。
>
> - DQN 是理解后面更复杂的 A3C、PPO 等算法的基石。
>