--- 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 等算法的基石。 >