强化学习算法(DQN)
使用深度强化学习玩雅达利游戏
摘要
提出首个深度学习模型,能通过强化学习直接从 原始像素 成功学习控制策略。模型为 卷积神经网络 + Q学习变体,输入像素,输出估计未来奖励的值函数。该方法在7款雅达利2600游戏上 无架构/超参改动 即可复用,在6款游戏上超越既有方法、3款游戏 超越人类专家。🚀
0 阅读指引与要点
文档目标:本文档详细介绍了 DQN(Deep Q-Network)算法,这是第一个成功将深度强化学习应用于从原始像素学习控制策略的算法,在雅达利游戏上达到了人类水平。
- 🔑 核心目标:说明 深度Q网络(DQN) 如何直接从 原始像素 学得控制策略,在多游戏通用设置下取得 SOTA/接近人类表现。
- 🧩 核心技术:
- 经验回放:存储历史经验,随机采样打破时间相关性,提高数据效率
- 目标Q网络:维护独立的目标网络,提供稳定的 TD 目标,避免训练发散
- 卷积特征提取:使用 CNN 从原始像素自动提取特征,无需手工设计
- 统一超参/架构:同一套网络架构和超参数适用于多个游戏,无需游戏特定调整
- 🧭 推荐阅读路径:
- 第 1 节(引言):了解问题背景和 DQN 的动机
- 第 2 节(背景):理解强化学习基础(MDP、Q 学习、贝尔曼方程)
- 第 4 节(深度强化学习):重点阅读,理解 DQN 的核心机制和经验回放
- 第 5 节(实验):了解实验设置和性能表现
与项目代码的对应:
- Q 网络 →
src/dqn.py中的DQN类 - 经验回放 →
DQNAgent.memory(deque) - 目标网络 →
DQNAgent.target_net - epsilon-greedy →
DQNAgent.act方法 - 硬更新 →
DQNAgent.update方法中的目标网络更新逻辑
1 引言
直接从视觉、语音等高维感官输入中学习控制智能体,是强化学习(RL)长期面临的挑战之一。在这些领域中,大多数成功的RL应用依赖手工设计的特征,结合线性值函数或策略表示。显然,此类系统的性能在很大程度上取决于特征表示的质量。
深度学习的最新进展使得从原始感官数据中提取高级特征成为可能,在计算机视觉[11, 22, 16]和语音识别[6, 7]领域取得了突破。这些方法利用了多种神经网络架构,包括卷积网络、多层感知机、受限玻尔兹曼机和循环神经网络,并采用了监督学习和无监督学习。自然会问,类似技术是否也能有益于处理感官数据的RL。
然而,从深度学习角度看,强化学习面临若干挑战。首先,迄今为止,大多数成功的深度学习应用都需要大量手工标记的训练数据。而RL算法必须能够从标量奖励信号中学习,该信号通常稀疏、含噪且具有延迟。动作与产生的奖励之间的延迟可能长达数千个时间步,与监督学习中输入和目标之间的直接关联相比,这似乎尤其棘手。另一个问题是,大多数深度学习算法假设数据样本是独立的,而在强化学习中,通常会遇到高度相关的状态序列。此外,在RL中,随着算法学习新行为,数据分布会发生变化,这对于假设固定基础分布的深度学习方法可能会产生问题。
强化学习与深度学习的挑战:
- 稀疏奖励:奖励信号通常稀疏(只有关键时刻才有奖励),难以学习
- 延迟奖励:动作与奖励之间可能有数千个时间步的延迟,难以建立因果关系
- 时序相关性:强化学习中的样本是时序相关的,违反深度学习的 i.i.d. 假设
- 非平稳分布:随着策略学习,数据分布会发生变化,对深度学习造成挑战
- DQN 的解决方案:经验回放打破时间相关性,目标网络提供稳定目标,CNN 自动提取特征
本文证明,卷积神经网络能够克服这些挑战,在复杂的RL环境中从原始视频数据学习成功的控制策略。该网络使用Q学习[26]算法的变体进行训练,通过随机梯度下降更新权重。为缓解数据相关性和非平稳分布问题,我们采用经验回放机制[13],该机制随机采样先前的转换,从而平滑多种过去行为的训练分布。
该方法应用于街机学习环境(ALE)[3]中的多款雅达利2600游戏。雅达利2600为智能体提供高维视觉输入(210×160 RGB video at 60 Hz)\left( {{210} \times {160}\text{ RGB video at }{60}\mathrm{\;{Hz}}}\right)(210×160 RGB video at 60Hz)及多样任务。目标是打造单一神经网络智能体,在多游戏上高效学习,无需游戏特定信息或手工特征,亦不依赖模拟器内部状态,仅凭视频输入、奖励与终止信号及动作集合进行学习。网络架构与训练超参数在各游戏中保持一致,已在7款游戏的测试中,有6款优于既有RL算法、3款超越专家级人类玩家。图1展示训练使用的部分游戏截图。
2 背景
我们考虑智能体与环境E\mathcal{E}E(在本案例中为Atari模拟器)通过一系列动作、观测和奖励进行交互的任务。在每个时间步,智能体从合法游戏动作集合A={1,…,K}\mathcal{A} = \{ 1,\ldots ,K\}A={1,…,K}中选择一个动作at{a}_{t}at。该动作被传递给模拟器,并修改其内部状态和游戏分数。通常,E\mathcal{E}E可能具有随机性。模拟器的内部状态不被智能体观测;相反,智能体从模拟器观测到图像xt∈Rd{x}_{t} \in {\mathbb{R}}^{d}xt∈Rd,这是一个表示当前屏幕的原始像素值向量。此外,它还会收到表示游戏分数变化的奖励rt{r}_{t}rt。请注意,通常游戏分数可能取决于整个先前的动作和观测序列;关于某个动作的反馈可能要在数千个时间步之后才能收到。
由于智能体仅能观测当前屏幕的图像,因此该任务是部分可观测的,并且许多模拟器状态存在感知混淆,即仅从当前屏幕无法完全了解当前情况xt{x}_{t}xt。因此,我们考虑动作和观测的序列st= x1,a1,x2,…,at−1,xt{s}_{t} = \; {x}_{1},{a}_{1},{x}_{2},\ldots ,{a}_{t - 1},{x}_{t}st=x1,a1,x2,…,at−1,xt,并学习依赖于这些序列的游戏策略。模拟器中的所有序列都被假设在有限的时间步内终止。这种形式化方法产生了一个大型但有限的马尔可夫决策过程(MDP),其中每个序列都是一个不同的状态。因此,我们可以将标准的MDP强化学习方法应用于此,只需将完整序列st{s}_{t}st用作时间ttt的状态表示。
智能体的目标是通过选择动作与模拟器交互,以最大化未来奖励。我们做出标准假设:未来奖励按每个时间步γ\gammaγ的因子进行折扣,并将时间ttt的未来折扣回报定义为Rt=∑t′=tTγt′−trt′{R}_{t} = \mathop{\sum }\limits_{{{t}^{\prime } = t}}^{T}{\gamma }^{{t}^{\prime } - t}{r}_{{t}^{\prime }}Rt=t′=t∑Tγt′−trt′,其中TTT是游戏终止的时间步。我们将最优动作价值函数Q∗(s,a){Q}^{ * }\left( {s,a}\right)Q∗(s,a)定义为在看到某个序列sss并采取某个动作a,Q∗(s,a)=maxπE[Rt∣st=s,at=a,π]a,{Q}^{ * }\left( {s,a}\right) = \mathop{\max }\limits_{\pi }\mathbb{E}\left\lbrack {{R}_{t} \mid {s}_{t} = s,{a}_{t} = a,\pi }\right\rbracka,Q∗(s,a)=πmaxE[Rt∣st=s,at=a,π]之后,通过遵循任何策略可获得的最大期望回报,其中π\piπ是将序列映射到动作(或动作分布)的策略。
最优动作价值函数遵循一个重要的恒等式,称为 贝尔曼方程。这基于以下直觉:如果对于所有可能的动作a′{a}^{\prime }a′,下一时间步序列s′{s}^{\prime }s′的最优值Q∗(s′,a′){Q}^{ * }\left( {{s}^{\prime },{a}^{\prime }}\right)Q∗(s′,a′)是已知的,那么最优策略就是选择使r+γQ∗(s′,a′)r + \gamma {Q}^{ * }\left( {{s}^{\prime },{a}^{\prime }}\right)r+γQ∗(s′,a′)的期望价值最大化的动作a′{a}^{\prime }a′。
Q∗(s,a)=Es′∼E[r+γmaxa′Q∗(s′,a′)∣s,a](1) {Q}^{ * }\left( {s,a}\right) = {\mathbb{E}}_{{s}^{\prime } \sim \mathcal{E}}\left\lbrack {r + \gamma \mathop{\max }\limits_{{a}^{\prime }}{Q}^{ * }\left( {{s}^{\prime },{a}^{\prime }}\right) \mid s,a}\right\rbrack \tag{1} Q∗(s,a)=Es′∼E[r+γa′maxQ∗(s′,a′)∣s,a](1)
贝尔曼方程详解:
- 问题:如何估计最优动作价值函数 Q∗(s,a)Q^*(s,a)Q∗(s,a)?
- 直接估计需要遍历所有可能的轨迹,计算量巨大
- 需要利用动态规划的思想,将问题分解为子问题
- 解决方案:贝尔曼方程提供递归关系
- 最优 Q 函数:Q∗(s,a)Q^*(s,a)Q∗(s,a) 表示在状态 sss 下执行动作 aaa,之后遵循最优策略的期望累积奖励
- 递归关系:当前 Q 值 = 即时奖励 + 折扣后的未来最优 Q 值
- 公式:Q∗(s,a)=E[r+γmaxa′Q∗(s′,a′)]Q^*(s,a) = \mathbb{E}[r + \gamma \max_{a'} Q^*(s', a')]Q∗(s,a)=E[r+γmaxa′Q∗(s′,a′)]
- 关键参数:
- γ\gammaγ:折扣因子(通常 0.99),平衡即时奖励和未来奖励
- maxa′Q∗(s′,a′)\max_{a'} Q^*(s', a')maxa′Q∗(s′,a′):选择下一状态的最优动作,构成 Q 学习的基础
- 理论意义:贝尔曼方程是 Q 学习的理论基础,通过迭代更新逼近最优 Q 函数
- 项目对应:
src/dqn.py中的 TD 目标计算使用此公式
许多强化学习算法的基本思想是通过使用贝尔曼方程作为迭代更新来估计动作价值函数,Qi+1(s,a)= E[r+γmaxa′Qi(s′,a′)∣s,a]{Q}_{i + 1}\left( {s,a}\right) = \; \mathbb{E}\left\lbrack {r + \gamma \mathop{\max }\limits_{{a}^{\prime }}{Q}_{i}\left( {{s}^{\prime },{a}^{\prime }}\right) \mid s,a}\right\rbrackQi+1(s,a)=E[r+γa′maxQi(s′,a′)∣s,a]。这种 价值迭代 算法收敛到最优动作价值函数,Qi→Q∗{Q}_{i} \rightarrow {Q}^{ * }Qi→Q∗如i→∞i \rightarrow \inftyi→∞[23]所述。在实践中,这种基本方法完全不切实际,因为动作价值函数是针对每个序列单独估计的,没有任何泛化。相反,通常使用 函数逼近器 来估计动作价值函数,Q(s,a;θ)≈Q∗(s,a)Q\left( {s,a;\theta }\right) \approx {Q}^{ * }\left( {s,a}\right)Q(s,a;θ)≈Q∗(s,a)。在强化学习领域,这通常是线性函数逼近器,但有时也会使用非线性函数逼近器,例如神经网络。我们将具有权重θ\thetaθ的神经网络函数逼近器称为 Q网络。Q网络可以通过最小化一系列在每次迭代iii时变化的损失函数Li(θi){L}_{i}\left( {\theta }_{i}\right)Li(θi)来训练,
Li(θi)=Es,a∼ρ(⋅)[(yi−Q(s,a;θi))2],(2) {L}_{i}\left( {\theta }_{i}\right) = {\mathbb{E}}_{s,a \sim \rho \left( \cdot \right) }\left\lbrack {\left( {y}_{i} - Q\left( s,a;{\theta }_{i}\right) \right) }^{2}\right\rbrack , \tag{2} Li(θi)=Es,a∼ρ(⋅)[(yi−Q(s,a;θi))2],(2)
其中yi=Es′∼E[r+γmaxa′Q(s′,a′;θi−1)∣s,a]{y}_{i} = {\mathbb{E}}_{{s}^{\prime } \sim \mathcal{E}}\left\lbrack {r + \gamma \mathop{\max }\limits_{{a}^{\prime }}Q\left( {{s}^{\prime },{a}^{\prime };{\theta }_{i - 1}}\right) \mid s,a}\right\rbrackyi=Es′∼E[r+γa′maxQ(s′,a′;θi−1)∣s,a]是迭代iii的目标,ρ(s,a)\rho \left( {s,a}\right)ρ(s,a)是我们称为行为分布的序列sss和动作aaa上的概率分布。在优化损失函数Li(θi){L}_{i}\left( {\theta }_{i}\right)Li(θi)时,前一次迭代θi−1{\theta }_{i - 1}θi−1的参数保持固定。请注意,目标依赖于网络权重;这与监督学习中使用的目标形成对比,后者在学习开始前是固定的。对权重求损失函数的导数,我们得到以下梯度,
∇θiLi(θi)=Es,a∼ρ(⋅);s′∼E[(r+γmaxa′Q(s′,a′;θi−1)−Q(s,a;θi))∇θiQ(s,a;θi)].(3) {\nabla }_{{\theta }_{i}}{L}_{i}\left( {\theta }_{i}\right) = {\mathbb{E}}_{s,a \sim \rho \left( \cdot \right) ;{s}^{\prime } \sim \mathcal{E}}\left\lbrack {\left( {r + \gamma \mathop{\max }\limits_{{a}^{\prime }}Q\left( {{s}^{\prime },{a}^{\prime };{\theta }_{i - 1}}\right) - Q\left( {s,a;{\theta }_{i}}\right) }\right) {\nabla }_{{\theta }_{i}}Q\left( {s,a;{\theta }_{i}}\right) }\right\rbrack . \tag{3} ∇θiLi(θi)=Es,a∼ρ(⋅);s′∼E[(r+γa′maxQ(s′,a′;θi−1)−Q(s,a;θi))∇θiQ(s,a;θi)].(3)
与其计算上述梯度中的完整期望,通过随机梯度下降来优化损失函数通常在计算上更有利。如果在每个时间步后更新权重,并且期望分别由来自行为分布ρ\rhoρ和模拟器E\mathcal{E}E的单个样本替换,那么我们就得到了熟悉的QQQ学习算法[26]。
请注意,此算法是无模型的:它直接使用来自模拟器E\mathcal{E}E的样本解决强化学习任务,无需显式构建E\mathcal{E}E的估计。它也是异策略的:它学习贪婪策略a=maxaQ(s,a;θ)a = \mathop{\max }\limits_{a}Q\left( {s,a;\theta }\right)a=amaxQ(s,a;θ),同时遵循确保充分探索状态空间的行为分布。在实践中,行为分布通常由ϵ\epsilonϵ贪婪策略选择,该策略以概率1−ϵ1 - \epsilon1−ϵ遵循贪婪策略,并以概率ϵ\epsilonϵ选择随机动作。
Q 学习的特性:
- 无模型(Model-Free):不需要环境的转移动力学模型,直接从样本学习
- 优势:适用于复杂环境,无需建模
- 劣势:需要大量样本,数据效率可能较低
- 离策略(Off-Policy):学习最优策略,但使用行为策略(如 ϵ\epsilonϵ-贪婪)探索
- 优势:可以使用历史经验,提高数据效率
- 优势:探索和利用可以分离,更灵活
- ϵ\epsilonϵ-贪婪策略:
- 以概率 1−ϵ1-\epsilon1−ϵ 选择最优动作(利用)
- 以概率 ϵ\epsilonϵ 选择随机动作(探索)
- ϵ\epsilonϵ 通常随训练衰减,从探索转向利用
3 相关工作
强化学习最著名的成功案例或许是TD-gammon,这是一个完全通过强化学习和自我对弈学习的西洋双陆棋程序,并达到了超人类的水平[24]。TD-gammon使用了类似于Q学习的无模型强化学习算法,并使用具有一个隐藏层的多层感知器来逼近价值函数
然而,早期跟进TD-gammon的尝试,包括将相同方法应用于国际象棋、围棋和跳棋,都不太成功。这导致人们普遍认为TD-gammon方法是一个特例,只在西洋双陆棋中有效,可能是因为骰子滚动的随机性有助于探索状态空间,也使价值函数特别平滑[19]。
此外,研究表明,将无模型强化学习算法(如Q学习)与非线性函数逼近器[25]结合,或者实际上与离策略学习[1]结合,可能导致Q网络发散。随后,强化学习领域的大部分工作都集中在具有更好收敛保证的线性函数逼近器上[25]。
近年来,将深度学习与强化学习相结合的兴趣重新兴起。深度神经网络已被用于估计环境E\mathcal{E}E;受限玻尔兹曼机已被用于估计值函数[21]或策略[9]。此外,梯度时序差分方法已部分解决了Q学习的发散问题。这些方法在使用非线性函数逼近器评估固定策略时[14],或在使用Q学习的受限变体通过线性函数逼近学习控制策略时[15],被证明是收敛的。然而,这些方法尚未扩展到非线性控制领域。
或许与我们方法最相似的先前工作是神经拟合Q学习(NFQ)[20]。NFQ使用RPROP算法更新Q网络参数,以优化公式2中的损失函数序列。但它采用批处理更新,每次迭代的计算成本与数据集大小成正比,而我们考虑的随机梯度更新每次迭代成本为低常数,且可扩展到大型数据集。NFQ也已成功应用于简单的现实世界控制任务,通过纯视觉输入,首先使用深度自编码器学习任务的低维表示,然后将NFQ应用于该表示[12]。相比之下,我们的方法端到端地应用强化学习,直接从视觉输入学习;因此,它可能学习到与区分动作值直接相关的特征。Q学习先前也曾与经验回放和简单神经网络结合[13],但同样是从低维状态而非原始视觉输入开始。
Atari 2600模拟器作为强化学习平台的使用由[3]提出,他们将标准强化学习算法与线性函数逼近和通用视觉特征相结合。随后,通过使用更多特征以及使用拔河哈希将特征随机投影到低维空间,结果得到了改进[2]。HyperNEAT进化架构[8]也已应用于Atari平台,用于为每个不同游戏单独进化表示该游戏策略的神经网络。当使用模拟器的重置功能针对确定性序列反复训练时,这些策略能够利用几款Atari游戏中的设计缺陷。
4 深度强化学习
计算机视觉和语音识别领域的最新突破依赖于在超大型训练集上高效训练深度神经网络。最成功的方法直接从原始输入进行训练,使用基于随机梯度下降的轻量级更新。通过向深度神经网络输入足够的数据,通常可以学习到比手工设计特征更好的表示[11]。这些成功启发了我们的强化学习方法。我们的目标是将强化学习算法与直接处理RGB图像的深度神经网络相连,并通过随机梯度更新高效处理训练数据。
Tesauro的TD-Gammon架构为此类方法提供了起点。该架构直接从同策略经验样本(st,at,rt,st+1,at+1{s}_{t},{a}_{t},{r}_{t},{s}_{t + 1},{a}_{t + 1}st,at,rt,st+1,at+1)更新估计值函数的网络参数,这些样本来自算法与环境的交互(在双陆棋中则来自自对弈)。由于该方法在20年前就能够超越最优秀的人类双陆棋玩家,自然会思考:20年的硬件改进,再加上现代深度神经网络架构和可扩展的强化学习算法,是否可能产生重大进展。
与TD-Gammon及类似在线方法不同,算法采用 经验回放 技术[13]:将每步经验et=(st,at,rt,st+1){e}_{t} = \left( {{s}_{t},{a}_{t},{r}_{t},{s}_{t + 1}}\right)et=(st,at,rt,st+1)缓存于数据集D\mathcal{D}D,随机抽样进行Q学习/小批量更新,以打破相关、提升样本效率。执行经验回放后,智能体按 ϵ\epsilonϵ-贪婪策略 选择动作。由于直接用可变长度历史喂网络不便,Q函数基于ϕ\phiϕ生成固定长度历史表示。
经验回放详解:
- 问题:强化学习中的样本是时序相关的,但神经网络训练需要独立同分布(i.i.d.)样本
- 连续的状态转移 (st,at,rt,st+1)(s_t, a_t, r_t, s_{t+1})(st,at,rt,st+1) 高度相关
- 直接使用这些样本训练会导致梯度估计方差大,训练不稳定
- 样本分布会随策略变化而变化,违反 i.i.d. 假设
- 在线学习效率低,每个经验只使用一次
- 解决方案:经验回放缓冲区
- 存储:将转移 (st,at,rt,st+1)(s_t, a_t, r_t, s_{t+1})(st,at,rt,st+1) 存储到缓冲区 D\mathcal{D}D
- 采样:随机采样小批量数据,打破时间相关性
- 更新:使用采样的数据更新网络
- 缓冲区管理:
- 大小:通常 10610^6106,平衡存储成本和样本多样性
- 策略:FIFO(先进先出),满时自动丢弃最旧样本
- 采样:均匀随机采样,简单有效(可扩展为优先经验回放)
- 优势:
- 打破时间相关性:随机采样使样本近似独立
- 重复利用历史经验:每个经验可用于多次更新,提高数据效率
- 支持离策略学习:可以使用旧策略生成的经验,适合 DQN 等离策略算法
- 与在线学习的对比:
- 在线学习:每步只使用当前经验,数据效率低
- 经验回放:重复利用历史经验,数据效率高
- 项目对应:
src/dqn.py中的memory = deque(maxlen=MEMORY_SIZE)
该流程称为 深度Q学习,通过 经验回放 + 目标网络 组合,实现从像素端到端稳定训练。
代码对应:
src/dqn.py中DQNAgent.update()实现了 Bellman 目标:
y=r+γmaxa′Qtarget(s′,a′) y=r+\gamma \max_{a'} Q_{\text{target}}(s',a') y=r+γa′maxQtarget(s′,a′)
并以 Huber 损失最小化 (y−Qpolicy)2(y-Q_{\text{policy}})^2(y−Qpolicy)2,与公式(1) 一致DQNAgent.act采用 ϵ\epsilonϵ-贪婪策略对应算法1 的动作选择
与标准在线Q学习[23]相比,该方法具有多个优势。首先,每个经验步骤可能用于多次权重更新,从而提高了数据效率。其次,目标Q网络 提供平滑的 TD 目标,显著缓解非平稳和发散问题。
目标Q网络详解:
- 问题:直接使用在线网络计算 TD 目标会导致训练不稳定
- 在线网络 Q(s,a∣θ)Q(s,a|\theta)Q(s,a∣θ) 不断更新
- 同时用于计算目标 yt=rt+γmaxa′Q(st+1,a′∣θ)y_t = r_t + \gamma \max_{a'} Q(s_{t+1}, a'|\theta)yt=rt+γmaxa′Q(st+1,a′∣θ)
- 目标值随网络更新快速变化,导致训练发散
- 形成"移动目标"问题:目标值不断变化,网络难以收敛
- 解决方案:使用目标网络计算稳定的目标值
- 目标网络:Qtarget(s,a∣θ−)Q_{\text{target}}(s,a|\theta^-)Qtarget(s,a∣θ−),参数 θ−\theta^-θ− 更新较慢
- 目标值:yt=rt+γmaxa′Qtarget(st+1,a′∣θ−)y_t = r_t + \gamma \max_{a'} Q_{\text{target}}(s_{t+1}, a'|\theta^-)yt=rt+γmaxa′Qtarget(st+1,a′∣θ−)
- 硬更新:每隔 CCC 步(通常 C=500C=500C=500),将在线网络参数复制到目标网络:θ−←θ\theta^- \leftarrow \thetaθ−←θ
- 更新频率 CCC 的选择:
- CCC 太小:目标网络更新频繁,目标值变化快,不稳定
- CCC 太大:目标网络更新缓慢,学习速度慢,但更稳定
- 通常 C=500C=500C=500 到 100001000010000,DQN 使用 C=10000C=10000C=10000(每 10000 步更新一次)
- 与软更新的对比:
- 硬更新(DQN):每隔 CCC 步复制一次,目标值可能突然变化
- 软更新(DDPG/TD3):每步都更新一小部分,目标值平滑变化
- 硬更新实现简单,软更新通常更稳定但实现稍复杂
- 优势:
- 目标值变化缓慢,训练更稳定
- 将不稳定的强化学习问题转化为更接近监督学习的问题
- 项目对应:
src/dqn.py中的target_net和硬更新逻辑(每UPDATE_TARGET_FREQ步更新一次)
算法1 带经验回放的深度Q学习(排版版)
算法流程详解:
-
初始化
- 初始化回放内存D\mathcal{D}D(容量NNN,通常 10610^6106)
- 初始化动作价值函数QQQ的权重(随机初始化)
- 初始化目标网络 QtargetQ_{\text{target}}Qtarget,权重从在线网络复制
-
每个 episode =1…M=1\ldots M=1…M(训练 MMM 个回合):
-
观测初始帧x1{x}_{1}x1,构造序列s1={x1}{s}_{1}=\{x_{1}\}s1={x1},预处理ϕ1=ϕ(s1){\phi }_{1}=\phi(s_{1})ϕ1=ϕ(s1)(将最近 4 帧堆叠)
-
对每个时间步 t=1…Tt=1\ldots Tt=1…T(每个回合最多 TTT 步):
步骤 1:选择动作(ϵ\epsilonϵ-贪婪策略)
- 以概率ϵ\epsilonϵ选随机动作at{a}_{t}at(探索)
- 否则at=argmaxaQ(ϕ(st),a;θ){a}_{t}=\arg\max_{a}Q(\phi(s_{t}),a;\theta)at=argmaxaQ(ϕ(st),a;θ)(利用)
- ϵ\epsilonϵ 从 1.0 线性衰减到 0.1(前 100 万帧),之后固定为 0.1
步骤 2:执行动作并存储经验
- 执行动作 at{a}_tat,观测奖励rt{r}_{t}rt与新帧xt+1{x}_{t+1}xt+1
- 更新序列st+1{s}_{t+1}st+1并预处理ϕt+1=ϕ(st+1){\phi }_{t+1}=\phi(s_{t+1})ϕt+1=ϕ(st+1)
- 将转移(ϕt,at,rt,ϕt+1)\left(\phi_{t},a_{t},r_{t},\phi_{t+1}\right)(ϕt,at,rt,ϕt+1)存入D\mathcal{D}D
- 如果缓冲区已满,自动丢弃最旧的样本(FIFO)
步骤 3:从经验回放采样并计算目标值
- 从D\mathcal{D}D均匀随机采样小批量(ϕj,aj,rj,ϕj+1)\left(\phi_{j},a_{j},r_{j},\phi_{j+1}\right)(ϕj,aj,rj,ϕj+1)(批量大小通常为 32)
- 计算 TD 目标值:
yj={rj,terminal ϕj+1rj+γmaxa′Qtarget(ϕj+1,a′;θ−),non-terminal ϕj+1 y_{j}=\begin{cases} r_{j}, & \text{terminal } \phi_{j+1}\\ r_{j}+\gamma \max_{a'} Q_{\text{target}}(\phi_{j+1},a';\theta^-), & \text{non-terminal } \phi_{j+1} \end{cases} yj={rj,rj+γmaxa′Qtarget(ϕj+1,a′;θ−),terminal ϕj+1non-terminal ϕj+1- 如果下一状态是终止状态,目标值就是即时奖励
- 否则,使用目标网络计算稳定的目标值
- γ\gammaγ 是折扣因子(通常 0.99)
步骤 4:更新 Q 网络
- 最小化平方误差(或 Huber 损失):(yj−Q(ϕj,aj;θ))2{\left( y_{j}-Q(\phi_{j},a_{j};\theta)\right) }^{2}(yj−Q(ϕj,aj;θ))2
- yjy_jyj 是目标值(固定,不参与梯度计算)
- Q(ϕj,aj∣θ)Q(\phi_j, a_j|\theta)Q(ϕj,aj∣θ) 是在线网络的预测值
- 使用梯度下降更新 θ\thetaθ(学习率通常为 2.5×10−42.5 \times 10^{-4}2.5×10−4)
步骤 5:更新目标网络(硬更新)
- 每隔 CCC 步(通常 C=500C=500C=500),将在线网络参数复制到目标网络:θ−←θ\theta^- \leftarrow \thetaθ−←θ
- 使目标值变化缓慢,提高训练稳定性
-
-
循环结束,直到达到最大回合数或收敛
关键要点:
- 经验回放:打破时间相关性,提高数据效率
- 目标网络:提供稳定的 TD 目标,避免训练发散
- ϵ\epsilonϵ-贪婪策略:平衡探索和利用
- 卷积特征提取:从原始像素自动提取特征,无需手工设计
其次,由于样本间存在强相关性,直接从连续样本中学习效率低下;对样本进行随机化可打破相关性并降低方差。第三,在同策略学习中,当前参数决定下一批数据,易形成不良反馈,导致陷入局部极小甚至发散[25]。通过 经验回放,行为分布在时间上被平滑,缓解振荡/发散。注意,回放要求异策略更新(采样策略与当前策略不同),这也促使我们使用Q学习。
经验回放的三个优势:
- 打破时间相关性:随机采样打破连续样本间的强相关性,降低方差
- 提高数据效率:每个经验步骤可用于多次权重更新
- 缓解非平稳分布:行为分布在时间上被平滑,避免陷入局部极小或发散
- 离策略学习:经验回放要求异策略更新(采样策略与当前策略不同),Q 学习是离策略算法,因此适合使用经验回放
在实践中,我们的算法仅在回放内存中存储最近的NNN个经验元组,并在执行更新时从D\mathcal{D}D中均匀随机采样。这种方法在某些方面存在局限性,因为内存缓冲区无法区分重要的转移,并且由于有限的内存大小NNN,总是用最近的转移覆盖旧的转移。同样,均匀采样对回放内存中的所有转移赋予同等重要性。更复杂的采样策略可能会强调那些我们能从中学习最多的转移,类似于优先扫描[17]。
4.1 预处理与模型架构
直接处理原始Atari帧(210×160像素图像,128色调色板)计算量较大,因此我们采用基本预处理步骤以降低输入维度。原始帧首先从RGB表示转换为灰度图,然后下采样为110×84{110} \times {84}110×84图像。通过裁剪图像中大致包含游戏区域的84×84{84} \times {84}84×84区域,得到最终的输入表示。最终裁剪步骤仅因我们使用[11]中的GPU实现的2D卷积,其要求输入为正方形。在本文实验中,算法1中的函数ϕ\phiϕ对最近4帧历史进行预处理并堆叠,以生成QQQ函数的输入。
预处理步骤详解:
- 原始输入:210×160 RGB 图像,128 色调色板
- 步骤 1:RGB 转灰度:降低通道数,减少计算量
- 步骤 2:下采样:110×84 图像,降低分辨率
- 步骤 3:裁剪:84×84 区域,包含游戏区域,正方形便于卷积
- 步骤 4:帧堆叠:堆叠最近 4 帧,提供时序信息(速度、方向等)
- 最终输入:84×84×4 图像
- 目的:降低计算量,同时保留关键信息
使用神经网络对QQQ进行参数化有多种可能方式。由于QQQ将历史-动作对映射为其Q值的标量估计,一些先前方法[20,12]将历史和动作作为神经网络的输入。这类架构的主要缺点是需要单独的前向传播来计算每个动作的Q值,导致成本随动作数量线性增长。我们转而使用一种架构:为每个可能的动作设置单独的输出单元,且仅将状态表示作为神经网络的输入。输出对应于输入状态下各个动作的预测Q值。这种架构的主要优势是能够通过单次网络前向传播计算给定状态下所有可能动作的Q值。
网络架构设计要点:
- 问题:如果动作作为输入,需要为每个动作单独前向传播,计算成本随动作数量线性增长
- 解决方案:动作作为输出,状态作为输入
- 输入:状态表示 ϕ(s)\phi(s)ϕ(s)(84×84×4 图像)
- 输出:每个动作的 Q 值(动作数量个输出单元)
- 优势:单次前向传播即可计算所有动作的 Q 值,计算效率高
- 项目对应:
src/dqn.py中的DQN类,输出维度为动作空间大小
现在描述用于所有七个Atari游戏的具体架构。神经网络的输入是由ϕ\phiϕ生成的84×84×4{84} \times {84} \times 484×84×4图像。第一个隐藏层使用168×8{168} \times 8168×8个滤波器以步长4对输入图像进行卷积,并应用整流非线性激活函数[10,18]。第二个隐藏层使用324×4{324} \times 4324×4个滤波器以步长2进行卷积,同样后接整流非线性激活函数。最后一个隐藏层是全连接层,包含256个整流单元。输出层是全连接线性层,每个有效动作对应一个输出。在我们考虑的游戏中,有效动作数量在4到18之间变化。我们将通过我们的方法训练的卷积网络称为深度Q网络(DQN)。
DQN 网络架构详解:
- 输入层:84×84×4 图像(最近 4 帧堆叠,预处理后)
- 第一卷积层:
- 32 个 8×8 滤波器,步长 4
- ReLU 激活函数
- 输出:20×20×32 特征图
- 第二卷积层:
- 64 个 4×4 滤波器,步长 2
- ReLU 激活函数
- 输出:9×9×64 特征图
- 第三卷积层:
- 64 个 3×3 滤波器,步长 1
- ReLU 激活函数
- 输出:7×7×64 特征图
- 全连接层:512 个 ReLU 单元(将卷积特征展平后输入)
- 输出层:线性层,输出维度 = 动作空间大小(4-18 个动作)
- 总参数:约 1.5M
- 项目对应:
src/dqn.py中的DQN类实现了类似的网络结构(根据项目需求调整)
5 实验
6 结论
本文介绍了一种用于强化学习的新型深度学习模型,并展示了其仅以原始像素为输入就能掌握Atari 2600电脑游戏复杂控制策略的能力。我们还提出了一种在线Q学习变体,该变体将随机小批量更新与经验回放记忆相结合,以简化深度网络的强化学习训练。我们的方法在测试的七个游戏中有六个取得了最先进的结果,且未对架构或超参数进行任何调整。
7 总结与理解要点
7.1 DQN 核心思想总结
DQN 的核心创新:
- 经验回放:存储历史经验,随机采样打破时间相关性,提高数据效率
- 目标网络:维护独立的目标网络,提供稳定的 TD 目标,避免训练发散
- 卷积特征提取:使用 CNN 从原始像素自动提取特征,无需手工设计
- 统一架构:同一套网络架构和超参数适用于多个游戏,无需游戏特定调整
为什么 DQN 能工作:
- 经验回放:打破时间相关性,使神经网络训练稳定
- 目标网络:提供稳定的 TD 目标,避免目标值快速变化导致的发散
- 端到端学习:直接从原始像素学习,无需手工特征工程
- 深度网络:强大的特征提取能力,能够学习复杂的视觉模式
7.2 与项目实现的对应关系
算法组件对应:
- Q 网络 →
src/dqn.py中的DQN类 - 经验回放 →
DQNAgent.memory(deque) - 目标网络 →
DQNAgent.target_net - ϵ\epsilonϵ-贪婪策略 →
DQNAgent.act方法 - 硬更新 →
DQNAgent.update方法中的目标网络更新逻辑
超参数对应:
- 学习率 →
config.py中的LR(默认 2.5×10−42.5 \times 10^{-4}2.5×10−4) - 经验回放大小 →
config.py中的MEMORY_SIZE(默认 10610^6106) - 批量大小 →
config.py中的BATCH_SIZE(默认 512) - ϵ\epsilonϵ 参数 →
config.py中的EPSILON_START、EPSILON_DECAY、EPSILON_MIN - 目标网络更新频率 →
config.py中的TARGET_UPDATE(默认 500 步)
7.3 关键设计决策的理解
为什么使用经验回放?
- 强化学习中的样本是时序相关的,但神经网络训练需要 i.i.d. 样本
- 随机采样打破时间相关性,提高训练稳定性
- 重复利用历史经验,提高数据效率
为什么需要目标网络?
- 直接使用在线网络计算 TD 目标会导致训练不稳定
- 目标网络参数更新较慢,提供稳定的目标值
- 硬更新(每隔 CCC 步复制一次)比软更新简单,效果也很好
为什么动作作为输出而非输入?
- 如果动作作为输入,需要为每个动作单独前向传播,计算成本高
- 动作作为输出,单次前向传播即可计算所有动作的 Q 值,效率高
为什么使用卷积网络?
- 原始像素输入维度高,需要强大的特征提取能力
- 卷积网络能够自动学习空间特征,无需手工设计
- 参数共享,计算效率高
7.4 DQN vs DDPG vs TRPO vs PPO 综合对比
| 特性 | DQN | DDPG | TRPO | PPO |
|---|---|---|---|---|
| 动作空间 | 离散 | 连续 | 离散/连续 | 离散/连续 |
| 策略类型 | ϵ\epsilonϵ-贪婪 | 确定性策略 + 噪声 | 随机策略 | 随机策略 |
| 学习方式 | 离策略 | 离策略 | 在策略 | 在策略 |
| 网络架构 | 单一 Q 网络 | Actor + Critic | Actor + Critic | Actor + Critic |
| 目标更新 | 硬更新 | 软更新 | 无目标网络 | 无目标网络 |
| 稳定性保证 | 目标网络 | 软更新 | KL 约束 | 裁剪机制 |
| 实现复杂度 | 简单 | 中等 | 复杂 | 简单 |
| 样本效率 | 中等 | 中等 | 高 | 高 |
| 计算成本 | 低 | 中等 | 高 | 中等 |
| 适用场景 | 离散动作任务 | 连续控制任务 | 需要稳定训练 | 通用 RL 任务 |
7.5 常见问题与解答
Q1: DQN 与 Q 学习的主要区别是什么?
- Q 学习:使用表格或线性函数逼近器,适用于小规模问题
- DQN:使用深度神经网络,适用于大规模高维问题(如原始像素输入)
Q2: 为什么需要目标网络?
- 直接使用在线网络计算 TD 目标会导致训练不稳定
- 目标网络参数更新较慢,提供稳定的目标值
- 这是 DQN 成功的关键技术之一
Q3: 经验回放为什么重要?
- 打破时间相关性,使神经网络训练稳定
- 重复利用历史经验,提高数据效率
- 支持离策略学习,可以使用旧策略生成的经验
Q4: 如何选择超参数?
- 学习率:通常 10−410^{-4}10−4 到 10−310^{-3}10−3,从默认值开始
- ϵ\epsilonϵ 衰减:前 10% 训练时间线性衰减,之后固定
- 目标网络更新频率:通常 500-1000 步,越大越稳定但可能越慢
- 经验回放大小:通常 10610^6106,越大越好但受内存限制
Q5: 如何判断训练是否收敛?
- 观察训练曲线:奖励应该逐渐上升并趋于稳定
- 观察 Q 值:应该逐渐稳定,不再大幅波动
- 测试性能:在测试环境中评估策略性能
Q6: DQN 训练时 Q 值为什么会爆炸?
- 原因:
- 学习率过大,导致 Q 值更新过快
- 目标网络更新频率过低,目标值不稳定
- 奖励尺度不当,导致 Q 值过大
- 解决方案:
- 减小学习率(通常 10−410^{-4}10−4 到 10−310^{-3}10−3)
- 增加目标网络更新频率(通常 500-1000 步)
- 归一化奖励或使用奖励裁剪
- 使用梯度裁剪防止梯度爆炸
Q7: 为什么 DQN 在某些状态下 Q 值估计不准确?
- 原因:
- 经验回放缓冲区中某些状态-动作对样本不足
- 探索不充分,某些状态很少访问
- 函数逼近误差,网络容量不足
- 解决方案:
- 增加探索(提高 ϵ\epsilonϵ 或延长探索时间)
- 增加网络容量(更多隐藏层或单元)
- 使用优先经验回放,优先采样重要经验
- 增加训练时间,确保充分探索
7.6 实践建议
训练技巧:
- 从简单开始:先在简单环境上验证实现
- 监控训练:观察训练曲线、Q 值、探索率等
- 调整超参数:根据任务特点调整学习率、ϵ\epsilonϵ 等
- 保存检查点:定期保存模型,避免训练中断丢失
调参建议:
- 学习率:从默认值开始,如果训练不稳定则减小
- ϵ\epsilonϵ 衰减:确保有足够的探索时间
- 目标网络更新频率:越大越稳定但可能越慢
- 批量大小:越大越稳定,但需要更多内存
常见问题:
- 训练不稳定:减小学习率、增大目标网络更新频率、检查网络初始化
- 不收敛:检查奖励函数、增加探索、调整网络结构
- 性能不佳:检查超参数、增加训练时间、尝试不同网络结构
调试技巧:
- 监控关键指标:
- Q 值:应该逐渐增大并稳定,不应爆炸或为负
- TD 误差:应该逐渐减小
- 经验回放缓冲区利用率:确保缓冲区有足够样本
- 可视化分析:
- 绘制训练曲线:奖励、Q 值、损失函数
- 分析动作分布:确保探索充分
- 检查状态分布:确保覆盖状态空间
- 逐步调试:
- 先在简单环境验证实现
- 逐步增加环境复杂度
- 对比不同超参数设置的效果
7.7 进一步阅读
相关论文:
- Mnih et al. (2013): “Playing Atari with Deep Reinforcement Learning”(DQN 原始论文)
- Mnih et al. (2015): “Human-level control through deep reinforcement learning”(DQN 改进版)
- Van Hasselt et al. (2016): “Deep Reinforcement Learning with Double Q-learning”(Double DQN)
扩展算法:
- Double DQN:解决 Q 值高估问题
- 使用两个 Q 网络,一个选择动作,另一个评估动作
- 减少 Q 值高估,提高性能
- Dueling DQN:分离状态价值和优势函数
- 将 Q 值分解为状态价值 V(s)V(s)V(s) 和优势 A(s,a)A(s,a)A(s,a)
- Q(s,a)=V(s)+A(s,a)−maxa′A(s,a′)Q(s,a) = V(s) + A(s,a) - \max_{a'} A(s,a')Q(s,a)=V(s)+A(s,a)−maxa′A(s,a′)
- 提高学习效率,更快收敛
- Prioritized Experience Replay:优先采样重要经验
- 根据 TD 误差大小优先采样重要经验
- 提高学习效率,更快收敛
- Rainbow DQN:结合多种改进的 DQN 变体
- 结合 Double DQN、Dueling DQN、Prioritized Replay 等
- 在 Atari 游戏上达到 SOTA 性能
应用领域:
- 游戏 AI:雅达利游戏、围棋、星际争霸
- 机器人控制:离散动作控制任务
- 推荐系统:离散选择问题
- 资源调度:离散决策问题
7.8 算法选择指南
何时选择 DQN?
- ✅ 适用场景:
- 离散动作空间(动作数量有限)
- 需要稳定训练的场景
- 样本效率要求不高的场景
- 简单到中等复杂度的任务
- ❌ 不适用场景:
- 连续动作空间(应使用 DDPG)
- 需要高样本效率的场景(可考虑 PPO/TRPO)
- 动作空间非常大的场景(可考虑 Dueling DQN)
- 项目对应:车辆路径跟踪任务使用离散转向角,适合 DQN
- 动作空间:5-9 个离散转向角
- 状态空间:横向误差、航向误差(低维)
- 奖励函数:基于跟踪误差和控制平滑性
- 建议:可以尝试 Double DQN 或 Dueling DQN 提升性能
与其他算法的选择建议:
- DQN vs DDPG:动作空间离散用 DQN,连续用 DDPG
- DQN vs PPO/TRPO:需要高样本效率用 PPO/TRPO,简单任务用 DQN
- DQN vs Double DQN:Double DQN 通常性能更好,建议优先使用
- DQN vs Dueling DQN:大动作空间用 Dueling DQN,小动作空间差异不大
7.9 性能优化技巧
提高训练速度:
- 使用 GPU:Q 网络前向和反向传播可以在 GPU 上加速
- 批量大小:增大批量大小可以提高 GPU 利用率
- 经验回放采样:使用多线程或异步采样提高效率
- 目标网络更新:适当减少更新频率(但不要太小)
提高样本效率:
- 优先经验回放:优先采样 TD 误差大的经验
- Double DQN:减少 Q 值高估,提高学习效率
- Dueling DQN:大动作空间时提高泛化能力
- 网络容量:适当增加网络容量,提高表达能力
提高稳定性:
- 目标网络:确保目标网络更新频率合适
- 梯度裁剪:防止梯度爆炸
- 奖励归一化:归一化奖励到合理范围
- 网络初始化:使用合适的初始化方法
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)