<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.swarma.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=DeepQ</id>
	<title>集智百科 - 复杂系统|人工智能|复杂科学|复杂网络|自组织 - 用户贡献 [zh-cn]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.swarma.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=DeepQ"/>
	<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php/%E7%89%B9%E6%AE%8A:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/DeepQ"/>
	<updated>2026-11-04T19:01:58Z</updated>
	<subtitle>用户贡献</subtitle>
	<generator>MediaWiki 1.35.0</generator>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45503</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45503"/>
		<updated>2025-07-11T02:15:25Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用[[ϵ-greedy策略]]进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如右图所示：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率&amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; ，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
在MDP中，策略与价值函数是强化学习的核心概念，它们共同构成了智能体学习与决策的理论基础。以下是关于策略与价值函数的定义：&lt;br /&gt;
*'''策略 &amp;lt;math&amp;gt; π(a | s) &amp;lt;/math&amp;gt;'''：在状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​下选择动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 的概率分布。&lt;br /&gt;
*'''状态值函数&amp;lt;math&amp;gt; V_{π}(s) &amp;lt;/math&amp;gt;'''：在策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​ 下，从状态&amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​ 开始，期望获得的累计奖励。其定义为：&lt;br /&gt;
&amp;lt;math&amp;gt;\displaystyle{V_{π}(s) = \mathbb{E}{\pi} \left[ \sum{t=0}^{\infty} \gamma^t r_{t+1} \middle| s_0 = s \right]}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中&amp;lt;math&amp;gt;\displaystyle{ \gamma \in [0, 1) }&amp;lt;/math&amp;gt;为折扣因子，控制未来奖励的权重；&amp;lt;math&amp;gt;r_{t+1}&amp;lt;/math&amp;gt;​为从&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​到&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;​获得的即时奖励。&lt;br /&gt;
&lt;br /&gt;
*'''动作值函数 &amp;lt;math&amp;gt; Q_{π}(s, a) &amp;lt;/math&amp;gt;'''：在策略&amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​下，从状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​开始，采取动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 后，期望获得的累计奖励。其定义为：&lt;br /&gt;
&amp;lt;math&amp;gt;\displaystyle{Q_{π}(s, a) = \mathbb{E}{\pi} \left[ \sum{t=0}^{\infty} \gamma^t r_{t+1} \middle| s_0 = s,a_0 = a \right]}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 '''&amp;lt;math&amp;gt; Q(s, a) &amp;lt;/math&amp;gt;''' 表示智能体在状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​下采取动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​  后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 对应的&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：&amp;lt;math&amp;gt;θ &amp;lt;/math&amp;gt;为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|600x600像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;为历史交互特征，动作  &amp;lt;math&amp;gt;a_{t} &amp;lt;/math&amp;gt;为待推荐物品，奖励  &amp;lt;math&amp;gt;r_{t} &amp;lt;/math&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（ &amp;lt;math&amp;gt;s_{t}→s_{t+1}&amp;lt;/math&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励&amp;lt;math&amp;gt; R_{t}=∑ γ_{k} r_{t+k}&amp;lt;/math&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → [[LSTM编码]] → 状态向量 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 &amp;lt;math&amp;gt;{a_{1},a_{2},...,a_{N}}&amp;lt;/math&amp;gt;（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
此词条由邹佳玮、罗福海编写。&lt;br /&gt;
&lt;br /&gt;
'''本词条内容源自wikipedia及公开资料，遵守 CC3.0协议。'''&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45454</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45454"/>
		<updated>2025-07-06T11:38:33Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用[[ϵ-greedy策略]]进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如右图所示：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率&amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; ，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
在MDP中，策略与价值函数是强化学习的核心概念，它们共同构成了智能体学习与决策的理论基础。以下是关于策略与价值函数的定义：&lt;br /&gt;
*'''策略 &amp;lt;math&amp;gt; π(a | s) &amp;lt;/math&amp;gt;'''：在状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​下选择动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 的概率分布。&lt;br /&gt;
*'''状态值函数&amp;lt;math&amp;gt; V_{π}(s) &amp;lt;/math&amp;gt;'''：在策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​ 下，从状态&amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​ 开始，期望获得的累计奖励。其定义为：&lt;br /&gt;
&amp;lt;math&amp;gt;\displaystyle{V^{\pi}(s) = \mathbb{E}{\pi} \left[ \sum{t=0}^{\infty} \gamma^t r_{t+1} \middle| s_0 = s \right]}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中&amp;lt;math&amp;gt;\displaystyle{ \gamma \in [0, 1) }&amp;lt;/math&amp;gt;为折扣因子，控制未来奖励的权重；&amp;lt;math&amp;gt;r_{t+1}&amp;lt;/math&amp;gt;​为从&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​到&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;​获得的即时奖励。&lt;br /&gt;
&lt;br /&gt;
*'''动作值函数 &amp;lt;math&amp;gt; Q_{π}(s, a) &amp;lt;/math&amp;gt;'''：在策略&amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​下，从状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​开始，采取动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 后，期望获得的累计奖励。其定义为：&lt;br /&gt;
&amp;lt;math&amp;gt;\displaystyle{Q^{\pi}(s, a) = \mathbb{E}{\pi} \left[ \sum{t=0}^{\infty} \gamma^t r_{t+1} \middle| s_0 = s,a_0 = a \right]}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 '''&amp;lt;math&amp;gt; Q(s, a) &amp;lt;/math&amp;gt;''' 表示智能体在状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​下采取动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​  后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 对应的&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：&amp;lt;math&amp;gt;θ &amp;lt;/math&amp;gt;为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|600x600像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;为历史交互特征，动作  &amp;lt;math&amp;gt;a_{t} &amp;lt;/math&amp;gt;为待推荐物品，奖励  &amp;lt;math&amp;gt;r_{t} &amp;lt;/math&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（ &amp;lt;math&amp;gt;s_{t}→s_{t+1}&amp;lt;/math&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励&amp;lt;math&amp;gt; R_{t}=∑ γ_{k} r_{t+k}&amp;lt;/math&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → [[LSTM编码]] → 状态向量 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 &amp;lt;math&amp;gt;{a_{1},a_{2},...,a_{N}}&amp;lt;/math&amp;gt;（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
此词条由邹佳玮、罗福海编写。&lt;br /&gt;
&lt;br /&gt;
'''本词条内容源自wikipedia及公开资料，遵守 CC3.0协议。'''&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45453</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45453"/>
		<updated>2025-07-06T11:36:07Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* 策略与价值函数 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用[[ϵ-greedy策略]]进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如右图所示：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率&amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; ，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
在MDP中，策略与价值函数是强化学习的核心概念，它们共同构成了智能体学习与决策的理论基础。以下是关于策略与价值函数的定义：&lt;br /&gt;
*'''策略 &amp;lt;math&amp;gt; π(a | s) &amp;lt;/math&amp;gt;'''：在状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​下选择动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 的概率分布。&lt;br /&gt;
*'''状态值函数&amp;lt;math&amp;gt; V_{π}(s) &amp;lt;/math&amp;gt;'''：在策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​ 下，从状态&amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​ 开始，期望获得的累计奖励。其定义为：&lt;br /&gt;
&amp;lt;math&amp;gt;\displaystyle{V^{\pi}(s) = \mathbb{E}{\pi} \left[ \sum{t=0}^{\infty} \gamma^t r_{t+1} \middle| s_0 = s \right]}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中&amp;lt;math&amp;gt;\displaystyle{ \gamma \in [0, 1) }&amp;lt;/math&amp;gt;为折扣因子，控制未来奖励的权重；获得的即时奖励。&lt;br /&gt;
&lt;br /&gt;
*'''动作值函数 &amp;lt;math&amp;gt; Q_{π}(s, a) &amp;lt;/math&amp;gt;'''：在策略&amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​下，从状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​开始，采取动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 后，期望获得的累计奖励。其定义为：&lt;br /&gt;
&amp;lt;math&amp;gt;\displaystyle{Q^{\pi}(s, a) = \mathbb{E}{\pi} \left[ \sum{t=0}^{\infty} \gamma^t r_{t+1} \middle| s_0 = s,a_0 = a \right]}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 '''&amp;lt;math&amp;gt; Q(s, a) &amp;lt;/math&amp;gt;''' 表示智能体在状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​下采取动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​  后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 对应的&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：&amp;lt;math&amp;gt;θ &amp;lt;/math&amp;gt;为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|600x600像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;为历史交互特征，动作  &amp;lt;math&amp;gt;a_{t} &amp;lt;/math&amp;gt;为待推荐物品，奖励  &amp;lt;math&amp;gt;r_{t} &amp;lt;/math&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（ &amp;lt;math&amp;gt;s_{t}→s_{t+1}&amp;lt;/math&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励&amp;lt;math&amp;gt; R_{t}=∑ γ_{k} r_{t+k}&amp;lt;/math&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → [[LSTM编码]] → 状态向量 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 &amp;lt;math&amp;gt;{a_{1},a_{2},...,a_{N}}&amp;lt;/math&amp;gt;（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
此词条由邹佳玮、罗福海编写。&lt;br /&gt;
&lt;br /&gt;
'''本词条内容源自wikipedia及公开资料，遵守 CC3.0协议。'''&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45452</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45452"/>
		<updated>2025-07-06T11:34:32Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用[[ϵ-greedy策略]]进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如右图所示：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率&amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; ，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
在MDP中，策略与价值函数是强化学习的核心概念，它们共同构成了智能体学习与决策的理论基础。以下是关于策略与价值函数的定义：&lt;br /&gt;
*'''策略 &amp;lt;math&amp;gt; π(a | s) &amp;lt;/math&amp;gt;'''：在状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​下选择动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 的概率分布。&lt;br /&gt;
*'''状态值函数&amp;lt;math&amp;gt; V_{π}(s) &amp;lt;/math&amp;gt;'''：在策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​ 下，从状态&amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​ 开始，期望获得的累计奖励。其定义为：&lt;br /&gt;
&amp;lt;math&amp;gt;\displaystyle{V^{\pi}(s) = \mathbb{E}{\pi} \left[ \sum{t=0}^{\infty} \gamma^t r_{t+1} \middle| s_0 = s \right]}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中&amp;lt;math&amp;gt;\gamma^t&amp;lt;/math&amp;gt;为折扣因子，控制未来奖励的权重；获得的即时奖励。&lt;br /&gt;
&lt;br /&gt;
*'''动作值函数 &amp;lt;math&amp;gt; Q_{π}(s, a) &amp;lt;/math&amp;gt;'''：在策略&amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​下，从状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​开始，采取动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 后，期望获得的累计奖励。其定义为：&lt;br /&gt;
&amp;lt;math&amp;gt;\displaystyle{Q^{\pi}(s, a) = \mathbb{E}{\pi} \left[ \sum{t=0}^{\infty} \gamma^t r_{t+1} \middle| s_0 = s,a_0 = a \right]}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 '''&amp;lt;math&amp;gt; Q(s, a) &amp;lt;/math&amp;gt;''' 表示智能体在状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​下采取动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​  后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 对应的&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：&amp;lt;math&amp;gt;θ &amp;lt;/math&amp;gt;为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|600x600像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;为历史交互特征，动作  &amp;lt;math&amp;gt;a_{t} &amp;lt;/math&amp;gt;为待推荐物品，奖励  &amp;lt;math&amp;gt;r_{t} &amp;lt;/math&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（ &amp;lt;math&amp;gt;s_{t}→s_{t+1}&amp;lt;/math&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励&amp;lt;math&amp;gt; R_{t}=∑ γ_{k} r_{t+k}&amp;lt;/math&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → [[LSTM编码]] → 状态向量 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 &amp;lt;math&amp;gt;{a_{1},a_{2},...,a_{N}}&amp;lt;/math&amp;gt;（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
此词条由邹佳玮、罗福海编写。&lt;br /&gt;
&lt;br /&gt;
'''本词条内容源自wikipedia及公开资料，遵守 CC3.0协议。'''&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45451</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45451"/>
		<updated>2025-07-06T11:31:06Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用[[ϵ-greedy策略]]进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如右图所示：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率&amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; ，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
在MDP中，策略与价值函数是强化学习的核心概念，它们共同构成了智能体学习与决策的理论基础。以下是关于策略与价值函数的定义：&lt;br /&gt;
*'''策略 &amp;lt;math&amp;gt; π(a | s) &amp;lt;/math&amp;gt;'''：在状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​下选择动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 的概率分布。&lt;br /&gt;
*'''状态值函数&amp;lt;math&amp;gt; V_{π}(s) &amp;lt;/math&amp;gt;'''：在策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​ 下，从状态&amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​ 开始，期望获得的累计奖励。其定义为：&lt;br /&gt;
&amp;lt;math&amp;gt;\displaystyle{V^{\pi}(s) = \mathbb{E}{\pi} \left[ \sum{t=0}^{\infty} \gamma^t r_{t+1} \middle| s_0 = s \right]}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''动作值函数 &amp;lt;math&amp;gt; Q_{π}(s, a) &amp;lt;/math&amp;gt;'''：在策略&amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​下，从状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​开始，采取动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 后，期望获得的累计奖励。其定义为：&lt;br /&gt;
&amp;lt;math&amp;gt;\displaystyle{Q^{\pi}(s, a) = \mathbb{E}{\pi} \left[ \sum{t=0}^{\infty} \gamma^t r_{t+1} \middle| s_0 = s,, a_0 = a \right]}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 '''&amp;lt;math&amp;gt; Q(s, a) &amp;lt;/math&amp;gt;''' 表示智能体在状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​下采取动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​  后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 对应的&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：&amp;lt;math&amp;gt;θ &amp;lt;/math&amp;gt;为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|600x600像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;为历史交互特征，动作  &amp;lt;math&amp;gt;a_{t} &amp;lt;/math&amp;gt;为待推荐物品，奖励  &amp;lt;math&amp;gt;r_{t} &amp;lt;/math&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（ &amp;lt;math&amp;gt;s_{t}→s_{t+1}&amp;lt;/math&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励&amp;lt;math&amp;gt; R_{t}=∑ γ_{k} r_{t+k}&amp;lt;/math&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → [[LSTM编码]] → 状态向量 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 &amp;lt;math&amp;gt;{a_{1},a_{2},...,a_{N}}&amp;lt;/math&amp;gt;（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
此词条由邹佳玮、罗福海编写。&lt;br /&gt;
&lt;br /&gt;
'''本词条内容源自wikipedia及公开资料，遵守 CC3.0协议。'''&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45450</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45450"/>
		<updated>2025-07-06T11:29:37Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* 策略与价值函数 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用[[ϵ-greedy策略]]进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如右图所示：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率&amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; ，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
在MDP中，策略与价值函数是强化学习的核心概念，它们共同构成了智能体学习与决策的理论基础。以下是关于策略与价值函数的定义：&lt;br /&gt;
*'''策略 &amp;lt;math&amp;gt; π(a | s) &amp;lt;/math&amp;gt;'''：在状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​下选择动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 的概率分布。&lt;br /&gt;
*'''状态值函数&amp;lt;math&amp;gt; V_{π}(s) &amp;lt;/math&amp;gt;'''：在策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​ 下，从状态&amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​ 开始，期望获得的累计奖励。其定义为：&lt;br /&gt;
&amp;lt;math&amp;gt;\displaystyle{V^{\pi}(s) = \mathbb{E}{\pi} \left[ \sum{t=0}^{\infty} \gamma^t r_{t+1} ,\middle|, s_0 = s \right]}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''动作值函数 &amp;lt;math&amp;gt; Q_{π}(s, a) &amp;lt;/math&amp;gt;'''：在策略&amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​下，从状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​开始，采取动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 后，期望获得的累计奖励。其定义为：&lt;br /&gt;
&amp;lt;math&amp;gt;\displaystyle{Q^{\pi}(s, a) = \mathbb{E}{\pi} \left[ \sum{t=0}^{\infty} \gamma^t r_{t+1} ,\middle|, s_0 = s,, a_0 = a \right]}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 '''&amp;lt;math&amp;gt; Q(s, a) &amp;lt;/math&amp;gt;''' 表示智能体在状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​下采取动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​  后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 对应的&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：&amp;lt;math&amp;gt;θ &amp;lt;/math&amp;gt;为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|600x600像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;为历史交互特征，动作  &amp;lt;math&amp;gt;a_{t} &amp;lt;/math&amp;gt;为待推荐物品，奖励  &amp;lt;math&amp;gt;r_{t} &amp;lt;/math&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（ &amp;lt;math&amp;gt;s_{t}→s_{t+1}&amp;lt;/math&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励&amp;lt;math&amp;gt; R_{t}=∑ γ_{k} r_{t+k}&amp;lt;/math&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → [[LSTM编码]] → 状态向量 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 &amp;lt;math&amp;gt;{a_{1},a_{2},...,a_{N}}&amp;lt;/math&amp;gt;（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
此词条由邹佳玮、罗福海编写。&lt;br /&gt;
&lt;br /&gt;
'''本词条内容源自wikipedia及公开资料，遵守 CC3.0协议。'''&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45449</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45449"/>
		<updated>2025-07-06T11:27:40Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* 策略与价值函数 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用[[ϵ-greedy策略]]进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如右图所示：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率&amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; ，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
在MDP中，策略与价值函数是强化学习的核心概念，它们共同构成了智能体学习与决策的理论基础。以下是关于策略与价值函数的定义：&lt;br /&gt;
*'''策略 &amp;lt;math&amp;gt; π(a | s) &amp;lt;/math&amp;gt;'''：在状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​下选择动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 的概率分布。&lt;br /&gt;
*'''状态值函数&amp;lt;math&amp;gt; V_{π}(s) &amp;lt;/math&amp;gt;'''：在策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​ 下，从状态&amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​ 开始，期望获得的累计奖励。其定义为：&lt;br /&gt;
&amp;lt;math&amp;gt;\displaystyle{V^{\pi}(s) = \mathbb{E}{\pi} \left[ \sum{t=0}^{\infty} \gamma^t r_{t+1} ,\middle|, s_0 = s \right]}&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''动作值函数 &amp;lt;math&amp;gt; Q_{π}(s, a) &amp;lt;/math&amp;gt;'''：在策略&amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​下，从状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​开始，采取动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 '''&amp;lt;math&amp;gt; Q(s, a) &amp;lt;/math&amp;gt;''' 表示智能体在状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​下采取动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​  后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 对应的&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：&amp;lt;math&amp;gt;θ &amp;lt;/math&amp;gt;为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|600x600像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;为历史交互特征，动作  &amp;lt;math&amp;gt;a_{t} &amp;lt;/math&amp;gt;为待推荐物品，奖励  &amp;lt;math&amp;gt;r_{t} &amp;lt;/math&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（ &amp;lt;math&amp;gt;s_{t}→s_{t+1}&amp;lt;/math&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励&amp;lt;math&amp;gt; R_{t}=∑ γ_{k} r_{t+k}&amp;lt;/math&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → [[LSTM编码]] → 状态向量 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 &amp;lt;math&amp;gt;{a_{1},a_{2},...,a_{N}}&amp;lt;/math&amp;gt;（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
此词条由邹佳玮、罗福海编写。&lt;br /&gt;
&lt;br /&gt;
'''本词条内容源自wikipedia及公开资料，遵守 CC3.0协议。'''&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45448</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45448"/>
		<updated>2025-07-06T11:25:21Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用[[ϵ-greedy策略]]进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如右图所示：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率&amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; ，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
在MDP中，策略与价值函数是强化学习的核心概念，它们共同构成了智能体学习与决策的理论基础。以下是关于策略与价值函数的定义：&lt;br /&gt;
*'''策略 &amp;lt;math&amp;gt; π(a | s) &amp;lt;/math&amp;gt;'''：在状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​下选择动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 的概率分布。&lt;br /&gt;
*'''状态值函数&amp;lt;math&amp;gt; V_{π}(s) &amp;lt;/math&amp;gt;'''：在策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​ 下，从状态&amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​ 开始，期望获得的累计奖励。其定义为：&lt;br /&gt;
&amp;lt;math&amp;gt;\displaystyle{V^{\pi}(s) = \mathbb{E}{\pi} \left[ \sum{t=0}^{\infty} \gamma^t r_{t+1} ,\middle|, s_0 = s \right]}&amp;lt;math&amp;gt;&lt;br /&gt;
*'''动作值函数 &amp;lt;math&amp;gt; Q_{π}(s, a) &amp;lt;/math&amp;gt;'''：在策略&amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​下，从状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​开始，采取动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 '''&amp;lt;math&amp;gt; Q(s, a) &amp;lt;/math&amp;gt;''' 表示智能体在状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​下采取动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​  后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 对应的&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：&amp;lt;math&amp;gt;θ &amp;lt;/math&amp;gt;为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|600x600像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;为历史交互特征，动作  &amp;lt;math&amp;gt;a_{t} &amp;lt;/math&amp;gt;为待推荐物品，奖励  &amp;lt;math&amp;gt;r_{t} &amp;lt;/math&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（ &amp;lt;math&amp;gt;s_{t}→s_{t+1}&amp;lt;/math&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励&amp;lt;math&amp;gt; R_{t}=∑ γ_{k} r_{t+k}&amp;lt;/math&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → [[LSTM编码]] → 状态向量 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 &amp;lt;math&amp;gt;{a_{1},a_{2},...,a_{N}}&amp;lt;/math&amp;gt;（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
此词条由邹佳玮、罗福海编写。&lt;br /&gt;
&lt;br /&gt;
'''本词条内容源自wikipedia及公开资料，遵守 CC3.0协议。'''&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45447</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45447"/>
		<updated>2025-07-06T11:05:55Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用[[ϵ-greedy策略]]进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如右图所示：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率&amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; ，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
在MDP中，策略与价值函数是强化学习的核心概念，它们共同构成了智能体学习与决策的理论基础。以下是关于策略与价值函数的定义：&lt;br /&gt;
*'''策略 &amp;lt;math&amp;gt; π(a | s) &amp;lt;/math&amp;gt;'''：在状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​下选择动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 的概率分布。&lt;br /&gt;
*'''状态值函数&amp;lt;math&amp;gt; V_{π}(s) &amp;lt;/math&amp;gt;'''：在策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​ 下，从状态&amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​ 开始，期望获得的累计奖励。其定义为：&lt;br /&gt;
*'''动作值函数 &amp;lt;math&amp;gt; Q_{π}(s, a) &amp;lt;/math&amp;gt;'''：在策略&amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​下，从状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​开始，采取动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 '''&amp;lt;math&amp;gt; Q(s, a) &amp;lt;/math&amp;gt;''' 表示智能体在状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​下采取动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​  后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 对应的&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：&amp;lt;math&amp;gt;θ &amp;lt;/math&amp;gt;为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|600x600像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;为历史交互特征，动作  &amp;lt;math&amp;gt;a_{t} &amp;lt;/math&amp;gt;为待推荐物品，奖励  &amp;lt;math&amp;gt;r_{t} &amp;lt;/math&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（ &amp;lt;math&amp;gt;s_{t}→s_{t+1}&amp;lt;/math&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励&amp;lt;math&amp;gt; R_{t}=∑ γ_{k} r_{t+k}&amp;lt;/math&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → [[LSTM编码]] → 状态向量 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 &amp;lt;math&amp;gt;{a_{1},a_{2},...,a_{N}}&amp;lt;/math&amp;gt;（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
此词条由邹佳玮、罗福海编写。&lt;br /&gt;
&lt;br /&gt;
'''本词条内容源自wikipedia及公开资料，遵守 CC3.0协议。'''&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45358</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45358"/>
		<updated>2025-07-05T07:52:07Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用[[ϵ-greedy策略]]进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率&amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; ，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 &amp;lt;math&amp;gt; π(a | s) &amp;lt;/math&amp;gt;'''：在状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​下选择动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 的概率分布。&lt;br /&gt;
*'''状态值函数&amp;lt;math&amp;gt; V_{π}(s) &amp;lt;/math&amp;gt;'''：在策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​ 下，从状态&amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​ 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 &amp;lt;math&amp;gt; Q_{π}(s, a) &amp;lt;/math&amp;gt;'''：在策略&amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​下，从状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​开始，采取动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 '''&amp;lt;math&amp;gt; Q(s, a) &amp;lt;/math&amp;gt;''' 表示智能体在状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​下采取动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​  后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 对应的&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：&amp;lt;math&amp;gt;θ &amp;lt;/math&amp;gt;为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|600x600像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;为历史交互特征，动作  &amp;lt;math&amp;gt;a_{t} &amp;lt;/math&amp;gt;为待推荐物品，奖励  &amp;lt;math&amp;gt;r_{t} &amp;lt;/math&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（ &amp;lt;math&amp;gt;s_{t}→s_{t+1}&amp;lt;/math&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励&amp;lt;math&amp;gt; R_{t}=∑ γ_{k} r_{t+k}&amp;lt;/math&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → [[LSTM编码]] → 状态向量 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 &amp;lt;math&amp;gt;{a_{1},a_{2},...,a_{N}}&amp;lt;/math&amp;gt;（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
此词条由邹佳玮、罗福海编写。&lt;br /&gt;
&lt;br /&gt;
'''本词条内容源自wikipedia及公开资料，遵守 CC3.0协议。'''&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45357</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45357"/>
		<updated>2025-07-05T07:50:33Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用[[ϵ-greedy策略]]进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率&amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; ，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)&amp;lt;math&amp;gt; π(a | s) &amp;lt;/math&amp;gt;'''：在状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​下选择动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 的概率分布。&lt;br /&gt;
*'''状态值函数&amp;lt;math&amp;gt; V_{π}(s) &amp;lt;/math&amp;gt;'''：在策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​ 下，从状态&amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​ 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 &amp;lt;math&amp;gt; Q_{π}(s, a) &amp;lt;/math&amp;gt;'''：在策略&amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​下，从状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​开始，采取动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 对应的&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：&amp;lt;math&amp;gt;θ &amp;lt;/math&amp;gt;为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|600x600像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;为历史交互特征，动作  &amp;lt;math&amp;gt;a_{t} &amp;lt;/math&amp;gt;为待推荐物品，奖励  &amp;lt;math&amp;gt;r_{t} &amp;lt;/math&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（ &amp;lt;math&amp;gt;s_{t}→s_{t+1}&amp;lt;/math&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励&amp;lt;math&amp;gt; R_{t}=∑ γ_{k} r_{t+k}&amp;lt;/math&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → [[LSTM编码]] → 状态向量 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 &amp;lt;math&amp;gt;{a_{1},a_{2},...,a_{N}}&amp;lt;/math&amp;gt;（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
此词条由邹佳玮、罗福海编写。&lt;br /&gt;
&lt;br /&gt;
'''本词条内容源自wikipedia及公开资料，遵守 CC3.0协议。'''&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45356</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45356"/>
		<updated>2025-07-05T07:47:34Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用[[ϵ-greedy策略]]进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率&amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; ，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​下选择动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 &amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​ 下，从状态&amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​ 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略&amp;lt;math&amp;gt;π&amp;lt;/math&amp;gt;​下，从状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;​开始，采取动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;​ 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 对应的&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：&amp;lt;math&amp;gt;θ &amp;lt;/math&amp;gt;为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|600x600像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;为历史交互特征，动作  &amp;lt;math&amp;gt;a_{t} &amp;lt;/math&amp;gt;为待推荐物品，奖励  &amp;lt;math&amp;gt;r_{t} &amp;lt;/math&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（ &amp;lt;math&amp;gt;s_{t}→s_{t+1}&amp;lt;/math&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励&amp;lt;math&amp;gt; R_{t}=∑ γ_{k} r_{t+k}&amp;lt;/math&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → [[LSTM编码]] → 状态向量 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 &amp;lt;math&amp;gt;{a_{1},a_{2},...,a_{N}}&amp;lt;/math&amp;gt;（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
此词条由邹佳玮、罗福海编写。&lt;br /&gt;
&lt;br /&gt;
'''本词条内容源自wikipedia及公开资料，遵守 CC3.0协议。'''&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45349</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45349"/>
		<updated>2025-07-05T06:24:30Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* 目标网络（Target Network）的引入与参数更新策略 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用[[ϵ-greedy策略]]进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 对应的&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：&amp;lt;math&amp;gt;θ &amp;lt;/math&amp;gt;为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|600x600像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;为历史交互特征，动作  &amp;lt;math&amp;gt;a_{t} &amp;lt;/math&amp;gt;为待推荐物品，奖励  &amp;lt;math&amp;gt;r_{t} &amp;lt;/math&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（ &amp;lt;math&amp;gt;s_{t}→s_{t+1}&amp;lt;/math&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励&amp;lt;math&amp;gt; R_{t}=∑ γ_{k} r_{t+k}&amp;lt;/math&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → [[LSTM编码]] → 状态向量 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 &amp;lt;math&amp;gt;{a_{1},a_{2},...,a_{N}}&amp;lt;/math&amp;gt;（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
此词条由邹佳玮、罗福海编写。&lt;br /&gt;
&lt;br /&gt;
'''本词条内容源自wikipedia及公开资料，遵守 CC3.0协议。'''&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45348</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=45348"/>
		<updated>2025-07-05T06:23:49Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* 使用神经网络逼近 Q 值函数 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用[[ϵ-greedy策略]]进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 对应的&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：&amp;lt;math&amp;gt;θ &amp;lt;/math&amp;gt;为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|600x600像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;为历史交互特征，动作  &amp;lt;math&amp;gt;a_{t} &amp;lt;/math&amp;gt;为待推荐物品，奖励  &amp;lt;math&amp;gt;r_{t} &amp;lt;/math&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（ &amp;lt;math&amp;gt;s_{t}→s_{t+1}&amp;lt;/math&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励&amp;lt;math&amp;gt; R_{t}=∑ γ_{k} r_{t+k}&amp;lt;/math&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → [[LSTM编码]] → 状态向量 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 &amp;lt;math&amp;gt;{a_{1},a_{2},...,a_{N}}&amp;lt;/math&amp;gt;（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|无|500x500像素]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
此词条由邹佳玮、罗福海编写。&lt;br /&gt;
&lt;br /&gt;
'''本词条内容源自wikipedia及公开资料，遵守 CC3.0协议。'''&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44992</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44992"/>
		<updated>2025-06-16T14:09:22Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* 推荐系统中的策略优化 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用[[ϵ-greedy策略]]进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 对应的&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：&amp;lt;math&amp;gt;θ &amp;lt;/math&amp;gt;为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;为历史交互特征，动作  &amp;lt;math&amp;gt;a_{t} &amp;lt;/math&amp;gt;为待推荐物品，奖励  &amp;lt;math&amp;gt;r_{t} &amp;lt;/math&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（ &amp;lt;math&amp;gt;s_{t}→s_{t+1}&amp;lt;/math&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励&amp;lt;math&amp;gt; R_{t}=∑ γ_{k} r_{t+k}&amp;lt;/math&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → [[LSTM编码]] → 状态向量 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 &amp;lt;math&amp;gt;{a_{1},a_{2},...,a_{N}}&amp;lt;/math&amp;gt;（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44991</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44991"/>
		<updated>2025-06-16T14:08:28Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* 推荐系统中的策略优化 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用[[ϵ-greedy策略]]进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 对应的&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：&amp;lt;math&amp;gt;θ &amp;lt;/math&amp;gt;为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（ &amp;lt;math&amp;gt;s_{t}→s_{t+1}&amp;lt;/math&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励&amp;lt;math&amp;gt; R_{t}=∑ γ_{k} r_{t+k}&amp;lt;/math&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → [[LSTM编码]] → 状态向量 &amp;lt;math&amp;gt;s_{t}&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 &amp;lt;math&amp;gt;{a_{1},a_{2},...,a_{N}}&amp;lt;/math&amp;gt;（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44990</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44990"/>
		<updated>2025-06-16T14:04:53Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* DQN 的应用领域 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用[[ϵ-greedy策略]]进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 对应的&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：&amp;lt;math&amp;gt;θ &amp;lt;/math&amp;gt;为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44989</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44989"/>
		<updated>2025-06-16T14:04:23Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* DQN 的应用领域 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用[[ϵ-greedy策略]]进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 对应的&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：&amp;lt;math&amp;gt;θ &amp;lt;/math&amp;gt;为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44988</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44988"/>
		<updated>2025-06-16T14:03:48Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* 机器人控制与路径规划 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用[[ϵ-greedy策略]]进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 对应的&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：&amp;lt;math&amp;gt;θ &amp;lt;/math&amp;gt;为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44987</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44987"/>
		<updated>2025-06-16T14:03:19Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* DQN 的应用领域 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用[[ϵ-greedy策略]]进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 对应的&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：&amp;lt;math&amp;gt;θ &amp;lt;/math&amp;gt;为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44986</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44986"/>
		<updated>2025-06-16T14:02:33Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* 使用神经网络逼近 Q 值函数 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用[[ϵ-greedy策略]]进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 对应的&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：&amp;lt;math&amp;gt;θ &amp;lt;/math&amp;gt;为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44985</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44985"/>
		<updated>2025-06-16T14:02:17Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* 使用神经网络逼近 Q 值函数 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用[[ϵ-greedy策略]]进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; 对应的&amp;lt;/math&amp;gt;Q&amp;lt;/math&amp;gt;值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：&amp;lt;math&amp;gt;θ &amp;lt;/math&amp;gt;为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44984</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44984"/>
		<updated>2025-06-16T14:01:24Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* 模型的细节 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用[[ϵ-greedy策略]]进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44983</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44983"/>
		<updated>2025-06-16T14:01:04Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* 模型的细节 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本&amp;lt;math&amp;gt;(s_{t}, a_{t}, r_{t}, s_{t+1})&amp;lt;/math&amp;gt;，并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44982</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44982"/>
		<updated>2025-06-16T13:59:15Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* 具体算法及其训练流程 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ))^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44981</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44981"/>
		<updated>2025-06-16T13:58:36Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* 具体算法及其训练流程 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =argmax_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} ∑(y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44980</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44980"/>
		<updated>2025-06-16T13:57:19Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* 具体算法及其训练流程 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =arg /max_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ /max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} /sum (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;，即&amp;lt;/math&amp;gt;θ^{-}←θ&amp;lt;/math&amp;gt;。&lt;br /&gt;
&amp;lt;math&amp;gt;max&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44979</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44979"/>
		<updated>2025-06-16T13:56:08Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* 具体算法及其训练流程 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =arg /max_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ /max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} /sum (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;步将主网络参数&amp;lt;math&amp;gt;θ&amp;lt;/math&amp;gt;复制至目标网络Q&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;，即θ&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;←θ。&lt;br /&gt;
&amp;lt;math&amp;gt;/max&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44978</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44978"/>
		<updated>2025-06-16T13:54:48Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* 具体算法及其训练流程 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;的经验存储库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络&amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;：随机初始化网络参数θ，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率&amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;、折扣因子&amp;lt;math&amp;gt;γ&amp;lt;/math&amp;gt;、探索率&amp;lt;math&amp;gt;ϵ&amp;lt;/math&amp;gt;等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =arg /max_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库&amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从D中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标Q值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ /max _{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} /sum (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔C步将主网络参数θ复制至目标网络Q&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;，即θ&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;←θ。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44977</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44977"/>
		<updated>2025-06-16T13:52:22Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* 具体算法及其训练流程 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为N的经验存储库D，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络Q：随机初始化网络参数θ，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率C、折扣因子γ、探索率ϵ等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,M执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =arg /max_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库D。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从D中均匀抽取小批量转移&amp;lt;math&amp;gt;(ϕ_{j},a_{j},r_{j},ϕ_{j+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
**目标Q值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + γ /max_{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} {/sum} (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔C步将主网络参数θ复制至目标网络Q&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;，即θ&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;←θ。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44976</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44976"/>
		<updated>2025-06-16T13:50:23Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* 具体算法及其训练流程 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为N的经验存储库D，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络Q：随机初始化网络参数θ，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络&amp;lt;math&amp;gt;Q^{-}&amp;lt;/math&amp;gt;：初始参数&amp;lt;math&amp;gt;θ^{-}&amp;lt;/math&amp;gt;，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率C、折扣因子γ、探索率ϵ等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,M执行：&lt;br /&gt;
状态预处理：初始化环境观测&amp;lt;math&amp;gt;x_{1}&amp;lt;/math&amp;gt;,通过预处理函数&amp;lt;math&amp;gt;ϕ&amp;lt;/math&amp;gt;生成初始状态表征&amp;lt;math&amp;gt;ϕ_{1}=ϕ(s_{1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =arg /max_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像&amp;lt;math&amp;gt;x _{t+1}&amp;lt;/math&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组&amp;lt;math&amp;gt;(ϕ_{t},a_{t},r_{t},ϕ_{t+1})&amp;lt;/math&amp;gt;存入回放记忆库D。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从D中均匀抽取小批量转移(ϕ&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
**目标Q值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + /gamma /max_{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} {/sum} (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔C步将主网络参数θ复制至目标网络Q&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;，即θ&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;←θ。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44975</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44975"/>
		<updated>2025-06-16T13:46:08Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* 具体算法及其训练流程 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为N的经验存储库D，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络Q：随机初始化网络参数θ，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络Q&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;：初始参数θ&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;=θ，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率C、折扣因子γ、探索率ϵ等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,M执行：&lt;br /&gt;
状态预处理：初始化环境观测x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,通过预处理函数ϕ生成初始状态表征ϕ&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作&amp;lt;math&amp;gt; a_{t}&amp;lt;/math&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：&amp;lt;math&amp;gt; a_{t} =arg /max_{a} Q(ϕ(s_{t}),a;θ)&amp;lt;/math&amp;gt;&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像x &amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;。&lt;br /&gt;
**预处理下一状态&amp;lt;math&amp;gt; ϕ_{t+1}=ϕ(s_{t+1})&amp;lt;/math&amp;gt;。&lt;br /&gt;
*存储转移数据​​：将转移元组(ϕ&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)存入回放记忆库D。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从D中均匀抽取小批量转移(ϕ&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
**目标Q值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + /gamma /max_{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} {/sum} (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔C步将主网络参数θ复制至目标网络Q&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;，即θ&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;←θ。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44974</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44974"/>
		<updated>2025-06-16T13:42:44Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* DQN 的提出及其在 Atari 游戏中的突破性成果 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''[[RMSProp优化算法]]'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为N的经验存储库D，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络Q：随机初始化网络参数θ，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络Q&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;：初始参数θ&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;=θ，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率C、折扣因子γ、探索率ϵ等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,M执行：&lt;br /&gt;
状态预处理：初始化环境观测x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,通过预处理函数ϕ生成初始状态表征ϕ&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=arg max&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; Q(ϕ(s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;),a;θ)&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像x &amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;。&lt;br /&gt;
**预处理下一状态ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
*存储转移数据​​：将转移元组(ϕ&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)存入回放记忆库D。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从D中均匀抽取小批量转移(ϕ&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
**目标Q值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + /gamma /max_{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|B|} {/sum} (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，B为batch数据&lt;br /&gt;
*目标网络同步​​：每隔C步将主网络参数θ复制至目标网络Q&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;，即θ&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;←θ。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44972</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44972"/>
		<updated>2025-06-16T12:29:06Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''RMSProp优化算法'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为N的经验存储库D，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络Q：随机初始化网络参数θ，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络Q&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;：初始参数θ&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;=θ，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率C、折扣因子γ、探索率ϵ等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,M执行：&lt;br /&gt;
状态预处理：初始化环境观测x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,通过预处理函数ϕ生成初始状态表征ϕ&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=arg max&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; Q(ϕ(s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;),a;θ)&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像x &amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;。&lt;br /&gt;
**预处理下一状态ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
*存储转移数据​​：将转移元组(ϕ&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)存入回放记忆库D。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从D中均匀抽取小批量转移(ϕ&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
**目标Q值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + /gamma /max_{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|'''B'''|} {/sum} (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，'''B'''为batch数据&lt;br /&gt;
*目标网络同步​​：每隔C步将主网络参数θ复制至目标网络Q&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;，即θ&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;←θ。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;的同时也增加了针对每个a的&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44971</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44971"/>
		<updated>2025-06-16T12:28:36Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''RMSProp优化算法'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为N的经验存储库D，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络Q：随机初始化网络参数θ，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络Q&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;：初始参数θ&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;=θ，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率C、折扣因子γ、探索率ϵ等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,M执行：&lt;br /&gt;
状态预处理：初始化环境观测x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,通过预处理函数ϕ生成初始状态表征ϕ&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=arg max&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; Q(ϕ(s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;),a;θ)&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像x &amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;。&lt;br /&gt;
**预处理下一状态ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
*存储转移数据​​：将转移元组(ϕ&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)存入回放记忆库D。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从D中均匀抽取小批量转移(ϕ&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
**目标Q值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + /gamma /max_{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|'''B'''|} {/sum} (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，'''B'''为batch数据&lt;br /&gt;
*目标网络同步​​：每隔C步将主网络参数θ复制至目标网络Q&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;，即θ&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;←θ。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加Q(st,at)的同时也增加了针对每个a的Q(st+1,a)&amp;lt;math&amp;gt; Q(s_{t+1},a) &amp;lt;/math&amp;gt;，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44970</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44970"/>
		<updated>2025-06-16T12:26:05Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''RMSProp优化算法'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为N的经验存储库D，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络Q：随机初始化网络参数θ，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络Q&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;：初始参数θ&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;=θ，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率C、折扣因子γ、探索率ϵ等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,M执行：&lt;br /&gt;
状态预处理：初始化环境观测x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,通过预处理函数ϕ生成初始状态表征ϕ&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=arg max&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; Q(ϕ(s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;),a;θ)&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像x &amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;。&lt;br /&gt;
**预处理下一状态ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
*存储转移数据​​：将转移元组(ϕ&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)存入回放记忆库D。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从D中均匀抽取小批量转移(ϕ&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
**目标Q值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + /gamma /max_{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|'''B'''|} {/sum} (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，'''B'''为batch数据&lt;br /&gt;
*目标网络同步​​：每隔C步将主网络参数θ复制至目标网络Q&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;，即θ&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;←θ。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加Q(st,at)的同时也增加了针对每个a的Q(st+1,a)，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_t, a; \theta) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44969</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44969"/>
		<updated>2025-06-16T12:25:32Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''RMSProp优化算法'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为N的经验存储库D，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络Q：随机初始化网络参数θ，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络Q&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;：初始参数θ&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;=θ，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率C、折扣因子γ、探索率ϵ等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,M执行：&lt;br /&gt;
状态预处理：初始化环境观测x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,通过预处理函数ϕ生成初始状态表征ϕ&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=arg max&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; Q(ϕ(s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;),a;θ)&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像x &amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;。&lt;br /&gt;
**预处理下一状态ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
*存储转移数据​​：将转移元组(ϕ&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)存入回放记忆库D。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从D中均匀抽取小批量转移(ϕ&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
**目标Q值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + /gamma /max_{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|'''B'''|} {/sum} (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，'''B'''为batch数据&lt;br /&gt;
*目标网络同步​​：每隔C步将主网络参数θ复制至目标网络Q&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;，即θ&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;←θ。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加Q(st,at)的同时也增加了针对每个a的Q(st+1,a)，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44968</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44968"/>
		<updated>2025-06-16T12:21:18Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''RMSProp优化算法'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为N的经验存储库D，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络Q：随机初始化网络参数θ，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络Q&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;：初始参数θ&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;=θ，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率C、折扣因子γ、探索率ϵ等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,M执行：&lt;br /&gt;
状态预处理：初始化环境观测x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,通过预处理函数ϕ生成初始状态表征ϕ&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=arg max&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; Q(ϕ(s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;),a;θ)&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像x &amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;。&lt;br /&gt;
**预处理下一状态ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
*存储转移数据​​：将转移元组(ϕ&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)存入回放记忆库D。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从D中均匀抽取小批量转移(ϕ&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
**目标Q值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + /gamma /max_{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|'''B'''|} {/sum} (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，'''B'''为batch数据&lt;br /&gt;
*目标网络同步​​：每隔C步将主网络参数θ复制至目标网络Q&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;，即θ&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;←θ。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率&amp;lt;math&amp;gt; α_t &amp;lt;/math&amp;gt;随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加Q(st,at)的同时也增加了针对每个a的Q(st+1,a)，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;math&amp;gt; \max_{a} Q(s', a; \theta) &amp;lt;/math&amp;gt;&amp;lt;/nowiki&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44967</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44967"/>
		<updated>2025-06-16T12:18:36Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''RMSProp优化算法'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为N的经验存储库D，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络Q：随机初始化网络参数θ，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络Q&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;：初始参数θ&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;=θ，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率C、折扣因子γ、探索率ϵ等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,M执行：&lt;br /&gt;
状态预处理：初始化环境观测x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,通过预处理函数ϕ生成初始状态表征ϕ&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=arg max&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; Q(ϕ(s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;),a;θ)&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像x &amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;。&lt;br /&gt;
**预处理下一状态ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
*存储转移数据​​：将转移元组(ϕ&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)存入回放记忆库D。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从D中均匀抽取小批量转移(ϕ&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
**目标Q值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + /gamma /max_{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|'''B'''|} {/sum} (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，'''B'''为batch数据&lt;br /&gt;
*目标网络同步​​：每隔C步将主网络参数θ复制至目标网络Q&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;，即θ&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;←θ。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点Q∗满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近&amp;lt;math&amp;gt; Q^*  &amp;lt;/math&amp;gt;，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率αt随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数Q∗，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加Q(st,at)的同时也增加了针对每个a的Q(st+1,a)，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;math&amp;gt; \max_{a} Q(s', a; \theta) &amp;lt;/math&amp;gt;&amp;lt;/nowiki&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44966</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44966"/>
		<updated>2025-06-16T12:15:12Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
[[强化学习]]（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN）&amp;lt;ref name=&amp;quot;dqn&amp;quot; /&amp;gt;，首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。&lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了'''经验回放（Experience Replay)'''机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了'''RMSProp优化算法'''，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;|替代=|500x500像素]]1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为N的经验存储库D，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络Q：随机初始化网络参数θ，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络Q&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;：初始参数θ&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;=θ，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率C、折扣因子γ、探索率ϵ等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,M执行：&lt;br /&gt;
状态预处理：初始化环境观测x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,通过预处理函数ϕ生成初始状态表征ϕ&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=arg max&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; Q(ϕ(s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;),a;θ)&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像x &amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;。&lt;br /&gt;
**预处理下一状态ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
*存储转移数据​​：将转移元组(ϕ&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)存入回放记忆库D。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从D中均匀抽取小批量转移(ϕ&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
**目标Q值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + /gamma /max_{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|'''B'''|} {/sum} (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，'''B'''为batch数据&lt;br /&gt;
*目标网络同步​​：每隔C步将主网络参数θ复制至目标网络Q&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;，即θ&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;←θ。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 &amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;，并给予智能体奖励 &amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点Q∗满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近Q∗，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。&lt;br /&gt;
&lt;br /&gt;
学习率衰减：学习率αt随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数Q∗，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：&lt;br /&gt;
&lt;br /&gt;
（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构|替代=|400x400像素]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加Q(st,at)的同时也增加了针对每个a的Q(st+1,a)，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构|替代=|400x400像素]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;math&amp;gt; \max_{a} Q(s', a; \theta) &amp;lt;/math&amp;gt;&amp;lt;/nowiki&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
&lt;br /&gt;
​​&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​​​&lt;br /&gt;
&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
&lt;br /&gt;
​​'''技术实现架构​​'''&lt;br /&gt;
&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44923</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44923"/>
		<updated>2025-06-16T03:44:10Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* 深度学习与强化学习的融合背景 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
强化学习（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与强化学习的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN），首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。  &lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了经验回放（Experience Replay)机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了RMSProp优化算法，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为N的经验存储库D，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络Q：随机初始化网络参数θ，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络Q&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;：初始参数θ&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;=θ，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率C、折扣因子γ、探索率ϵ等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,M执行：&lt;br /&gt;
状态预处理：初始化环境观测x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,通过预处理函数ϕ生成初始状态表征ϕ&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=arg max&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; Q(ϕ(s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;),a;θ)&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像x &amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;。&lt;br /&gt;
**预处理下一状态ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
*存储转移数据​​：将转移元组(ϕ&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)存入回放记忆库D。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从D中均匀抽取小批量转移(ϕ&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
**目标Q值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + /gamma /max_{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|'''B'''|} {/sum} (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，'''B'''为batch数据&lt;br /&gt;
*目标网络同步​​：每隔C步将主网络参数θ复制至目标网络Q&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;，即θ&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;←θ。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态 st​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作 at​。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 st+1​，并给予智能体奖励 rt​。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点Q∗满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近Q∗，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。学习率衰减：学习率αt随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数Q∗，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加Q(st,at)的同时也增加了针对每个a的Q(st+1,a)，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;math&amp;gt; \max_{a} Q(s', a; \theta) &amp;lt;/math&amp;gt;&amp;lt;/nowiki&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
'''技术实现架构​​'''&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44922</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44922"/>
		<updated>2025-06-16T03:43:47Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* 深度学习与强化学习的融合背景 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
强化学习（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
[[深度学习]]与[[强化学习]]的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN），首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。  &lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了经验回放（Experience Replay)机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了RMSProp优化算法，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为N的经验存储库D，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络Q：随机初始化网络参数θ，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络Q&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;：初始参数θ&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;=θ，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率C、折扣因子γ、探索率ϵ等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,M执行：&lt;br /&gt;
状态预处理：初始化环境观测x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,通过预处理函数ϕ生成初始状态表征ϕ&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=arg max&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; Q(ϕ(s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;),a;θ)&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像x &amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;。&lt;br /&gt;
**预处理下一状态ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
*存储转移数据​​：将转移元组(ϕ&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)存入回放记忆库D。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从D中均匀抽取小批量转移(ϕ&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
**目标Q值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + /gamma /max_{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|'''B'''|} {/sum} (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，'''B'''为batch数据&lt;br /&gt;
*目标网络同步​​：每隔C步将主网络参数θ复制至目标网络Q&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;，即θ&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;←θ。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态 st​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作 at​。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 st+1​，并给予智能体奖励 rt​。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点Q∗满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近Q∗，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。学习率衰减：学习率αt随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数Q∗，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加Q(st,at)的同时也增加了针对每个a的Q(st+1,a)，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;math&amp;gt; \max_{a} Q(s', a; \theta) &amp;lt;/math&amp;gt;&amp;lt;/nowiki&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
'''技术实现架构​​'''&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44921</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44921"/>
		<updated>2025-06-16T03:39:45Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* DQN 的应用领域 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
强化学习（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
深度学习与强化学习的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN），首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。  &lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了经验回放（Experience Replay)机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了RMSProp优化算法，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为N的经验存储库D，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络Q：随机初始化网络参数θ，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络Q&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;：初始参数θ&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;=θ，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率C、折扣因子γ、探索率ϵ等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,M执行：&lt;br /&gt;
状态预处理：初始化环境观测x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,通过预处理函数ϕ生成初始状态表征ϕ&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=arg max&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; Q(ϕ(s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;),a;θ)&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像x &amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;。&lt;br /&gt;
**预处理下一状态ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
*存储转移数据​​：将转移元组(ϕ&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)存入回放记忆库D。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从D中均匀抽取小批量转移(ϕ&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
**目标Q值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + /gamma /max_{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|'''B'''|} {/sum} (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，'''B'''为batch数据&lt;br /&gt;
*目标网络同步​​：每隔C步将主网络参数θ复制至目标网络Q&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;，即θ&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;←θ。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态 st​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作 at​。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 st+1​，并给予智能体奖励 rt​。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点Q∗满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近Q∗，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。学习率衰减：学习率αt随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数Q∗，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加Q(st,at)的同时也增加了针对每个a的Q(st+1,a)，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;math&amp;gt; \max_{a} Q(s', a; \theta) &amp;lt;/math&amp;gt;&amp;lt;/nowiki&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图,[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图;[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
'''技术实现架构​​'''&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
​​网络结构​​如右图所示。&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44920</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44920"/>
		<updated>2025-06-16T03:38:51Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* Atari 游戏中的应用与表现 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
强化学习（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
深度学习与强化学习的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN），首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。  &lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了经验回放（Experience Replay)机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了RMSProp优化算法，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为N的经验存储库D，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络Q：随机初始化网络参数θ，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络Q&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;：初始参数θ&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;=θ，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率C、折扣因子γ、探索率ϵ等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,M执行：&lt;br /&gt;
状态预处理：初始化环境观测x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,通过预处理函数ϕ生成初始状态表征ϕ&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=arg max&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; Q(ϕ(s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;),a;θ)&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像x &amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;。&lt;br /&gt;
**预处理下一状态ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
*存储转移数据​​：将转移元组(ϕ&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)存入回放记忆库D。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从D中均匀抽取小批量转移(ϕ&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
**目标Q值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + /gamma /max_{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|'''B'''|} {/sum} (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，'''B'''为batch数据&lt;br /&gt;
*目标网络同步​​：每隔C步将主网络参数θ复制至目标网络Q&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;，即θ&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;←θ。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态 st​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作 at​。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 st+1​，并给予智能体奖励 rt​。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点Q∗满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近Q∗，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。学习率衰减：学习率αt随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数Q∗，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加Q(st,at)的同时也增加了针对每个a的Q(st+1,a)，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;math&amp;gt; \max_{a} Q(s', a; \theta) &amp;lt;/math&amp;gt;&amp;lt;/nowiki&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;，二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图[[文件:人类表征对比.jpg|缩略图|人类表征对比，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;；&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统]]&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
'''技术实现架构​​'''&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
​​网络结构​​如右图所示&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
。&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44919</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44919"/>
		<updated>2025-06-16T03:38:00Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* Atari 游戏中的应用与表现 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
强化学习（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
深度学习与强化学习的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN），首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。  &lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了经验回放（Experience Replay)机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了RMSProp优化算法，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为N的经验存储库D，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络Q：随机初始化网络参数θ，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络Q&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;：初始参数θ&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;=θ，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率C、折扣因子γ、探索率ϵ等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,M执行：&lt;br /&gt;
状态预处理：初始化环境观测x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,通过预处理函数ϕ生成初始状态表征ϕ&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=arg max&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; Q(ϕ(s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;),a;θ)&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像x &amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;。&lt;br /&gt;
**预处理下一状态ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
*存储转移数据​​：将转移元组(ϕ&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)存入回放记忆库D。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从D中均匀抽取小批量转移(ϕ&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
**目标Q值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + /gamma /max_{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|'''B'''|} {/sum} (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，'''B'''为batch数据&lt;br /&gt;
*目标网络同步​​：每隔C步将主网络参数θ复制至目标网络Q&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;，即θ&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;←θ。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态 st​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作 at​。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 st+1​，并给予智能体奖励 rt​。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点Q∗满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近Q∗，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。学习率衰减：学习率αt随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数Q∗，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加Q(st,at)的同时也增加了针对每个a的Q(st+1,a)，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;math&amp;gt; \max_{a} Q(s', a; \theta) &amp;lt;/math&amp;gt;&amp;lt;/nowiki&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图[[文件:Q值训练.jpg|缩略图|预测Q值曲线，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;，二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图[[文件:人类表征对比.jpg|缩略图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;；&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统]]&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
'''技术实现架构​​'''&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
​​网络结构​​如右图所示&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
。&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44918</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44918"/>
		<updated>2025-06-16T03:37:12Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* DQN 的应用领域 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
强化学习（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
深度学习与强化学习的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN），首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。  &lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了经验回放（Experience Replay)机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了RMSProp优化算法，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为N的经验存储库D，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络Q：随机初始化网络参数θ，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络Q&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;：初始参数θ&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;=θ，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率C、折扣因子γ、探索率ϵ等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,M执行：&lt;br /&gt;
状态预处理：初始化环境观测x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,通过预处理函数ϕ生成初始状态表征ϕ&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=arg max&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; Q(ϕ(s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;),a;θ)&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像x &amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;。&lt;br /&gt;
**预处理下一状态ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
*存储转移数据​​：将转移元组(ϕ&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)存入回放记忆库D。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从D中均匀抽取小批量转移(ϕ&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
**目标Q值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + /gamma /max_{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|'''B'''|} {/sum} (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，'''B'''为batch数据&lt;br /&gt;
*目标网络同步​​：每隔C步将主网络参数θ复制至目标网络Q&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;，即θ&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;←θ。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态 st​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作 at​。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 st+1​，并给予智能体奖励 rt​。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点Q∗满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近Q∗，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。学习率衰减：学习率αt随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数Q∗，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加Q(st,at)的同时也增加了针对每个a的Q(st+1,a)，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;math&amp;gt; \max_{a} Q(s', a; \theta) &amp;lt;/math&amp;gt;&amp;lt;/nowiki&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图[[文件:Q值训练.jpg|缩略图|预测Q值曲线]]，二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图[[文件:人类表征对比.jpg|缩略图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;；&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图，引自&amp;lt;ref name=&amp;quot;robot&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统]]&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
'''技术实现架构​​'''&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
​​网络结构​​如右图所示&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法，引自&amp;lt;ref name=&amp;quot;recommand&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
。&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44917</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44917"/>
		<updated>2025-06-16T03:32:52Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* DQN 的提出及其在 Atari 游戏中的突破性成果 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
强化学习（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
深度学习与强化学习的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN），首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。  &lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了经验回放（Experience Replay)机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;, s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了RMSProp优化算法，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为N的经验存储库D，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络Q：随机初始化网络参数θ，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络Q&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;：初始参数θ&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;=θ，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率C、折扣因子γ、探索率ϵ等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,M执行：&lt;br /&gt;
状态预处理：初始化环境观测x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,通过预处理函数ϕ生成初始状态表征ϕ&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=arg max&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; Q(ϕ(s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;),a;θ)&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像x &amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;。&lt;br /&gt;
**预处理下一状态ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
*存储转移数据​​：将转移元组(ϕ&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)存入回放记忆库D。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从D中均匀抽取小批量转移(ϕ&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
**目标Q值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + /gamma /max_{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**[https://baike.baidu.com/item/梯度下降?fromModule=lemma_search-box 梯度下降]​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|'''B'''|} {/sum} (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，'''B'''为batch数据&lt;br /&gt;
*目标网络同步​​：每隔C步将主网络参数θ复制至目标网络Q&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;，即θ&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;←θ。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态 st​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作 at​。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 st+1​，并给予智能体奖励 rt​。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点Q∗满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近Q∗，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。学习率衰减：学习率αt随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数Q∗，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加Q(st,at)的同时也增加了针对每个a的Q(st+1,a)，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;math&amp;gt; \max_{a} Q(s', a; \theta) &amp;lt;/math&amp;gt;&amp;lt;/nowiki&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现]]&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见&amp;lt;ref&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图[[文件:Q值训练.jpg|缩略图|预测Q值曲线]]，二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图[[文件:人类表征对比.jpg|缩略图]]；&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图]]&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统]]&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
'''技术实现架构​​'''&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
​​网络结构​​如右图所示&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法]]&lt;br /&gt;
。&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44916</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44916"/>
		<updated>2025-06-16T03:30:33Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* DQN 的提出及其在 Atari 游戏中的突破性成果 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
强化学习（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
深度学习与强化学习的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN），首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。  &lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[https://baike.baidu.com/item/卷积神经网络/17541100 卷积神经网络(CNN) 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了经验回放（Experience Replay)机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s_t, a_t, r_t, s_{t+1}），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了RMSProp优化算法，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为N的经验存储库D，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络Q：随机初始化网络参数θ，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络Q&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;：初始参数θ&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;=θ，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率C、折扣因子γ、探索率ϵ等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,M执行：&lt;br /&gt;
状态预处理：初始化环境观测x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,通过预处理函数ϕ生成初始状态表征ϕ&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=arg max&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; Q(ϕ(s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;),a;θ)&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像x &amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;。&lt;br /&gt;
**预处理下一状态ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
*存储转移数据​​：将转移元组(ϕ&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)存入回放记忆库D。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从D中均匀抽取小批量转移(ϕ&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
**目标Q值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + /gamma /max_{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**梯度下降​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|'''B'''|} {/sum} (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，'''B'''为batch数据&lt;br /&gt;
*目标网络同步​​：每隔C步将主网络参数θ复制至目标网络Q&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;，即θ&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;←θ。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态 st​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作 at​。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 st+1​，并给予智能体奖励 rt​。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点Q∗满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近Q∗，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。学习率衰减：学习率αt随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数Q∗，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加Q(st,at)的同时也增加了针对每个a的Q(st+1,a)，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;math&amp;gt; \max_{a} Q(s', a; \theta) &amp;lt;/math&amp;gt;&amp;lt;/nowiki&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现]]&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见&amp;lt;ref&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图[[文件:Q值训练.jpg|缩略图|预测Q值曲线]]，二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图[[文件:人类表征对比.jpg|缩略图]]；&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图]]&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统]]&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
'''技术实现架构​​'''&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
​​网络结构​​如右图所示&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法]]&lt;br /&gt;
。&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44915</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44915"/>
		<updated>2025-06-16T03:28:33Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* DQN 的提出及其在 Atari 游戏中的突破性成果 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
强化学习（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
深度学习与强化学习的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN），首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。  &lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用深度[http://卷积神经网络(CNN) 卷积神经网络(CNN)]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了经验回放（Experience Replay)机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s_t, a_t, r_t, s_{t+1}），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了RMSProp优化算法，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为N的经验存储库D，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络Q：随机初始化网络参数θ，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络Q&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;：初始参数θ&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;=θ，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率C、折扣因子γ、探索率ϵ等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,M执行：&lt;br /&gt;
状态预处理：初始化环境观测x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,通过预处理函数ϕ生成初始状态表征ϕ&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=arg max&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; Q(ϕ(s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;),a;θ)&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像x &amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;。&lt;br /&gt;
**预处理下一状态ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
*存储转移数据​​：将转移元组(ϕ&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)存入回放记忆库D。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从D中均匀抽取小批量转移(ϕ&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
**目标Q值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + /gamma /max_{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**梯度下降​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|'''B'''|} {/sum} (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; ，'''B'''为batch数据&lt;br /&gt;
*目标网络同步​​：每隔C步将主网络参数θ复制至目标网络Q&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;，即θ&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;←θ。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态 st​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作 at​。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 st+1​，并给予智能体奖励 rt​。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点Q∗满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近Q∗，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。学习率衰减：学习率αt随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数Q∗，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加Q(st,at)的同时也增加了针对每个a的Q(st+1,a)，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;math&amp;gt; \max_{a} Q(s', a; \theta) &amp;lt;/math&amp;gt;&amp;lt;/nowiki&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现]]&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见&amp;lt;ref&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图[[文件:Q值训练.jpg|缩略图|预测Q值曲线]]，二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图[[文件:人类表征对比.jpg|缩略图]]；&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图]]&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统]]&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
'''技术实现架构​​'''&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
​​网络结构​​如右图所示&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法]]&lt;br /&gt;
。&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
	<entry>
		<id>https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44914</id>
		<title>Deep Q Network</title>
		<link rel="alternate" type="text/html" href="https://wiki.swarma.org/index.php?title=Deep_Q_Network&amp;diff=44914"/>
		<updated>2025-06-16T03:26:44Z</updated>

		<summary type="html">&lt;p&gt;DeepQ：/* 具体算法及其训练流程 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;深度Q网络(Deep Q-Network, DQN)是一种基于深度学习的强化学习算法，它通过深度神经网络来近似最优动作价值函数（Q函数），能够直接从高维感知输入（如游戏画面像素）中学习最优决策策略。该算法的核心创新在于结合了经验回放机制和目标网络技术，有效解决了传统Q学习在非线性函数逼近中的稳定性问题，首次在Atari游戏上实现了从原始像素输入到控制指令的端到端学习，达到了人类水平的游戏表现。&lt;br /&gt;
&lt;br /&gt;
==背景 ==&lt;br /&gt;
&lt;br /&gt;
===强化学习的基本概念与挑战===&lt;br /&gt;
&lt;br /&gt;
====基本概念====&lt;br /&gt;
强化学习（Reinforcement Learning, RL）是一种[[机器学习 Machine Learning|机器学习]]方法，强调[https://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E4%BD%93/9446647 智能体]（agent）通过与环境的交互，在试错过程中学习策略，以最大化累积奖励。其核心在于解决“探索-利用”之间的权衡：既要尝试新的动作以发现潜在的高奖励策略（探索），又要利用已知的最优策略以获得即时收益（利用） 。&lt;br /&gt;
&lt;br /&gt;
====面临的挑战====&lt;br /&gt;
尽管强化学习在游戏AI、机器人控制、推荐系统等领域取得了显著成果，但在实际应用中仍面临诸多挑战：&lt;br /&gt;
&lt;br /&gt;
（1）样本效率低：强化学习通常需要大量的交互数据才能学习有效策略，这在数据获取成本高或交互受限的场景中尤为困难。&lt;br /&gt;
&lt;br /&gt;
（2）泛化能力弱：在特定环境中训练出的策略，往往难以适应稍有变化的新环境，缺乏迁移学习能力。&lt;br /&gt;
&lt;br /&gt;
（3）奖励设计困难：设计合适的奖励函数至关重要，不当的奖励设计可能导致智能体学习到与预期不符的行为。&lt;br /&gt;
&lt;br /&gt;
（4）训练稳定性与收敛性问题：特别是在基于深度神经网络的模型中，训练过程可能不稳定，容易发生发散。策略或环境的微小变化可能导致性能的极大波动，使得难以获得一致的结果。在连续或高维动作空间的情况下，这种不稳定性更加明显，学习过程变得更复杂且难以预测。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 简介===&lt;br /&gt;
Q-Learning 是强化学习中一种经典且广泛应用的无模型（model-free）算法，属于基于值（value-based）的方法。其核心目标是通过学习一个动作价值函数（Q函数），指导智能体在不同状态下选择最优动作，以最大化长期累积奖励。&lt;br /&gt;
&lt;br /&gt;
举例老鼠在迷宫中寻找奶酪来理解Q-Learning ：&lt;br /&gt;
&lt;br /&gt;
（1）环境设定&lt;br /&gt;
&lt;br /&gt;
*'''智能体（Agent）'''：一只老鼠，起始位置固定。&lt;br /&gt;
*'''目标（Goal）'''：在迷宫的右下角有一块奶酪，老鼠的任务是找到并吃到奶酪。&lt;br /&gt;
*'''障碍（Obstacle）'''：迷宫中某些位置有毒药，老鼠需要避免这些位置。&lt;br /&gt;
*'''动作（Actions）'''：老鼠可以选择向上、下、左、右移动。&lt;br /&gt;
*'''奖励（Rewards）'''：吃到奶酪：+10；误入毒药：-10；其他移动：0&lt;br /&gt;
&lt;br /&gt;
（2）Q-Learning 学习过程&lt;br /&gt;
&lt;br /&gt;
老鼠通过不断尝试不同的路径，学习如何从起点移动到奶酪所在的位置，同时避免毒药。每次移动后，老鼠根据获得的奖励更新其对当前状态下各个动作的价值估计（即 Q 值）。随着学习的进行，老鼠逐渐形成一套策略，使其能够更快、更安全地找到奶酪。&lt;br /&gt;
&lt;br /&gt;
（3）Q 值更新公式&lt;br /&gt;
&lt;br /&gt;
Q-Learning 的核心在于通过以下公式更新 Q 值：&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子&lt;br /&gt;
&lt;br /&gt;
（4）策略选择：ε-贪婪策略&lt;br /&gt;
&lt;br /&gt;
为了在探索新路径和利用已知最佳路径之间取得平衡，采用 ε-贪婪策略：&lt;br /&gt;
&lt;br /&gt;
*以概率 ε 随机选择一个动作（探索）&lt;br /&gt;
*以概率 1 - ε 选择当前 Q 值最大的动作（利用）&lt;br /&gt;
&lt;br /&gt;
随着训练的进行，逐渐减小 ε 的值，以减少探索，增加利用。&lt;br /&gt;
&lt;br /&gt;
（5）学习过程&lt;br /&gt;
&lt;br /&gt;
以下是老鼠在迷宫中学习的简要过程：&lt;br /&gt;
&lt;br /&gt;
'''a.初始化'''：将所有状态-动作对的 Q 值初始化为 0。&lt;br /&gt;
&lt;br /&gt;
'''b.选择动作'''：根据 ε-贪婪策略选择一个动作。&lt;br /&gt;
&lt;br /&gt;
'''c.执行动作'''：老鼠移动到新的位置，获得相应的奖励。&lt;br /&gt;
&lt;br /&gt;
'''d.更新 Q 值'''：根据 Q 值更新公式，更新当前状态下该动作的 Q 值。&lt;br /&gt;
&lt;br /&gt;
'''e.重复'''：将新位置作为当前状态，重复步骤 2 至 4，直到达到终止条件（如找到奶酪或达到最大步数）。&lt;br /&gt;
&lt;br /&gt;
通过多次迭代，老鼠能够学习到从起点到奶酪的最优路径，同时避免毒药。该示例展示了 Q-Learning 如何通过与环境的交互，学习最优策略以最大化累积奖励。通过不断更新 Q 值，智能体能够在复杂的环境中找到最优路径。&lt;br /&gt;
===深度学习与强化学习的融合背景===&lt;br /&gt;
&lt;br /&gt;
深度学习与强化学习的融合起源于两者互补的优势：强化学习擅长决策与策略优化，而深度学习擅长处理高维感知数据（如图像、语音、文本等）。传统强化学习方法在面对大规模状态空间（例如图像输入）时，因无法使用查表的方式存储 Q 值而表现不佳。为了解决这一瓶颈，研究者引入深度神经网络作为函数逼近器，用以估计状态-动作值函数（Q 值）或策略函数，从而大幅提升了强化学习在复杂环境中的泛化能力和实用性。&lt;br /&gt;
&lt;br /&gt;
这一融合的代表性成果是 2015 年 DeepMind 提出的深度 Q 网络（DQN），首次在无需人工特征设计的情况下，仅凭像素输入便在多款 Atari 游戏中实现了超越人类水平的表现。&lt;br /&gt;
&lt;br /&gt;
===DQN 的提出及其在 Atari 游戏中的突破性成果===&lt;br /&gt;
[[文件:Atari游戏之breakout.gif|缩略图|举例：Atari游戏之breakout，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deep Q-Network（DQN）是由DeepMind团队在2015年发表的论文&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;中提出的深度强化学习算法。该研究首次将深度神经网络与Q-learning结合，直接从高维感官输入（如Atari游戏的像素）学习控制策略，而无需手工设计特征。DQN在Atari 2600游戏上的表现达到或超越人类水平，标志着深度强化学习在复杂任务中的重大突破。  &lt;br /&gt;
&lt;br /&gt;
DQN的核心创新包括使用[[深度卷积神经网络(CNN)]]处理原始像素输入，模仿生物视觉系统的层次化特征提取能力。此外，为了解决传统强化学习在非线性函数逼近下的不稳定性，DQN引入了经验回放（Experience Replay)机制，通过存储并随机采样历史经验来打破数据相关性，提高训练稳定性。同时，采用目标网络分离技术，定期冻结目标Q网络的参数，减少训练过程中的波动。  &lt;br /&gt;
&lt;br /&gt;
在实验中，DQN在49款Atari 2600游戏上进行测试，仅以游戏屏幕像素和分数作为输入，使用相同的网络架构和超参数。结果显示，DQN在43款游戏中超越了此前所有强化学习方法，并在29款游戏中达到人类专业测试员水平的75%以上。例如，在“Breakout”中，DQN自主发现“侧边挖隧道”的高分策略，最终得分远超人类玩家；在“Space Invaders”中，DQN学会忽略无关视觉特征，专注于关键状态价值预测。  &lt;br /&gt;
&lt;br /&gt;
DQN的成功不仅验证了端到端强化学习的可行性，还揭示了深度神经网络与生物学习机制的相似性，如经验回放与海马体记忆重放的类比。然而，DQN仍存在训练数据需求大、对超长程规划任务（如“Montezuma’s Revenge”表现有限等挑战。尽管如此，DQN为后续深度强化学习研究奠定了基础，推动了从游戏AI到机器人控制等领域的广泛应用。&lt;br /&gt;
&lt;br /&gt;
====提出的模型====&lt;br /&gt;
[[文件:WechatIMG402.jpg|缩略图|模型示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
该示意图展示了深度Q网络（DQN）的典型架构设计，直观呈现了从原始游戏画面到控制指令的端到端处理流程。系统采用多级特征提取架构，左侧输入层接收预处理后的游戏画面（84×84像素，4帧堆叠），通过两个卷积层（Convolution）进行空间特征提取，其中网格状结构表示卷积核在空间维度上的特征映射过程。随后经由两个全连接层（Fully connected）实现高级特征的抽象与组合，最终输出层与游戏手柄控制指令直接关联，作为根据学到的动作价值Q来选择动作。该架构设计充分体现了DQN直接从原始像素学习控制策略的核心思想，通过卷积神经网络的特征提取能力与强化学习的决策机制相结合，实现了从感知到行动的完整映射。&lt;br /&gt;
&lt;br /&gt;
====模型的细节====&lt;br /&gt;
该研究在模型设计上体现了显著的普适性特征，采用单一网络架构处理所有Atari游戏任务，仅需输入原始像素、动作空间和生命值等基本先验知识。在算法实现方面，创新性地引入了经验回放机制（experience replay），通过循环缓冲区存储历史转移样本（s_t, a_t, r_t, s_{t+1}），并采用均匀随机采样方式抽取小批量（minibatch size=32）进行训练。这种设计有效打破了数据间的时间相关性，显著提高了样本利用率和训练稳定性。&lt;br /&gt;
&lt;br /&gt;
在奖励函数设计方面，研究者采用了归一化处理策略，将正向奖励设为+1，负向奖励设为-1，其余情况为0，这种标准化方法有效控制了误差范围并实现了跨游戏的统一训练速度。经验回放机制与奖励归一化的协同作用，使得算法能够在不同游戏间保持一致的性能表现。&lt;br /&gt;
&lt;br /&gt;
针对大规模训练数据的高冗余特性，研究采用了RMSProp优化算法，其核心机制是通过将梯度除以其近期幅度的滑动平均值来调整学习率。训练过程中引入衰减系数ϵ，采用ϵ-greedy策略进行探索-利用权衡：在前1百万训练步中，ϵ值从1线性衰减至0.1，之后保持恒定。这种动态调整策略与经验回放机制相结合，有效避免了过早收敛问题，特别适合处理非平稳目标函数。值得注意的是，经验回放缓冲区的容量设置为1,000,000个样本，并在训练前预填充50,000帧数据以确保初始采样质量。&lt;br /&gt;
&lt;br /&gt;
为提高计算效率，研究者对所有游戏采用了跳帧技术（每4帧处理1帧），在保证性能无明显下降的前提下显著提升了训练速度。这种时间抽象方法与经验回放机制协同工作，使得样本复杂度相比在线策略降低了约10倍。实验结果表明，移除经验回放会导致性能下降58.7%，充分验证了该机制的必要性。这些创新设计共同构成了DQN算法的核心框架，为后续深度强化学习研究奠定了重要基础。&lt;br /&gt;
&lt;br /&gt;
====具体算法及其训练流程====&lt;br /&gt;
[[文件:Algorithmdqn.jpg|缩略图|算法流程，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[文件:Dqn算法流程.jpg|缩略图|算法流程示意图，引自&amp;lt;ref name=&amp;quot;dqn&amp;quot;&amp;gt;&amp;lt;/ref&amp;gt;]]&amp;lt;br&amp;gt;&lt;br /&gt;
1. 初始化阶段&lt;br /&gt;
*回放记忆库(Replay Memory)：创建容量为N的经验存储库D，用于缓存历史转移数据。&lt;br /&gt;
*动作-价值函数网络：&lt;br /&gt;
**主网络Q：随机初始化网络参数θ，负责实时动作选择和价值估计。&lt;br /&gt;
**目标网络Q&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;：初始参数θ&amp;lt;sup&amp;gt;−&amp;lt;/sup&amp;gt;=θ，用于稳定化计算目标Q值。&lt;br /&gt;
**超参数设定：设置训练总回合数M、单回合最大步数T、目标网络同步频率C、折扣因子γ、探索率ϵ等。&lt;br /&gt;
&lt;br /&gt;
2. 回合（Episode）循环&lt;br /&gt;
对每个回合episode=1,2,...,M执行：&lt;br /&gt;
状态预处理：初始化环境观测x&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,通过预处理函数ϕ生成初始状态表征ϕ&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
&lt;br /&gt;
3. 时间步（Timestep）循环&lt;br /&gt;
对每个时间步t=1,2,...,T执行：&lt;br /&gt;
*动作选择：&lt;br /&gt;
**探索策略：以概率ϵ随机选择动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,促进环境探索。&lt;br /&gt;
**利用策略：否则，根据主网络选择最优动作：a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=arg max&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt; Q(ϕ(s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;),a;θ)&lt;br /&gt;
*执行与环境交互​​：&lt;br /&gt;
**执行动作a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;，获取奖励r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;和下一帧图像x &amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;。&lt;br /&gt;
**预处理下一状态ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;=ϕ(s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
*存储转移数据​​：将转移元组(ϕ&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;)存入回放记忆库D。&lt;br /&gt;
*经验回放与网络更新​​：&lt;br /&gt;
**随机采样​​：从D中均匀抽取小批量转移(ϕ&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,r&amp;lt;sub&amp;gt;j&amp;lt;/sub&amp;gt;,ϕ&amp;lt;sub&amp;gt;j+1&amp;lt;/sub&amp;gt;)。&lt;br /&gt;
**目标Q值计算​​： &amp;lt;math&amp;gt; y_{j} = r_{j} + /gamma /max_{a} Q^{-}(ϕ_{j+1}, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
**梯度下降​​: &amp;lt;math&amp;gt; ∇_{θ} 1/ {|'''B'''|} {/sum} (y_j-Q(ϕ_j,a_j;θ)^2 &amp;lt;/math&amp;gt; '''B'''为batch数据&lt;br /&gt;
*目标网络同步​​：每隔C步将主网络参数θ复制至目标网络Q&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;，即θ&amp;lt;sup&amp;gt;-&amp;lt;/sup&amp;gt;←θ。&lt;br /&gt;
&lt;br /&gt;
==Q-Learning 基础==&lt;br /&gt;
&lt;br /&gt;
===马尔可夫决策过程（MDP）简介===&lt;br /&gt;
&lt;br /&gt;
[https://builtin.com/machine-learning/markov-decision-process? 马尔可夫决策过程]（Markov Decision Process，简称 MDP）是强化学习的核心数学框架，用于建模智能体在不确定环境中通过试错学习最优策略的过程。它在马尔可夫过程的基础上引入了“动作”和“奖励”机制，广泛应用于人工智能、控制系统、经济学等领域。&lt;br /&gt;
[[文件:马尔科夫决策过程示意图.png|缩略图|马尔可夫决策过程]]&lt;br /&gt;
&lt;br /&gt;
====MDP 的核心思想====&lt;br /&gt;
&lt;br /&gt;
在 MDP 中，智能体与环境的[https://zhuanlan.zhihu.com/p/568155357 交互过程]如下：&lt;br /&gt;
&lt;br /&gt;
(1)智能体观察当前状态 st​。&lt;br /&gt;
&lt;br /&gt;
(2)根据策略 π，选择一个动作 at​。&lt;br /&gt;
&lt;br /&gt;
(3)环境根据状态转移概率 P，转移到下一个状态 st+1​，并给予智能体奖励 rt​。&lt;br /&gt;
&lt;br /&gt;
(4)智能体根据获得的奖励和新的状态，更新策略 π，以期获得更高的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这一过程持续进行，智能体通过不断与环境交互，学习最优策略。&lt;br /&gt;
&lt;br /&gt;
====策略与价值函数====&lt;br /&gt;
&lt;br /&gt;
*'''策略 π(a∣s)'''：在状态 s 下选择动作 a 的概率分布。&lt;br /&gt;
*'''状态值函数 Vπ(s)'''：在策略 π 下，从状态 s 开始，期望获得的累计奖励。&lt;br /&gt;
*'''动作值函数 Qπ(s,a)'''：在策略 π 下，从状态 s 开始，采取动作 a 后，期望获得的累计奖励。&lt;br /&gt;
&lt;br /&gt;
这些函数用于评估策略的优劣，指导策略的改进。&lt;br /&gt;
&lt;br /&gt;
===Q 值函数的定义与更新公式===&lt;br /&gt;
====定义====&lt;br /&gt;
Q 值函数 Q(s, a) 表示智能体在状态 s 下采取动作 a 后，遵循某一策略所能获得的期望累积奖励。&lt;br /&gt;
&lt;br /&gt;
====更新公式====&lt;br /&gt;
Q-Learning 算法使用以下更新公式来迭代 Q 值：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Q_{t+1}(s_t, a_t) = Q_t(s_t, a_t) + \alpha_t \left[ r_t + \gamma \max_{a} Q_t(s_{t+1}, a) - Q_t(s_t, a_t) \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中，符号含义如下：&amp;lt;math&amp;gt;s_t&amp;lt;/math&amp;gt;：当前状态；&amp;lt;math&amp;gt;a_t&amp;lt;/math&amp;gt;：当前动作；&amp;lt;math&amp;gt;r_t&amp;lt;/math&amp;gt;：即时奖励；&amp;lt;math&amp;gt;s_{t+1}&amp;lt;/math&amp;gt;：执行动作后的新状态；&amp;lt;math&amp;gt;\alpha \in (0,1]&amp;lt;/math&amp;gt;：学习率；&amp;lt;math&amp;gt;\gamma \in [0,1)&amp;lt;/math&amp;gt;：折扣因子。&lt;br /&gt;
&lt;br /&gt;
此公式基于贝尔曼方程的时序差分（TD）更新思想，逐步调整 &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; 值函数以逼近最优策略。&lt;br /&gt;
&lt;br /&gt;
===ε-greedy 策略与探索-利用权衡===&lt;br /&gt;
&lt;br /&gt;
Q-learning 通常面临“探索（exploration）”与“利用（exploitation）”之间的权衡问题。为了解决这一问题，通常采用 ε-greedy 策略。ε-greedy 策略是一种简单而有效的动作选择策略，旨在平衡探索与利用。&lt;br /&gt;
&lt;br /&gt;
*'''利用（Exploitation）'''：以 1−ϵ 的概率选择当前状态下 Q 值最大的动作，即选择已知的最佳动作。&lt;br /&gt;
*'''探索（Exploration）'''：以 ϵ 的概率随机选择一个动作，从而探索新的可能性。&lt;br /&gt;
&lt;br /&gt;
其中，ϵ 是一个介于 0 和 1 之间的参数，控制探索的频率。较大的 ϵ 值鼓励更多的探索，而较小的 ϵ 值则倾向于更多的利用。&lt;br /&gt;
&lt;br /&gt;
在实际应用中，通常会随着训练的进行逐步减小 ϵ 值，从而实现以下目标：&lt;br /&gt;
&lt;br /&gt;
*'''初期阶段'''：设置较大的 ϵ 值，鼓励智能体进行充分的探索。&lt;br /&gt;
*'''后期阶段'''：逐步减小 ϵ 值，增加利用已知最佳策略的频率。&lt;br /&gt;
&lt;br /&gt;
这种策略有助于智能体在学习初期获取足够的经验，在后期则能够稳定地执行最优策略。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的收敛性===&lt;br /&gt;
Q-Learning 收敛性的证明主要基于以下几点：&lt;br /&gt;
&lt;br /&gt;
（1）Bellman 最优算子是压缩映射&amp;lt;ref&amp;gt;Overmars M G. Analyzing the convergence of Q-learning through Markov decision theory[D]. University of Twente, 2021.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bellman 最优算子 B 定义为：&lt;br /&gt;
&amp;lt;math&amp;gt; (BQ)(s,a) = \mathbb{E} \left[ r(s,a) + \gamma \max_{a'} Q(s', a') \right] &amp;lt;/math&amp;gt;&lt;br /&gt;
它满足：&lt;br /&gt;
&amp;lt;math&amp;gt; \| BQ_1 - BQ_2 \|_\infty \leq \gamma \| Q_1 - Q_2 \|_\infty &amp;lt;/math&amp;gt;&lt;br /&gt;
即B是以折扣因子γ为压缩率的压缩映射。&lt;br /&gt;
&lt;br /&gt;
（2）Banach 不动点定理保证唯一固定点&lt;br /&gt;
&lt;br /&gt;
因为B是压缩映射，存在唯一的固定点Q∗满足：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^* = B Q^* &amp;lt;/math&amp;gt;&lt;br /&gt;
这就是最优状态-动作值函数。&lt;br /&gt;
&lt;br /&gt;
（3）随机逼近框架中的收敛条件&amp;lt;ref&amp;gt;Even-Dar E, Mansour Y. Convergence of optimistic and incremental Q-learning[J]. Advances in neural information processing systems, 2001, 14.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q-Learning 通过随机采样和迭代逼近Q∗，在学习率满足以下条件时收敛：&lt;br /&gt;
&amp;lt;math&amp;gt; \sum_{t=0}^\infty \alpha_t(s,a) = \infty, \quad \sum_{t=0}^\infty \alpha_t(s,a)^2 &amp;lt; \infty &amp;lt;/math&amp;gt; &lt;br /&gt;
同时，算法需保证每个状态-动作对 (s,a) 被无限次访问。&lt;br /&gt;
&lt;br /&gt;
收敛的关键条件：&lt;br /&gt;
&lt;br /&gt;
充分探索：智能体必须保证所有对无限次访问，通常通过 ε-greedy 等策略实现。学习率衰减：学习率αt随时间衰减，但不宜过快。折扣因子限制：γ∈[0,1)，保证未来奖励的影响递减。&lt;br /&gt;
&lt;br /&gt;
在满足适当的学习率调节、充分探索、以及折扣因子约束的情况下，Q-Learning 算法能够以概率 1 收敛到最优值函数Q∗，其数学表达为：&lt;br /&gt;
&amp;lt;math&amp;gt; \lim_{t \to \infty} Q_t(s,a) = Q^*(s,a) &amp;lt;/math&amp;gt;&lt;br /&gt;
这为强化学习算法的理论可靠性提供了坚实基础。&lt;br /&gt;
&lt;br /&gt;
===Q-Learning 的局限性===&lt;br /&gt;
&lt;br /&gt;
Q-Learning 广泛应用于多种决策任务。在实际应用中，它的局限性主要体现在以下几个方面：（1）状态-动作空间维度灾难（Curse of Dimensionality）：Q-Learning 使用 Q 表来存储每个状态-动作对的价值。当状态或动作空间非常大时，Q 表的尺寸会急剧膨胀，导致存储和更新变得不切实际。&lt;br /&gt;
&lt;br /&gt;
例如，在具有数百万状态和动作的环境中，传统的 Q 表方法可能无法有效处理。为了解决这个问题，通常采用函数逼近方法，如线性函数逼近或深度神经网络，以估计 Q 值，从而避免直接使用庞大的 Q 表。&lt;br /&gt;
&lt;br /&gt;
（2）在状态和动作空间较大的环境中，Q-Learning 的学习过程可能非常缓慢，通常需要大量的训练回合才能收敛到最优策略。这种慢收敛性使得 Q-Learning 在需要快速学习的应用场景中可能不太适用。[https://www.appliedaicourse.com/blog/q-learning-in-machine-learning/?]&lt;br /&gt;
&lt;br /&gt;
（3）探索与利用的平衡问题：Q-Learning 依赖于探索（exploration）和利用（exploitation）之间的平衡。过度探索可能导致学习效率低下，而过度利用可能导致陷入局部最优解。例如，ε-greedy 策略通过引入随机性来平衡探索与利用，但选择合适的 ε 值仍然是一个挑战。&lt;br /&gt;
&lt;br /&gt;
（4）对超参数敏感：Q-Learning 的性能对学习率（α）、折扣因子（γ）和探索率（ε）等超参数非常敏感。选择不当的超参数可能导致学习过程不稳定或收敛到次优解。例如，过高的学习率可能导致 Q 值更新过快，导致震荡；而过低的学习率可能导致学习过程过慢。&lt;br /&gt;
&lt;br /&gt;
（5）对函数逼近的稳定性问题：当使用函数逼近（如神经网络）来估计 Q 值时，Q-Learning 可能出现不稳定或发散的情况，尤其是在非线性函数逼近器的情况下。&lt;br /&gt;
&lt;br /&gt;
这种不稳定性主要源于估计目标值与当前 Q 值之间的相互依赖关系。为了解决这个问题，提出了 Double Q-Learning 等方法，通过使用两个独立的 Q 值估计器来减少过估计偏差，从而提高稳定性。[https://en.wikipedia.org/wiki/Q-learning?utm_source=chatgpt.com]&lt;br /&gt;
&lt;br /&gt;
==DQN 的核心思想与结构==&lt;br /&gt;
&lt;br /&gt;
===使用神经网络逼近 Q 值函数===&lt;br /&gt;
DQN的⾏为值函数&amp;lt;math&amp;gt; Q(s,a;θ) &amp;lt;/math&amp;gt; 利⽤神经⽹络逼近，属于⾮线性逼近。此处的值函数对应着⼀组参数，在神经⽹络⾥参数是每层⽹络的权重，用θ表示。&lt;br /&gt;
用公式表示的话，如下：&lt;br /&gt;
&amp;lt;math&amp;gt; Q^{*}(s,a)≈Q(s,a;θ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
其中：&lt;br /&gt;
*'''输入'''​​：原始状态 s（如游戏画面像素矩阵）&lt;br /&gt;
*'''输出'''​​​​：每个动作 a 对应的Q值（离散动作空间）&lt;br /&gt;
*'''参数'''​​​​：θ 为神经网络的权重，通过梯度下降优化&lt;br /&gt;
​​&lt;br /&gt;
在论文中DQN所用的网络结构是三个卷积层加两个全连接层，网络的输入是经过预处理后的数据，预处理指的是将210*160的游戏图像转化为84*84的图像等操作，得到算法结构中的具体代码实现和网络结构见图和以下代码：&lt;br /&gt;
[[文件:网络结构.png|缩略图|网络具体结构]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 预处理图像&lt;br /&gt;
def preprocess(frame):&lt;br /&gt;
    # 转灰度图&lt;br /&gt;
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)&lt;br /&gt;
    # 调整大小&lt;br /&gt;
    frame = cv2.resize(frame, (84, 84))&lt;br /&gt;
    # 归一化&lt;br /&gt;
    frame = frame.astype(np.float32) / 255.0&lt;br /&gt;
    return frame&lt;br /&gt;
&lt;br /&gt;
# Q-Network (CNN)&lt;br /&gt;
class DQN(nn.Module):&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        super(DQN, self).__init__()&lt;br /&gt;
        self.conv1 = nn.Conv2d(4, 32, kernel_size=8, stride=4)&lt;br /&gt;
        self.conv2 = nn.Conv2d(32, 64, kernel_size=4, stride=2)&lt;br /&gt;
        self.conv3 = nn.Conv2d(64, 64, kernel_size=3, stride=1)&lt;br /&gt;
        self.fc1 = nn.Linear(64 * 7 * 7, 512)&lt;br /&gt;
        self.fc2 = nn.Linear(512, action_dim)&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        x = F.relu(self.conv1(x))&lt;br /&gt;
        x = F.relu(self.conv2(x))&lt;br /&gt;
        x = F.relu(self.conv3(x))&lt;br /&gt;
        x = torch.flatten(x, start_dim=1)&lt;br /&gt;
        x = F.relu(self.fc1(x))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''核心意义'''​​：&lt;br /&gt;
*'''端到端学习'''：直接从原始状态（如像素）映射到动作价值，无需手工设计特征。&lt;br /&gt;
*'''泛化能力'''​​​​：相似状态共享神经网络的特征表示，提升样本利用率。&lt;br /&gt;
*'''高维处理'''​​​​：卷积神经网络（CNN）可高效提取图像中的空间特征。&lt;br /&gt;
&lt;br /&gt;
===经验回放（Experience Replay）机制===&lt;br /&gt;
通过经验回放可以令神经网络的训练收敛且稳定。这是因为训练神经⽹络时，存在的假设是训练数据是独⽴同分布的，但是通过强化学习采集的数据之间存在着关联性，利⽤这些数据进⾏顺序训练，神经⽹络当然不稳定。经验回放可以打破数据间的关联。在强化学习过程中，智能体将数据存储到⼀个数据库中，再利⽤均匀随机采样的⽅法从数据库中抽取数据，然后利⽤抽取的数据训练神经⽹络。 &lt;br /&gt;
这种经验回放的技巧可以打破数据之间的关联性。&lt;br /&gt;
[[文件:经验回放.jpg|缩略图|经验回收]]&lt;br /&gt;
代码实现可参考：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# 经验回放&lt;br /&gt;
class ReplayMemory:&lt;br /&gt;
    def __init__(self, capacity):&lt;br /&gt;
        self.memory = deque(maxlen=capacity)&lt;br /&gt;
&lt;br /&gt;
    def push(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.memory.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def sample(self, batch_size):&lt;br /&gt;
        return random.sample(self.memory, batch_size)&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.memory)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===目标网络（Target Network）的引入与参数更新策略===&lt;br /&gt;
为了更长远的提高稳定性，使用一个独立的神经Q网络去得到target y，即建立另一个独立的神经网络target network。每经过c次更新后，复制 network Q得到target network Q’，然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加Q(st,at)的同时也增加了针对每个a的Q(st+1,a)，从而增加了 target y，这又可能会引起策略的震荡甚至发散。所以目标网络（Target Network）的引入可以解决这一问题。&lt;br /&gt;
&lt;br /&gt;
于是,&lt;br /&gt;
*'''损失函数表示为'''（忽略无关的方差项）&lt;br /&gt;
&amp;lt;math&amp;gt; L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] &amp;lt;/math&amp;gt;&lt;br /&gt;
*'''梯度为'''&lt;br /&gt;
&amp;lt;math&amp;gt; ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ]  &amp;lt;/math&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
工程中，使用随机梯度下降方法来完成优化，另外当令 &amp;lt;math&amp;gt; θ_{i}^{−} = θ_{i−1} &amp;lt;/math&amp;gt;时，退化为原始的 Q-Learning 更新形式。&lt;br /&gt;
&lt;br /&gt;
DQN的训练与参数更新策略可部分参考以下代码实现：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# DQN Agent&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, action_dim):&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.memory = ReplayMemory(10000)&lt;br /&gt;
        self.policy_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net = DQN(action_dim).to(device)&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.0001)&lt;br /&gt;
        self.exploration_rate = 1.0&lt;br /&gt;
        self.steps_done = 0&lt;br /&gt;
&lt;br /&gt;
    def select_action(self, state):&lt;br /&gt;
        # ϵ-贪心策略&lt;br /&gt;
        if random.random() &amp;lt; self.exploration_rate:&lt;br /&gt;
            return random.randrange(self.action_dim)&lt;br /&gt;
        else:&lt;br /&gt;
            with torch.no_grad():&lt;br /&gt;
                return self.policy_net(state).argmax().item()&lt;br /&gt;
&lt;br /&gt;
    def train(self):&lt;br /&gt;
        # 样本不足时直接返回&lt;br /&gt;
        if len(self.memory) &amp;lt; 64:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # 从经验回放中采样&lt;br /&gt;
        batch = self.memory.sample(64)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        # 转为张量，并去除多余维度&lt;br /&gt;
        states = torch.tensor(np.array(states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        states = states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64).unsqueeze(1).to(device)  # shape: (64, 1)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32).to(device)  # shape: (64,)&lt;br /&gt;
        next_states = torch.tensor(np.array(next_states), dtype=torch.float32).to(device)  # shape: (64, 1, 4, 84, 84)&lt;br /&gt;
        next_states = next_states.squeeze(1)  # shape: (64, 4, 84, 84)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.bool).to(device)  # shape: (64,)&lt;br /&gt;
&lt;br /&gt;
        # 计算当前 Q 值&lt;br /&gt;
        q_values = self.policy_net(states).gather(1, actions).squeeze()&lt;br /&gt;
&lt;br /&gt;
        # 计算下一时刻最大 Q 值&lt;br /&gt;
        next_q_values = self.target_net(next_states).max(1)[0].detach()&lt;br /&gt;
&lt;br /&gt;
        # 计算目标 Q 值&lt;br /&gt;
        target_q_values = rewards + (0.99 * next_q_values * ~dones)&lt;br /&gt;
&lt;br /&gt;
        # 优化&lt;br /&gt;
        loss = F.mse_loss(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
        # 更新探索率&lt;br /&gt;
        if self.exploration_rate &amp;gt; 0.01:&lt;br /&gt;
            self.exploration_rate *= 0.995&lt;br /&gt;
&lt;br /&gt;
    def update_target_net(self):&lt;br /&gt;
        self.target_net.load_state_dict(self.policy_net.state_dict())&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
   ...&lt;br /&gt;
&lt;br /&gt;
    # 定期更新目标网络&lt;br /&gt;
    if episode % 10 == 0:&lt;br /&gt;
        agent.update_target_net()&lt;br /&gt;
   ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN在pytorch中的简单完整实现==&lt;br /&gt;
该代码基于深度Q网络（DQN）算法，是一个简单的使用DQN解决OpenAI Gym中的经典控制任务CartPole-v1的完整例子。任务目标是控制小车左右移动，使竖直杆子尽可能长时间保持直立。智能体通过4维状态（小车位置、速度、杆子角度及角速度）感知环境，输出离散动作（左移/右移），最终实现稳定平衡超过500步的满分表现。&lt;br /&gt;
算法实现​​&lt;br /&gt;
​​Q值网络​​：&lt;br /&gt;
使用三层全连接神经网络（输入4维→128→128→输出2维）近似Q值函数，输出左右移动的动作价值。&lt;br /&gt;
目标网络与主网络分离，定期同步参数以稳定训练。&lt;br /&gt;
​​经验回放​​：&lt;br /&gt;
存储10,000条历史转移样本（状态、动作、奖励、下一状态、终止标志），训练时随机采样64条数据打破时序相关性。&lt;br /&gt;
​​训练机制​​：&lt;br /&gt;
ε-贪婪策略动态衰减（初始ε=1.0，衰减率0.995，最低ε=0.01），平衡探索与利用。&lt;br /&gt;
基于贝尔曼方程计算目标Q值，通过均方误差损失更新网络，折扣因子γ=0.99。&lt;br /&gt;
[[文件:Cartpole.jpg|缩略图|CartPole-v1]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import torch&lt;br /&gt;
import torch.nn as nn&lt;br /&gt;
import torch.optim as optim&lt;br /&gt;
import random&lt;br /&gt;
from collections import deque&lt;br /&gt;
import gym&lt;br /&gt;
&lt;br /&gt;
# 定义Q网络&lt;br /&gt;
class QNetwork(nn.Module):&lt;br /&gt;
    def __init__(self, input_dim, output_dim):&lt;br /&gt;
        super(QNetwork, self).__init__()&lt;br /&gt;
        self.fc = nn.Sequential(&lt;br /&gt;
            nn.Linear(input_dim, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, 128),&lt;br /&gt;
            nn.ReLU(),&lt;br /&gt;
            nn.Linear(128, output_dim)&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        return self.fc(x)&lt;br /&gt;
&lt;br /&gt;
# 定义DQN代理&lt;br /&gt;
class DQNAgent:&lt;br /&gt;
    def __init__(self, state_dim, action_dim, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, min_epsilon=0.01, buffer_size=10000, batch_size=64):&lt;br /&gt;
        self.state_dim = state_dim&lt;br /&gt;
        self.action_dim = action_dim&lt;br /&gt;
        self.gamma = gamma&lt;br /&gt;
        self.epsilon = epsilon&lt;br /&gt;
        self.epsilon_decay = epsilon_decay&lt;br /&gt;
        self.min_epsilon = min_epsilon&lt;br /&gt;
        self.batch_size = batch_size&lt;br /&gt;
&lt;br /&gt;
        self.q_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network = QNetwork(state_dim, action_dim)&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
        self.optimizer = optim.Adam(self.q_network.parameters(), lr=lr)&lt;br /&gt;
&lt;br /&gt;
        self.replay_buffer = deque(maxlen=buffer_size)&lt;br /&gt;
        self.criterion = nn.MSELoss()&lt;br /&gt;
&lt;br /&gt;
    def choose_action(self, state):&lt;br /&gt;
        if random.random() &amp;lt; self.epsilon:&lt;br /&gt;
            return random.randint(0, self.action_dim - 1)&lt;br /&gt;
        else:&lt;br /&gt;
            state = torch.tensor([state], dtype=torch.float32)&lt;br /&gt;
            q_values = self.q_network(state)&lt;br /&gt;
            return torch.argmax(q_values).item()&lt;br /&gt;
&lt;br /&gt;
    def store_experience(self, state, action, reward, next_state, done):&lt;br /&gt;
        self.replay_buffer.append((state, action, reward, next_state, done))&lt;br /&gt;
&lt;br /&gt;
    def update_network(self):&lt;br /&gt;
        if len(self.replay_buffer) &amp;lt; self.batch_size:&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        batch = random.sample(self.replay_buffer, self.batch_size)&lt;br /&gt;
        states, actions, rewards, next_states, dones = zip(*batch)&lt;br /&gt;
&lt;br /&gt;
        states = torch.tensor(states, dtype=torch.float32)&lt;br /&gt;
        actions = torch.tensor(actions, dtype=torch.int64)&lt;br /&gt;
        rewards = torch.tensor(rewards, dtype=torch.float32)&lt;br /&gt;
        next_states = torch.tensor(next_states, dtype=torch.float32)&lt;br /&gt;
        dones = torch.tensor(dones, dtype=torch.float32)&lt;br /&gt;
&lt;br /&gt;
        q_values = self.q_network(states).gather(1, actions.unsqueeze(1)).squeeze()&lt;br /&gt;
        next_q_values = self.target_network(next_states).max(1)[0]&lt;br /&gt;
        target_q_values = rewards + self.gamma * next_q_values * (1 - dones)&lt;br /&gt;
&lt;br /&gt;
        loss = self.criterion(q_values, target_q_values)&lt;br /&gt;
        self.optimizer.zero_grad()&lt;br /&gt;
        loss.backward()&lt;br /&gt;
        self.optimizer.step()&lt;br /&gt;
&lt;br /&gt;
    def update_target_network(self):&lt;br /&gt;
        self.target_network.load_state_dict(self.q_network.state_dict())&lt;br /&gt;
&lt;br /&gt;
    def decay_epsilon(self):&lt;br /&gt;
        self.epsilon = max(self.min_epsilon, self.epsilon * self.epsilon_decay)&lt;br /&gt;
&lt;br /&gt;
# 环境&lt;br /&gt;
env = gym.make('CartPole-v1')&lt;br /&gt;
state_dim = env.observation_space.shape[0]&lt;br /&gt;
action_dim = env.action_space.n&lt;br /&gt;
&lt;br /&gt;
# 初始化代理&lt;br /&gt;
agent = DQNAgent(state_dim, action_dim)&lt;br /&gt;
&lt;br /&gt;
# 训练循环&lt;br /&gt;
episodes = 1000&lt;br /&gt;
for episode in range(episodes):&lt;br /&gt;
    state = env.reset()&lt;br /&gt;
    total_reward = 0&lt;br /&gt;
    done = False&lt;br /&gt;
&lt;br /&gt;
    while not done:&lt;br /&gt;
        action = agent.choose_action(state)&lt;br /&gt;
        next_state, reward, done, _ = env.step(action)&lt;br /&gt;
        agent.store_experience(state, action, reward, next_state, done)&lt;br /&gt;
        agent.update_network()&lt;br /&gt;
        state = next_state&lt;br /&gt;
        total_reward += reward&lt;br /&gt;
&lt;br /&gt;
    agent.update_target_network()&lt;br /&gt;
    agent.decay_epsilon()&lt;br /&gt;
&lt;br /&gt;
    print(f'Episode {episode + 1}/{episodes}, Total Reward: {total_reward}, Epsilon: {agent.epsilon:.3f}')&lt;br /&gt;
&lt;br /&gt;
# 评估&lt;br /&gt;
state = env.reset()&lt;br /&gt;
done = False&lt;br /&gt;
while not done:&lt;br /&gt;
    action = agent.choose_action(state)&lt;br /&gt;
    state, _, done, _ = env.step(action)&lt;br /&gt;
    env.render()&lt;br /&gt;
&lt;br /&gt;
env.close()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DQN 的主要改进算法==&lt;br /&gt;
&lt;br /&gt;
===Double DQN：解决 Q 值过高估计问题===&lt;br /&gt;
====Double DQN的思想====&lt;br /&gt;
[[文件:在DQN与Double DQN中使用目标网络的学习结构.png|缩略图|在DQN与Double DQN中使用目标网络的学习结构]]&lt;br /&gt;
在经典的 Q-Learning 及其深度版本 DQN（Deep Q-Network）中，动作值函数的估计存在系统性偏差，即过高估计（overestimation bias）。这种偏差源自于最大化操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;math&amp;gt; \max_{a} Q(s', a; \theta) &amp;lt;/math&amp;gt;&amp;lt;/nowiki&amp;gt;。当估计的 Q 值存在噪声时，直接选取最大 Q 值动作容易导致期望的过高估计，从而影响策略的稳定性和最终性能。为了减少 DQN 中的 Q 值过高估计，Double DQN 引入了两个 Q 网络：当前 Q 网络和目标 Q 网络&amp;lt;ref&amp;gt;Van Hasselt H, Guez A, Silver D. Deep reinforcement learning with double q-learning[C]//Proceedings of the AAAI conference on artificial intelligence. 2016, 30(1).&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
经典 DQN 的目标 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DQN}} = r_t + \gamma \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中：&lt;br /&gt;
&amp;lt;math&amp;gt; r_t &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t &amp;lt;/math&amp;gt; 获取的奖励，&lt;br /&gt;
&amp;lt;math&amp;gt; \gamma &amp;lt;/math&amp;gt; 是折扣因子，&lt;br /&gt;
&amp;lt;math&amp;gt; \max_{a} Q(s_{t+1}, a; \theta^-) &amp;lt;/math&amp;gt; 是在时间步 &amp;lt;math&amp;gt; t+1 &amp;lt;/math&amp;gt; 下，通过目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt; 计算的最大 Q 值，选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最佳动作。&lt;br /&gt;
&lt;br /&gt;
Double DQN目标 Q 值计算公式改为：&lt;br /&gt;
&amp;lt;math&amp;gt; y_t^{\mathrm{DoubleDQN}} = r_t + \gamma Q\bigl(s_{t+1}, \arg\max_a Q(s_{t+1}, a; \theta); \theta^- \bigr) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
动作选择：依然通过当前 Q 网络 &amp;lt;math&amp;gt; Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt; 来选择下一个状态 &amp;lt;math&amp;gt; s_{t+1} &amp;lt;/math&amp;gt; 中的最优动作，&amp;lt;math&amp;gt; a^* = \arg\max_a Q(s_{t+1}, a; \theta) &amp;lt;/math&amp;gt;，这个步骤使用的是当前网络 &amp;lt;math&amp;gt; \theta &amp;lt;/math&amp;gt; 来选择动作。&lt;br /&gt;
&lt;br /&gt;
动作评估：评估这个动作的 Q 值时，使用的是目标网络 &amp;lt;math&amp;gt; \theta^- &amp;lt;/math&amp;gt;，即评估选中的动作 &amp;lt;math&amp;gt; a^* &amp;lt;/math&amp;gt; 对应的 Q 值：&amp;lt;math&amp;gt; Q(s_{t+1}, a^*; \theta^-) &amp;lt;/math&amp;gt;，通过这种方式，Double DQN 通过分开动作选择和动作评估，避免了经典 DQN 中同一网络同时执行选择和评估的操作，从而减少了因选择最大 Q 值而导致的过高估计偏差。&lt;br /&gt;
====Double DQN的优势====&lt;br /&gt;
&lt;br /&gt;
传统 DQN 在更新时，直接用目标网络估计的最大 Q 值作为目标，这种“最大化”操作容易从噪声中挑选出偏大值，导致整体偏高。Double DQN 则先用当前网络挑选动作，再用目标网络计算价值，避免了单一网络同时负责选动作和评估动作价值所带来的偏差。Double DQN 是一种简单有效的改进策略，通过“动作选择”和“动作评估”分开估计，显著缓解了 Q 值过高估计问题，提高了深度强化学习算法的稳定性和性能，已成为深度强化学习领域的重要方法之一。&lt;br /&gt;
&lt;br /&gt;
===Dueling DQN：分离状态价值与优势函数===&lt;br /&gt;
====Dueling DQN的思想====&lt;br /&gt;
Dueling DQN（Dueling Deep Q-Network）是对经典 DQN 的一种结构性改进，旨在提升智能体在复杂环境中的学习效率和稳定性&amp;lt;ref&amp;gt;Wang Z, Schaul T, Hessel M, et al. Dueling network architectures for deep reinforcement learning[C]//International conference on machine learning. PMLR, 2016: 1995-2003.&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
在传统的 DQN 中，Q 值函数 Q(s,a) 直接输出每个动作的价值。然而，在许多情况下，某些状态下的所有动作的价值差异较小，导致学习过程中的梯度更新效率低下。Dueling DQN 通过将 Q 值函数分解为状态价值函数 V(s) 和优势函数 A(s,a)，使得网络能够分别评估状态的总体价值和各个动作的相对优势，从而提高学习效率。具体地，Dueling DQN 的 Q 值计算公式为：&lt;br /&gt;
&amp;lt;math&amp;gt; Q(s, a) = V(s) + A(s, a) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，V(s) 是状态s的价值，表示在该状态下智能体的期望回报；A(s,a) 是动作a相对于当前状态的优势，表示在该状态下采取动作a相对于其他动作的优势程度。&lt;br /&gt;
[[文件:Dueling DQN 网络结构示意图.png|缩略图|Dueling DQN 网络结构示意图]]&lt;br /&gt;
Dueling DQN 的网络结构在传统 DQN 的基础上进行了修改。&lt;br /&gt;
&lt;br /&gt;
具体而言，网络的前几层共享，用于提取输入状态的特征；然后，网络分为两个分支：一个用于计算状态价值函数V(s)，另一个用于计算优势函数 A(s,a)。最后，两个分支的输出被合并，得到每个动作的 Q 值估计。这种结构使得网络能够更有效地学习到状态的价值和动作的优势，从而提高学习性能。&lt;br /&gt;
&lt;br /&gt;
====Dueling DQN的优势====&lt;br /&gt;
（1）提高学习效率：通过分离状态价值和动作优势，Dueling DQN 能够更好地聚焦于重要信息，减少无关因素干扰，提高学习效率。&lt;br /&gt;
（2）增强鲁棒性：对状态价值和优势的独立建模有助于缓解环境噪声和稀疏奖励带来的影响，提高算法的鲁棒性。&lt;br /&gt;
（3）提升泛化能力：Dueling 架构允许网络在未见过的环境中更快地推断出合理的 Q 值，增强了算法的泛化能力。&lt;br /&gt;
&lt;br /&gt;
===DRQN=== &lt;br /&gt;
====DRQN的思想====&lt;br /&gt;
[[文件:DRQN架构.png|缩略图|DRQN架构]]&lt;br /&gt;
Deep Recurrent Q-Network（DRQN）是对经典 DQN 的一种扩展，旨在解决部分可观察马尔可夫决策过程（POMDP）中的挑战&amp;lt;ref&amp;gt;Hausknecht M J, Stone P. Deep Recurrent Q-Learning for Partially Observable MDPs[C]//AAAI fall symposia. 2015, 45: 141.&amp;lt;/ref&amp;gt;。在 POMDP 中，智能体无法获得完整的环境状态信息，传统的 DQN 依赖于完整的观察序列进行决策，可能导致性能下降。DRQN 通过引入递归神经网络（RNN），特别是长短期记忆（LSTM）网络，使智能体能够处理部分观察信息，保留历史信息，从而在部分可观察的环境中表现出更好的性能。DRQN 的核心思想是将传统 DQN 的全连接层替换为 LSTM 层，以便在每个时间步都能保留历史信息。具体而言，DRQN 的 Q 值计算公式为：&amp;lt;math&amp;gt; Q(s_t, a_t) = \text{LSTM}(h_{t-1}, [\phi(s_t), a_t]) &amp;lt;/math&amp;gt;&lt;br /&gt;
其中，&amp;lt;math&amp;gt; h_{t-1} &amp;lt;/math&amp;gt; 是上一时间步的隐藏状态，&amp;lt;math&amp;gt; \phi(s_t) &amp;lt;/math&amp;gt; 是当前状态的特征表示，&amp;lt;math&amp;gt; a_t &amp;lt;/math&amp;gt; 是当前动作。通过这种方式，DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分可观察的环境。&lt;br /&gt;
&lt;br /&gt;
DRQN 的网络结构通常包括以下几个部分：&lt;br /&gt;
（1）卷积层（Convolutional Layers）：用于从输入图像中提取特征。&lt;br /&gt;
（2）LSTM 层：用于处理时间序列数据，保留历史信息。&lt;br /&gt;
（3）全连接层（Fully Connected Layer）：用于输出每个动作的 Q 值。&lt;br /&gt;
这种结构使得 DRQN 能够在每个时间步都考虑到历史信息，从而更好地应对部分[https://marl-ieee-nitk.github.io/deep-reinforcement-learning/2019/01/06/DRQN.html? 可观察的环境]。&lt;br /&gt;
&lt;br /&gt;
====DRQN的优势与局限====&lt;br /&gt;
1.优势&lt;br /&gt;
&lt;br /&gt;
（1）处理部分可观察环境：DRQN 能够在每个时间步都保留历史信息，从而在部分可观察的环境中表现出更好的性能。&lt;br /&gt;
（2）提高决策质量：通过引入 LSTM 层，DRQN 能够更好地捕捉时间序列中的长期依赖关系，从而提高决策质量。&lt;br /&gt;
（3）适应性强：DRQN 可以适应不同的环境和任务，具有较强的泛化能力。&lt;br /&gt;
&lt;br /&gt;
2.局限&lt;br /&gt;
&lt;br /&gt;
（1）训练难度：由于引入了 LSTM 层，DRQN 的训练过程可能比传统 DQN 更加复杂和困难。&lt;br /&gt;
（2）计算资源需求高：LSTM 层的引入增加了计算量，对硬件资源的要求更高。&lt;br /&gt;
（3）超参数调优复杂：LSTM 层引入了更多的超参数，需要进行精细的调优。&lt;br /&gt;
&lt;br /&gt;
==DQN 的应用领域==&lt;br /&gt;
&lt;br /&gt;
===Atari 游戏中的应用与表现===&lt;br /&gt;
&amp;lt;ref&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;的作者在 49 款 Atria 游戏上进行测试，大多数达到了人类水平，并且有 43 款达到了 SOTA（最先进水平State-Of-The-Art）。图中 100% 和 0% 分别代表人类水平和随机策略水平。&lt;br /&gt;
[[文件:结果图.png|缩略图|性能表现]]&lt;br /&gt;
'''性能表现​​'''&lt;br /&gt;
DQN在49款Atari 2600游戏上的测试结果，参见&amp;lt;ref&amp;gt;{{cite journal|last=Mnih|first=V.|last2=Kavukcuoglu|first2=K.|title=Human-level control through deep reinforcement learning|journal=Nature|year=2015|volume=518|pages=529–533|issue=7540|doi=10.1038/nature14236|pmid=25719670}}&amp;lt;/ref&amp;gt;。其展现了突破性性能。在​​统一网络架构、算法和超参数​​的前提下，仅以原始像素和游戏分数为输入，DQN在43款游戏中超越了此前所有强化学习算法（如线性函数逼近和SARSA）。更显著的是，其表现达到​​人类专业玩家水平的75%以上​​的游戏中占29款（超过总数半数）。典型案例如：&lt;br /&gt;
*'''Breakout'''中，DQN得分达401.2（随机策略为1.7，人类为31.8），相当于人类水平的1327%。其成功源于自主学会&amp;quot;挖隧道&amp;quot;策略：优先击碎侧边砖块，引导球体从后方破坏整列砖块。&lt;br /&gt;
*'''Pong​​'''以18.9分（人类9.3分）实现132%的人类水平，动作价值预测精准；&lt;br /&gt;
*'''Video Pinball​​'''更以42,684分（人类17,298分）达成2539%的人类水平，证明对复杂物理机制的高效利用。&lt;br /&gt;
训练过程稳定性通过​​平均每局得分​​和​​预测Q值曲线​​得到验证，见图[[文件:Q值训练.jpg|缩略图|预测Q值曲线]]，二者均随训练稳步上升，未出现传统Q学习的发散现象。奖励裁剪策略（正奖励+1，负奖励-1）则确保了不同游戏间学习率的一致性。&lt;br /&gt;
​​&lt;br /&gt;
'''泛化与表征能力​​'''&lt;br /&gt;
DQN的核心突破在于其​​从高维输入中学习通用表征的能力​​。&lt;br /&gt;
通过t-SNE降维可视化，DQN的最终隐藏层表征显示：&lt;br /&gt;
感知相似状态​​（如敌机密集排列的屏幕）被映射到嵌入空间的相邻位置，见图[[文件:人类表征对比.jpg|缩略图]]；&lt;br /&gt;
​奖励等价但感知不同状态​​（如游戏末尾阶段的掩体场景）同样被聚类——这些状态因即时奖励潜力低被赋予相似价值（V值），证明网络超越了表层像素特征，学会了与决策相关的抽象特征。&lt;br /&gt;
进一步实验表明，该表征可​​泛化至人类玩家产生的状态​​：将人类30分钟游戏数据输入DQN网络，其t-SNE嵌入与智能体自身2小时游戏数据的嵌入结构高度重叠，证明表征不受策略依赖性的限制。&lt;br /&gt;
&lt;br /&gt;
'''价值函数的预测能力通过具体案例得到验证：'''&lt;br /&gt;
*'''Breakout​​'''中，当智能体即将&amp;quot;挖通&amp;quot;砖墙时，Q值跃升至23，预示后续自动清屏的高收益；&lt;br /&gt;
*'''Pong'''中，若球体接近球拍时选择&amp;quot;向下&amp;quot;动作，Q值实时降至-0.9，准确反映丢失球体的风险。&lt;br /&gt;
这些结果证明，DQN通过端到端训练构建的表征能同时支持​​感知泛化​​与​​长期价值推理​​。&lt;br /&gt;
&lt;br /&gt;
===机器人控制与路径规划===&lt;br /&gt;
[[文件:DQN与传统路径规划算法的对比.jpg|缩略图|DQN与传统路径规划算法的对比]]&lt;br /&gt;
参考综述&amp;lt;ref&amp;gt;{{cite journal|last1=Sun|first1=Huihui|last2=Zhang|first2=Weijie|last3=Yu|first3=Runxiang|last4=Zhang|first4=Yujie|title=Motion planning for mobile robots—Focusing on deep reinforcement learning: A systematic review|journal=IEEE Access|year=2021|volume=9|pages=69061–69081|doi=10.1109/ACCESS.2021.3076530|publisher=IEEE}}&amp;lt;/ref&amp;gt;这些方法都是使用DQN直接从原始传感器数据映射到动作，无需依赖预先构建的环境模型或先验知识。&lt;br /&gt;
* 输入类型​​：包括RGB图像、深度图像、激光雷达点云等，用于感知环境状态。&lt;br /&gt;
* 输出动作：离散动作空间（如前进、左转、右转），适用于导航和避障任务。&lt;br /&gt;
[[文件:应用于机器人路径规划.jpg|缩略图|基于DQN的机器人控制与路径规划算法示意图]]&lt;br /&gt;
'''典型应用案例​​'''&lt;br /&gt;
​​&lt;br /&gt;
*'''室内导航与避障​​'''：&lt;br /&gt;
​​Tai等人（2017）&amp;lt;ref&amp;gt;{{cite journal|last1=Tai|first1=Lei|last2=Paolo|first2=Giuseppe|last3=Liu|first3=Ming|title=Virtual-to-real deep reinforcement learning: Continuous control of mobile robots for mapless navigation|journal=IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)|year=2017|pages=31-36|doi=10.1109/IROS.2017.8202134|publisher=IEEE}}&amp;lt;/ref&amp;gt;：使用深度图像作为输入，训练轮式机器人在走廊环境中实现无地图导航，输出连续转向指令。&lt;br /&gt;
​​Zhang等人（2020）&amp;lt;ref&amp;gt;{{cite journal| last1 = Wang| first1 = Y.| last2 = Sun| first2 = J.| last3 = He| first3 = H.| last4 = Sun| first4 = C.| title = Deterministic policy gradient with integral compensator for robust quadrotor control| journal = IEEE Transactions on Systems, Man, and Cybernetics: Systems| volume = 50| issue = 10| pages = 3713–3725| year = 2020| doi = 10.1109/TSMC.2020.3002218| publisher = IEEE}}​​&amp;lt;/ref&amp;gt;：通过特征迁移策略，将仿真环境训练的DQN模型迁移至真实机器人，解决仿真到现实（Sim-to-Real）的泛化问题。&lt;br /&gt;
​​Barron等人（2019）&amp;lt;ref&amp;gt; {{cite conference| last1 = Barron| first1 = T.| last2 = Whitehead| first2 = M.| last3 = Yeung| first3 = A.| title = Deep reinforcement learning in a 3-D blockworld environment| booktitle = Proceedings of the International Joint Conference on Artificial Intelligence (IJCAI)| pages = 1–6| year = 2016| publisher = IJCAI/AAAI Press}}​​&amp;lt;/ref&amp;gt;​​：在3D虚拟环境中，采用RGB图像输入训练机器人，在复杂自然场景中实现优于深度输入的导航性能。&lt;br /&gt;
​​​​&lt;br /&gt;
*'''未知环境探索​​'''：&lt;br /&gt;
​​Haora等人（2020）&amp;lt;ref&amp;gt;​​ {{cite journal| last1 = Li| first1 = H.| last2 = Zhang| first2 = Q.| last3 = Zhao| first3 = D.| title = Deep reinforcement learning-based automatic exploration for navigation in unknown environment| journal = IEEE Transactions on Neural Networks and Learning Systems| volume = 31| issue = 6| pages = 2064–2076| year = 2020| doi = 10.1109/TNNLS.2019.2930059| publisher = IEEE}}&amp;lt;/ref&amp;gt;​​：提出自适应全卷积Q网络（AFCQN），结合局部地图信息，显著降低未知环境中的导航失败率。&lt;br /&gt;
​​​​​​&lt;br /&gt;
*'''无人机控制​​'''：&lt;br /&gt;
​​Kang等人（2019）&amp;lt;ref&amp;gt;{{cite journal|last1=Kang|first1=Kyunghoon|last2=Belkhale|first2=Suneel|last3=Kahn|first3=Gregory|last4=Abbeel|first4=Pieter|last5=Levine|first5=Sergey|title=Generalization through simulation: Integrating simulated and real data into deep reinforcement learning for vision-based autonomous flight|journal=IEEE International Conference on Robotics and Automation (ICRA)|year=2019|pages=6008-6014|doi=10.1109/ICRA.2019.8793701|publisher=IEEE}}​​&amp;lt;/ref&amp;gt;：仅用单目视觉输入，训练四旋翼无人机在真实环境中实现动态避障。&lt;br /&gt;
&lt;br /&gt;
当然也存在一些局限性，比如DQN 仅支持离散动作，无法直接应用于连续控制（如无人机精细姿态调整），需依赖DDPG等算法补充。训练需大量交互数据，现实场景中数据采集成本高。稀疏奖励环境下（如目标距离远），学习效率下降。就是DQN 通过端到端学习与经验回放机制，在移动机器人视觉导航、室内避障及无人机控制中取得显著成果。其核心价值在于​​处理高维感知数据的能力​​和​​算法稳定性​​，但需结合改进技术（如Double DQN、Rainbow）以提升性能。未来研究需解决连续动作支持与样本效率问题，以扩大应用场景。&lt;br /&gt;
&lt;br /&gt;
===推荐系统中的策略优化===&lt;br /&gt;
文章&amp;lt;ref&amp;gt;{{cite journal&lt;br /&gt;
 | author  = {Chen, Xiaocong and Yao, Lina and McAuley, Julian and Zhou, Guanglin and Wang, Xianzhi}&lt;br /&gt;
 | year    = 2021&lt;br /&gt;
 | title   = A survey of deep reinforcement learning in recommender systems: A systematic review and future directions&lt;br /&gt;
 | journal = arXiv preprint&lt;br /&gt;
 | volume  = &lt;br /&gt;
 | pages   = arXiv:2109.03540&lt;br /&gt;
 | url     = https://arxiv.org/abs/2109.03540&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;提供了强化学习在推荐系统中的应用，具体思路流程见右图所示。&lt;br /&gt;
[[文件:基于强化学习的推荐系统.jpg|缩略图|基于强化学习的推荐系统]]&lt;br /&gt;
其中，深度Q网络（DQN）通过建模用户动态偏好和长期价值，解决了传统推荐系统面临的​​探索-利用困境​​和​​延迟奖励优化问题​​。其核心思想是将推荐视为序列决策过程：用户状态 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt; 为历史交互特征，动作 a&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为待推荐物品，奖励 r&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;为点击/转化等反馈。&lt;br /&gt;
&lt;br /&gt;
​​'''问题建模与优势​​'''&lt;br /&gt;
​​动态偏好捕捉​​（vs. 静态协同过滤）：&lt;br /&gt;
DQN通过时序状态转移（s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;→s&amp;lt;sub&amp;gt;t+1&amp;lt;/sub&amp;gt;）实时更新用户兴趣表征，克服协同过滤的静态建模局限。&lt;br /&gt;
​​长期价值优化​​（vs. 即时收益模型）：最大化累计奖励 R&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;=∑ γ&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; r &amp;lt;sub&amp;gt;t+k&amp;lt;/sub&amp;gt;，避免短视策略（如仅推荐热门商品）。&lt;br /&gt;
​​探索机制​​：ε-greedy策略主动推荐低曝光商品，缓解冷启动问题。&lt;br /&gt;
'''技术实现架构​​'''&lt;br /&gt;
​​状态表征​​：用户画像（性别/年龄） + 行为序列（点击/购买历史） → 嵌入层 → LSTM编码 → 状态向量 s&amp;lt;sub&amp;gt;t&amp;lt;/sub&amp;gt;。&lt;br /&gt;
​​动作空间​​：离散候选物品集 {a&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,a&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,...,a&amp;lt;sub&amp;gt;N&amp;lt;/sub&amp;gt;}（N=千至百万级）。&lt;br /&gt;
​​网络结构​​如右图所示&lt;br /&gt;
[[文件:基于dqn的推荐系统算法.jpg|缩略图|基于dqn的推荐系统算法]]&lt;br /&gt;
。&lt;br /&gt;
&lt;br /&gt;
==DQN 的局限性与挑战==&lt;br /&gt;
&lt;br /&gt;
===对连续动作空间的处理困难===&lt;br /&gt;
DQN 作为一个基于离散动作空间的算法，在面对连续动作空间时表现不佳。传统的 DQN 将动作空间离散化为有限的几种选择，并对每一个动作分别进行 Q 值更新。然而，在实际应用中，许多任务要求在连续的动作空间中进行选择（如机器人控制、自动驾驶等），这使得 DQN 难以直接应用。&lt;br /&gt;
&lt;br /&gt;
为了解决这个问题，研究者们提出了如深度确定性策略梯度（DDPG）&amp;lt;ref&amp;gt;Lillicrap, T. P., Hunt, J. J., Pritzel, A., Heess, N., Erez, T., Tassa, Y., ... &amp;amp; Wierstra, D. (2015). Continuous control with deep reinforcement learning. ''arXiv preprint arXiv:1509.02971''.&amp;lt;/ref&amp;gt;、软行为者-评论家（SAC）等算法，这些算法使用连续的策略输出，并结合策略梯度方法来优化连续动作空间中的决策过程。然而，DQN 在处理连续动作空间时的适应性仍然是一个亟待解决的难题。&lt;br /&gt;
&lt;br /&gt;
===训练过程中的样本效率问题===&lt;br /&gt;
DQN 在训练过程中需要大量的与环境的交互数据，才能有效地学习到最优策略，这使得样本效率低下。为了减少训练时间，DQN 引入了经验回放（Experience Replay）机制，将历史经验存储在回放缓冲区，并在训练过程中随机抽取样本进行学习。虽然这种方法能有效缓解相关性带来的问题，但它并不能从根本上解决样本效率问题。&lt;br /&gt;
&lt;br /&gt;
低样本效率使得 DQN 在需要快速反应或交互受限的环境中（如现实世界中的机器人控制）表现不理想。此外，训练数据的高需求增加了计算开销，并且可能导致算法在实际任务中的应用不够灵活。文章&amp;lt;ref&amp;gt;Hessel, M., Modayil, J., Van Hasselt, H., Schaul, T., Ostrovski, G., Dabney, W., ... &amp;amp; Silver, D. (2018, April). Rainbow: Combining improvements in deep reinforcement learning. In ''Proceedings of the AAAI conference on artificial intelligence'' (Vol. 32, No. 1).&amp;lt;/ref&amp;gt;提出了Rainbow DQN，将多种 DQN 的改进技术融合，以提高 DQN 的稳定性和样本效率。&lt;br /&gt;
&lt;br /&gt;
===策略收敛速度慢与稳定性问题===&lt;br /&gt;
DQN 的训练过程通常存在收敛速度慢和训练不稳定的问题。由于 Q 值函数是通过神经网络逼近的，而深度神经网络本身容易出现梯度爆炸、梯度消失等问题，这会导致训练过程中的不稳定。此外，Q 值更新过程中的目标值（即最大化的 Q 值）通常会发生变化，导致目标网络和行为网络之间的不一致，这会进一步加剧训练的震荡和不稳定。&lt;br /&gt;
&lt;br /&gt;
为了提高稳定性，DQN 引入了目标网络（Target Network）和经验回放机制。目标网络的引入使得 Q 值的更新目标在一定时间内保持不变，从而避免了目标网络的不断变化对训练过程的影响。文章&amp;lt;ref&amp;gt;Schulman, J., Wolski, F., Dhariwal, P., Radford, A., &amp;amp; Klimov, O. (2017). Proximal policy optimization algorithms. ''arXiv preprint arXiv:1707.06347''.&amp;lt;/ref&amp;gt;介绍了 PPO 算法，解决了策略优化中稳定性差和收敛速度慢的问题。然而，尽管这些技术改善了稳定性，DQN 的收敛速度和训练过程的稳定性问题依然存在，特别是在复杂的环境中。&lt;br /&gt;
&lt;br /&gt;
===泛化能力与过拟合风险===&lt;br /&gt;
DQN 在面对高维状态空间和复杂环境时，容易出现过拟合问题。在训练过程中，DQN 通过对大量的环境交互进行学习来更新 Q 值函数。然而，在有限的训练数据上，DQN 可能会过度拟合某些特定的状态和动作，从而失去对未知环境或未见过状态的适应能力。&lt;br /&gt;
&lt;br /&gt;
这种过拟合的现象特别明显在高维空间或多变环境中，智能体的泛化能力受到限制。当智能体在一个有限的训练环境中获得训练后，其学到的策略在新的或略微不同的环境中表现较差。为了解决这一问题，提出了更先进的技术，如正则化、自动调整网络结构等方法，以增强模型的泛化能力，但这些方法仍未能完全消除 DQN 在复杂环境中面临的过拟合风险。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==参考文献与延伸阅读==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>DeepQ</name></author>
	</entry>
</feed>