强化学习算法(DDQN)
深度强化学习的决斗网络架构
0 阅读指引与要点
- 🌟 核心目标:在 无模型强化学习 中引入 价值流 V 与 优势流 A 解耦的 决斗网络(Dueling Network),提升跨动作泛化与稳定性。
- 🚀 关键创新:通过 价值/优势双流 + 聚合层,无需改动基础算法即可获得更鲁棒的动作评估;结合 DDQN + 优先回放,在 Atari 57 游戏取得显著提升。
- 📖 推荐阅读:摘要 → 2 背景(DDQN 目标)→ 3 架构 → 4 实验结果 → 附录算法。
- 🛠 实践提示:大动作空间或动作价值相近时,优先采用 决斗网络 + 优先回放 + DDQN 目标;注意学习率、梯度裁剪与回放采样权重。
摘要
近年来,深度表征在强化学习中取得了诸多成功。尽管如此,许多此类应用仍采用传统架构,如卷积网络、LSTM或自编码器。本文提出一种用于无模型强化学习的新型神经网络架构。我们的决斗网络包含两个独立估计器:一个用于状态价值函数,另一个用于状态依赖的动作优势函数。这种分解的主要优势在于,无需对底层强化学习算法进行任何修改,即可实现跨动作的泛化学习。结果表明,在存在多个相似价值动作的情况下,该架构能实现更优的策略评估。此外,决斗架构使强化学习智能体在 Atari 2600 领域的性能超过当时最先进水平。
1. 引言
过去几年,深度学习极大地推动了机器学习在可扩展性和性能方面的显著进步(LeCun et al., 2015)。其中一个令人振奋的应用是强化学习(RL)与控制的序贯决策场景。典型案例包括深度Q学习(Mnih et al., 2015)、深度视觉运动策略(Levine et al., 2015)、基于循环网络的注意力机制(Ba et al., 2015)以及带嵌入的模型预测控制(Watter et al., 2015)。其他近期成果包括大规模并行框架(Nair et al., 2015)和围棋专家落子预测(Maddison et al., 2015),后者生成的策略可与蒙特卡洛树搜索程序相媲美,结合搜索后甚至击败了职业选手(Silver et al., 2016)。尽管如此,大多数强化学习方法仍使用标准神经网络,如卷积网络、MLP、LSTM和自编码器。这些近期进展的重点在于设计改进的控制与强化学习算法,或仅将现有神经网络架构整合到强化学习方法中。本文则采用一种替代但互补的方法,主要专注于创新更适合无模型强化学习的神经网络架构。该方法的优势在于,新网络可轻松与现有及未来的强化学习算法相结合。即本文提出了一种新网络(图1),但使用已发表的算法。
我们提出的网络架构(命名为竞争架构)明确分离了状态值和(依赖状态的)动作优势的表示。该竞争架构包含两个流,分别表示值函数和优势函数,同时共享一个公共的卷积特征学习模块。这两个流通过一个特殊的聚合层组合,以生成状态-动作值函数QQQ的估计值,如图1所示。这种竞争网络应被理解为一个具有两个流的单一QQQ网络,它取代了现有算法(如深度Q网络,DQN;Mnih等人,2015)中常用的单流QQQ网络。竞争网络无需任何额外监督,即可自动生成状态值函数和优势函数的独立估计。
直观地说,竞争架构能够学习哪些状态有价值(或无价值),而无需学习每个状态下每个动作的影响。这在动作对环境没有任何相关影响的状态中尤其有用。为说明这一点,考虑图21{2}^{1}21所示的显著性图。这些图是通过计算训练后的价值流和优势流相对于输入视频的雅可比矩阵生成的,方法遵循Simonyan等人(2013)的提议。(实验部分更详细地描述了此方法。)图中显示了两个不同时间步的价值和优势显著性图。在一个时间步(最左侧图像对)中,我们看到价值网络流关注道路,特别是新车辆出现的地平线,同时也关注分数。另一方面,优势流对视觉输入的关注较少,因为当前方没有车辆时,其动作选择实际上无关紧要。然而,在第二个时间步(最右侧图像对)中,由于前方有车辆,优势流会关注,此时其动作选择至关重要。
在实验中,我们证明当学习问题中添加冗余或相似动作时,竞争架构能在策略评估期间更快地识别正确动作。
我们还在具有挑战性的Atari 2600测试平台上评估了竞争架构带来的改进。在此平台上,具有相同结构和超参数的强化学习智能体必须仅通过观察图像像素和游戏分数来玩57种不同的游戏。结果表明,该架构相较于Mnih等人(2015)和van Hasselt等人(2015)的单流基线有显著改进。将优先回放(Schaul等人,2016)与所提出的竞争网络相结合,在这一热门领域取得了新的最先进水平。
1.1. 相关工作
保持分离的值函数和优势函数的概念可追溯至Baird(1993)。在Baird最初的优势更新算法中,共享的贝尔曼残差更新方程被分解为两个更新:一个用于状态值函数,另一个用于其相关的优势函数。Harmon等人(1995)的研究表明,在简单的连续时间域中,优势更新比Q学习收敛更快。其后续算法——优势学习算法仅表示单一的优势函数(Harmon & Baird,1996)。
竞争架构通过一个深度模型同时表示值V(s)V\left( s\right)V(s)和优势A(s,a)A\left( {s,a}\right)A(s,a)函数,其输出结合两者以产生状态-动作值Q(s,a)Q\left( {s,a}\right)Q(s,a)。与优势更新不同,该架构的表示和算法在结构上是解耦的。因此,竞争架构可与多种无模型强化学习算法结合使用。
优势函数在策略梯度中有着悠久的历史,始于Sutton等人(2000)。作为该领域近期的研究实例,Schulman等人(2015)在线估计优势值以减少策略梯度算法的方差。
已有多项研究尝试使用深度强化学习玩雅达利游戏,包括Mnih等人(2015)、Guo等人(2014)、Stadie等人(2015)、Nair等人(2015)、van Hasselt等人(2015)、Bellemare等人(2016)以及Schaul等人(2016)。Schaul等人(2016)的结果是目前已发表的最先进水平。
2. 背景
我们考虑一个序贯决策场景,其中智能体在离散时间步与环境E\mathcal{E}E交互,相关介绍参见Sutton和Barto(1998)。例如,在雅达利游戏领域,智能体感知由MMM个图像帧组成的视频st{s}_{t}st:在时间步ttt的st=(xt−M+1,…,xt)∈ S{s}_{t} = \left( {{x}_{t - M + 1},\ldots ,{x}_{t}}\right) \in \; \mathcal{S}st=(xt−M+1,…,xt)∈S。然后智能体从离散动作集at∈A={1,…,∣A∣}{a}_{t} \in \mathcal{A} = \{ 1,\ldots ,\left| \mathcal{A}\right| \}at∈A={1,…,∣A∣}中选择一个动作,并观察由游戏模拟器产生的奖励信号rt{r}_{t}rt。
智能体寻求最大化期望折扣回报,我们将折扣回报定义为Rt= ∑τ=t∞γτ−trτ{R}_{t} = \; \mathop{\sum }\limits_{{\tau = t}}^{\infty }{\gamma }^{\tau - t}{r}_{\tau }Rt=τ=t∑∞γτ−trτ。在此公式中,γ∈[0,1]\gamma \in \left\lbrack {0,1}\right\rbrackγ∈[0,1]是权衡即时奖励和未来奖励重要性的折扣因子。
对于遵循随机策略π\piπ的智能体,状态-动作对(s,a)\left( {s,a}\right)(s,a)和状态sss的值定义如下
Qπ(s,a)=E[Rt∣st=s,at=a,π] ,and {Q}^{\pi }\left( {s,a}\right) = \mathbb{E}\left\lbrack {{R}_{t} \mid {s}_{t} = s,{a}_{t} = a,\pi }\right\rbrack \text{ ,and } Qπ(s,a)=E[Rt∣st=s,at=a,π] ,and
Vπ(s)=Ea∼π(s)[Qπ(s,a)].(1) {V}^{\pi }\left( s\right) = {\mathbb{E}}_{a \sim \pi \left( s\right) }\left\lbrack {{Q}^{\pi }\left( {s,a}\right) }\right\rbrack . \tag{1} Vπ(s)=Ea∼π(s)[Qπ(s,a)].(1)
前述状态-动作值函数(简称(Q(Q(Q函数)可通过动态规划递归计算:
Qπ(s,a)=Es′[r+γEa′∼π(s′)[Qπ(s′,a′)]∣s,a,π]. {Q}^{\pi }\left( {s,a}\right) = {\mathbb{E}}_{{s}^{\prime }}\left\lbrack {r + \gamma {\mathbb{E}}_{{a}^{\prime } \sim \pi \left( {s}^{\prime }\right) }\left\lbrack {{Q}^{\pi }\left( {{s}^{\prime },{a}^{\prime }}\right) }\right\rbrack \mid s,a,\pi }\right\rbrack . Qπ(s,a)=Es′[r+γEa′∼π(s′)[Qπ(s′,a′)]∣s,a,π].
我们定义最优Q∗(s,a)=maxπQπ(s,a){Q}^{ * }\left( {s,a}\right) = \mathop{\max }\limits_{\pi }{Q}^{\pi }\left( {s,a}\right)Q∗(s,a)=πmaxQπ(s,a)。在确定性策略a=argmaxa′∈AQ∗(s,a′)a = \arg \mathop{\max }\limits_{{{a}^{\prime } \in \mathcal{A}}}{Q}^{ * }\left( {s,{a}^{\prime }}\right)a=arga′∈AmaxQ∗(s,a′)下,有V∗(s)=maxaQ∗(s,a){V}^{ * }\left( s\right) = \mathop{\max }\limits_{a}{Q}^{ * }\left( {s,a}\right)V∗(s)=amaxQ∗(s,a)。由此还可推知,最优QQQ函数满足贝尔曼方程:
Q∗(s,a)=Es′[r+γmaxa′Q∗(s′,a′)∣s,a].(2) {Q}^{ * }\left( {s,a}\right) = {\mathbb{E}}_{{s}^{\prime }}\left\lbrack {r + \gamma \mathop{\max }\limits_{{a}^{\prime }}{Q}^{ * }\left( {{s}^{\prime },{a}^{\prime }}\right) \mid s,a}\right\rbrack . \tag{2} Q∗(s,a)=Es′[r+γa′maxQ∗(s′,a′)∣s,a].(2)
我们定义另一个重要量,即优势函数,它关联值函数和QQQ函数:
Aπ(s,a)=Qπ(s,a)−Vπ(s).(3) {A}^{\pi }\left( {s,a}\right) = {Q}^{\pi }\left( {s,a}\right) - {V}^{\pi }\left( s\right) . \tag{3} Aπ(s,a)=Qπ(s,a)−Vπ(s).(3)
注意Ea∼π(s)[Aπ(s,a)]=0{\mathbb{E}}_{a \sim \pi \left( s\right) }\left\lbrack {{A}^{\pi }\left( {s,a}\right) }\right\rbrack = 0Ea∼π(s)[Aπ(s,a)]=0。直观上,值函数VVV衡量处于特定状态sss的好坏程度。而QQQ函数衡量在该状态下选择特定动作的价值。优势函数通过从Q函数中减去状态值,得到每个动作重要性的相对度量。
2.1. 深度Q网络
前一节描述的值函数是高维对象。为对其进行近似,我们可以使用深度QQQ网络:具有参数θ\thetaθ的Q(s,a;θ)Q\left( {s,a;\theta }\right)Q(s,a;θ)。为估计该网络,我们在迭代iii时优化以下损失函数序列:
Li(θi)=Es,a,r,s′[(yiDQN−Q(s,a;θi))2],(4) {L}_{i}\left( {\theta }_{i}\right) = {\mathbb{E}}_{s,a,r,{s}^{\prime }}\left\lbrack {\left( {y}_{i}^{DQN} - Q\left( s,a;{\theta }_{i}\right) \right) }^{2}\right\rbrack , \tag{4} Li(θi)=Es,a,r,s′[(yiDQN−Q(s,a;θi))2],(4)
其中
yiDQN=r+γmaxa′Q(s′,a′;θ−),(5) {y}_{i}^{DQN} = r + \gamma \mathop{\max }\limits_{{a}^{\prime }}Q\left( {{s}^{\prime },{a}^{\prime };{\theta }^{ - }}\right) , \tag{5} yiDQN=r+γa′maxQ(s′,a′;θ−),(5)
其中θ−{\theta }^{ - }θ−表示固定且独立的目标网络的参数。我们可以尝试使用标准的QQQ学习来在线学习网络Q(s,a;θ)Q\left( {s,a;\theta }\right)Q(s,a;θ)的参数。然而,该估计器在实际应用中表现不佳。(Mnih等人,2015)的一项关键创新是:在通过梯度下降更新在线网络Q(s,a;θi)Q\left( {s,a;{\theta }_{i}}\right)Q(s,a;θi)时,将目标网络Q(s′,a′;θ−)Q\left( {{s}^{\prime },{a}^{\prime };{\theta }^{ - }}\right)Q(s′,a′;θ−)的参数冻结固定的迭代次数。(这极大地提高了算法的稳定性。)具体的梯度更新公式为
∇θiLi(θi)=Es,a,r,s′[(yiDQN−Q(s,a;θi))∇θiQ(s,a;θi)] {\nabla }_{{\theta }_{i}}{L}_{i}\left( {\theta }_{i}\right) = {\mathbb{E}}_{s,a,r,{s}^{\prime }}\left\lbrack {\left( {{y}_{i}^{DQN} - Q\left( {s,a;{\theta }_{i}}\right) }\right) {\nabla }_{{\theta }_{i}}Q\left( {s,a;{\theta }_{i}}\right) }\right\rbrack ∇θiLi(θi)=Es,a,r,s′[(yiDQN−Q(s,a;θi))∇θiQ(s,a;θi)]
这种方法是无模型的,因为状态和奖励由环境产生。它也是异策略的,因为这些状态和奖励是通过行为策略(DQN中的ε-贪婪策略)获得的,该策略不同于正在学习的在线策略。
DQN成功的另一个关键因素是经验回放(Lin,1993;Mnih等人,2015)。在学习过程中,智能体积累一个包含多个回合经验et=(st,at,rt,st+1){e}_{t} = \left( {{s}_{t},{a}_{t},{r}_{t},{s}_{t + 1}}\right)et=(st,at,rt,st+1)的数据集Dt={e1,e2,…,et}{\mathcal{D}}_{t} = \left\{ {{e}_{1},{e}_{2},\ldots ,{e}_{t}}\right\}Dt={e1,e2,…,et}。在训练QQQ网络时,不再像标准时序差分学习那样仅使用当前经验,而是通过从D\mathcal{D}D中均匀随机采样经验小批量来训练网络。损失序列的形式如下
Li(θi)=E(s,a,r,s′)∼U(D)[(yiDQN−Q(s,a;θi))2]. {L}_{i}\left( {\theta }_{i}\right) = {\mathbb{E}}_{\left( {s,a,r,{s}^{\prime }}\right) \sim \mathcal{U}\left( \mathcal{D}\right) }\left\lbrack {\left( {y}_{i}^{DQN} - Q\left( s,a;{\theta }_{i}\right) \right) }^{2}\right\rbrack . Li(θi)=E(s,a,r,s′)∼U(D)[(yiDQN−Q(s,a;θi))2].
经验回放通过在多次更新中重复使用经验样本提高了数据效率,重要的是,由于从回放缓冲区均匀采样减少了更新中使用的样本之间的相关性,从而降低了方差。
2.2. 双深度Q网络
上一节描述了(Mnih等人,2015)提出的DQN的主要组件。在本文中,我们使用van Hasselt等人(2015)提出的改进的双DQN(DDQN)学习算法。在Q学习和DQN中,max算子使用相同的值来选择和评估动作。因此,这可能导致价值估计过于乐观(van Hasselt,2010)。为缓解此问题,DDQN使用以下目标:
yiDDQN=r+γQ(s′,argmaxa′Q(s′,a′;θi);θ−).(6) {y}_{i}^{DDQN} = r + {\gamma Q}\left( {{s}^{\prime },\underset{{a}^{\prime }}{\arg \max }Q\left( {{s}^{\prime },{a}^{\prime };{\theta }_{i}}\right) ;{\theta }^{ - }}\right) . \tag{6} yiDDQN=r+γQ(s′,a′argmaxQ(s′,a′;θi);θ−).(6)
DDQN与DQN的流程相同(参见Mnih等人(2015)),但将目标yiDQN{y}_{i}^{DQN}yiDQN替换为yiDDQN{y}_{i}^{DDQN}yiDDQN。DDQN的伪代码在附录A中给出。
Double DQN 详解:
- 问题:DQN 中,max 算子使用相同的 Q 网络来选择和评估动作,导致 Q 值高估
- DQN 目标:y=r+γmaxa′Q(s′,a′∣θ−)y = r + \gamma \max_{a'} Q(s', a'|\theta^-)y=r+γmaxa′Q(s′,a′∣θ−)
- 问题:maxa′Q(s′,a′∣θ−)\max_{a'} Q(s', a'|\theta^-)maxa′Q(s′,a′∣θ−) 会选择 Q 值最大的动作,但该 Q 值可能被高估
- 结果:Q 值估计过于乐观,导致策略学习不稳定
- 原因:同一个网络既用于选择动作(贪婪策略),又用于评估动作(TD 目标),容易产生正偏差
- 解决方案:Double DQN 使用两个网络分别选择和评估动作
- 选择动作:使用在线网络 Q(s′,a′∣θ)Q(s', a'|\theta)Q(s′,a′∣θ) 选择最优动作 a∗=argmaxa′Q(s′,a′∣θ)a^* = \arg\max_{a'} Q(s', a'|\theta)a∗=argmaxa′Q(s′,a′∣θ)
- 评估动作:使用目标网络 Q(s′,a∗∣θ−)Q(s', a^*|\theta^-)Q(s′,a∗∣θ−) 评估该动作的 Q 值
- 目标公式:y=r+γQ(s′,a∗∣θ−)y = r + \gamma Q(s', a^*|\theta^-)y=r+γQ(s′,a∗∣θ−),其中 a∗=argmaxa′Q(s′,a′∣θ)a^* = \arg\max_{a'} Q(s', a'|\theta)a∗=argmaxa′Q(s′,a′∣θ)
- 优势:
- 减少 Q 值高估,提高训练稳定性
- 实现简单,只需修改目标计算,无需额外网络
- 性能通常优于 DQN,特别是在复杂环境中
- 与 DQN 的对比:
- DQN:使用目标网络同时选择和评估,容易高估
- Double DQN:使用在线网络选择,目标网络评估,减少高估
- 项目对应:
src/ddqn.py中的DDQNAgent.update()方法实现了 Double Q-Learning 目标计算
2.3. 优先回放
最近在优先经验回放方面的创新(Schaul等人,2016)建立在DDQN的基础上,进一步改进了当前最佳水平。他们的核心思想是:增加具有高预期学习进展(通过绝对TD误差作为代理指标衡量)的经验元组的回放概率。与均匀经验回放相比,这在Atari基准测试套件的大多数游戏中实现了更快的学习速度和更好的最终策略质量。
为了证明我们的竞争网络架构与算法创新是互补的,我们表明它对均匀回放和优先回放基线(我们选择了更易于实现的基于排序的变体)均有性能提升,由此产生的优先竞争变体达到了新的当前最佳水平。
3. 竞争网络架构
如图2所示,我们新架构背后的核心见解是:对于许多状态,无需估计每个动作选择的价值。例如,在Enduro游戏场景中,只有在即将发生碰撞时,决定向左还是向右移动才重要。在某些状态下,知道采取哪个动作至关重要,但在许多其他状态下,动作的选择对后续结果没有影响。然而,对于基于自举的算法,每个状态的状态价值估计都非常重要。
Dueling 架构的直观理解:
- 核心洞察:许多状态下,动作选择不重要,只需学习状态价值
- 例如:在 Enduro 游戏中,当前方没有车辆时,向左或向右移动都不重要
- 只有在前方有车辆时,动作选择才重要(需要避免碰撞)
- 价值流的作用:学习"这个状态有多好",无论采取什么动作
- 关注:道路、分数、整体游戏状态
- 不关注:具体动作选择
- 优势流的作用:学习"在这个状态下,这个动作比其他动作好多少"
- 关注:需要做出关键决策的时刻(如避免碰撞)
- 不关注:动作选择不重要的状态
- 优势:
- 状态价值在多个动作间共享,提高数据效率
- 优势函数相对 Q 值更稳定,减少训练方差
- 当动作数量多时,优势更明显
为将这一见解付诸实践,我们设计了一种单一的QQQ网络架构(如图1所示),我们称之为竞争网络。竞争网络的低层与原始DQN(Mnih et al., 2015)一样采用卷积层。但在卷积层之后,我们没有使用单一序列的全连接层,而是使用两个序列(或流)的全连接层。这两个流的构造使其能够分别估计价值函数和优势函数。最后,将这两个流组合以生成单一的输出QQQ函数。与(Mnih et al., 2015)相同,网络的输出是一组QQQ值,每个动作对应一个值。
由于竞争网络的输出是QQQ函数,因此可以使用许多现有算法对其进行训练,例如DDQN和SARSA。此外,它还可以利用这些算法的任何改进,包括更好的回放记忆、更好的探索策略、内在动机等。
将两个全连接层流组合以输出QQQ估计值的模块需要精心设计。
根据优势Qπ(s,a)=Vπ(s)+ Aπ(s,a){Q}^{\pi }\left( {s,a}\right) = {V}^{\pi }\left( s\right) + \; {A}^{\pi }\left( {s,a}\right)Qπ(s,a)=Vπ(s)+Aπ(s,a)和状态价值Vπ(s)=Ea∼π(s)[Qπ(s,a)]{V}^{\pi }\left( s\right) = {\mathbb{E}}_{a \sim \pi \left( s\right) }\left\lbrack {{Q}^{\pi }\left( {s,a}\right) }\right\rbrackVπ(s)=Ea∼π(s)[Qπ(s,a)]的表达式,可得Ea∼π(s)[Aπ(s,a)]=0{\mathbb{E}}_{a \sim \pi \left( s\right) }\left\lbrack {{A}^{\pi }\left( {s,a}\right) }\right\rbrack = 0Ea∼π(s)[Aπ(s,a)]=0。此外,对于确定性策略a∗=argmaxa′∈AQ(s,a′){a}^{ * } = \arg \mathop{\max }\limits_{{{a}^{\prime } \in \mathcal{A}}}Q\left( {s,{a}^{\prime }}\right)a∗=arga′∈AmaxQ(s,a′),可得Q(s,a∗)=V(s)Q\left( {s,{a}^{ * }}\right) = V\left( s\right)Q(s,a∗)=V(s),因此A(s,a∗)=0A\left( {s,{a}^{ * }}\right) = 0A(s,a∗)=0。
考虑图1所示的竞争网络,其中一个全连接层流输出标量V(s;θ,β)V\left( {s;\theta ,\beta }\right)V(s;θ,β),另一个流输出∣A∣\left| \mathcal{A}\right|∣A∣维向量A(s,a;θ,α)A\left( {s,a;\theta ,\alpha }\right)A(s,a;θ,α)。这里,θ\thetaθ表示卷积层的参数,α\alphaα和β\betaβ是两个全连接层流的参数。
根据优势的定义,我们可能会尝试将聚合模块构造如下:
Q(s,a;θ,α,β)=V(s;θ,β)+A(s,a;θ,α),(7) Q\left( {s,a;\theta ,\alpha ,\beta }\right) = V\left( {s;\theta ,\beta }\right) + A\left( {s,a;\theta ,\alpha }\right) , \tag{7} Q(s,a;θ,α,β)=V(s;θ,β)+A(s,a;θ,α),(7)
注意,此表达式适用于所有(s,a)\left( {s,a}\right)(s,a)实例;也就是说,要将式(7)表示为矩阵形式,我们需要将标量复制V(s;θ,β),∣A∣V\left( {s;\theta ,\beta }\right) ,\left| \mathcal{A}\right|V(s;θ,β),∣A∣次。
然而,我们需要记住,Q(s,a;θ,α,β)Q\left( {s,a;\theta ,\alpha ,\beta }\right)Q(s,a;θ,α,β)只是真实QQQ函数的参数化估计。此外,不能得出V(s;θ,β)V\left( {s;\theta ,\beta }\right)V(s;θ,β)是状态价值函数的良好估计量,或者A(s,a;θ,α)A\left( {s,a;\theta ,\alpha }\right)A(s,a;θ,α)能合理估计优势函数的结论。
式(7)是不可辨识的,因为给定QQQ,我们无法唯一恢复VVV和AAA。要理解这一点,可在V(s;θ,β)V\left( {s;\theta ,\beta }\right)V(s;θ,β)上加上一个常数,并从A(s,a;θ,α)A\left( {s,a;\theta ,\alpha }\right)A(s,a;θ,α)中减去该常数。此常数会相互抵消,从而得到相同的QQQ值。这种不可辨识性反映为直接使用该式时实际性能较差。
可辨识性问题详解:
- 问题:Q(s,a)=V(s)+A(s,a)Q(s,a) = V(s) + A(s,a)Q(s,a)=V(s)+A(s,a) 中,VVV 和 AAA 不可唯一确定
- 如果 V(s)←V(s)+cV(s) \leftarrow V(s) + cV(s)←V(s)+c,A(s,a)←A(s,a)−cA(s,a) \leftarrow A(s,a) - cA(s,a)←A(s,a)−c
- 则 Q(s,a)=(V(s)+c)+(A(s,a)−c)=V(s)+A(s,a)Q(s,a) = (V(s) + c) + (A(s,a) - c) = V(s) + A(s,a)Q(s,a)=(V(s)+c)+(A(s,a)−c)=V(s)+A(s,a) 不变
- 因此,给定 QQQ,无法唯一恢复 VVV 和 AAA
- 存在无穷多个 (V,A)(V, A)(V,A) 组合对应同一个 QQQ
- 影响:直接使用公式(7)时,VVV 和 AAA 可能学习到任意偏移,导致性能差
- VVV 和 AAA 的值可能不稳定,在训练过程中不断漂移
- 网络难以学习到有意义的 VVV 和 AAA 表示
- 解决方案:强制优势函数满足约束条件,消除可辨识性问题
- 方案 1:最大值约束 A(s,a∗)=0A(s,a^*) = 0A(s,a∗)=0(公式 8)
- 其中 a∗=argmaxa′Q(s,a′)=argmaxa′A(s,a′)a^* = \arg\max_{a'} Q(s,a') = \arg\max_{a'} A(s,a')a∗=argmaxa′Q(s,a′)=argmaxa′A(s,a′)
- 最优动作的优势为 0,其他动作的优势相对于最优动作
- 方案 2:均值约束 1∣A∣∑a′A(s,a′)=0\frac{1}{|A|}\sum_{a'} A(s,a') = 0∣A∣1∑a′A(s,a′)=0(公式 9)
- 所有动作的优势均值为 0
- 优势相对于平均动作水平
- 选择:论文使用均值约束(公式 9),因为更稳定
- 均值约束的优势:
- 优势只需以均值速度变化,优化更稳定
- 不依赖于最优动作的选择,更鲁棒
- 最大值约束的问题:
- 最优动作可能变化,导致优势函数快速变化
- 在训练初期,最优动作不稳定,可能导致训练不稳定
- 项目对应:Dueling DQN 架构可在
src/ddqn.py中扩展实现(当前实现为 Double DQN)
为解决这种可辨识性问题,我们可以强制优势函数估计器在所选动作处的优势为零。也就是说,我们让网络的最后一个模块实现前向映射
Q(s,a;θ,α,β)=V(s;θ,β)+ Q\left( {s,a;\theta ,\alpha ,\beta }\right) = V\left( {s;\theta ,\beta }\right) + Q(s,a;θ,α,β)=V(s;θ,β)+
(A(s,a;θ,α)−maxa′∈∣A∣A(s,a′;θ,α)).(8) \left( {A\left( {s,a;\theta ,\alpha }\right) - \mathop{\max }\limits_{{{a}^{\prime } \in \left| \mathcal{A}\right| }}A\left( {s,{a}^{\prime };\theta ,\alpha }\right) }\right) . \tag{8} (A(s,a;θ,α)−a′∈∣A∣maxA(s,a′;θ,α)).(8)
现在,对于a∗=argmaxa′∈AQ(s,a′;θ,α,β)= argmaxa′∈AA(s,a′;θ,α){a}^{ * } = \arg \mathop{\max }\limits_{{{a}^{\prime } \in \mathcal{A}}}Q\left( {s,{a}^{\prime };\theta ,\alpha ,\beta }\right) = \; \arg \mathop{\max }\limits_{{{a}^{\prime } \in \mathcal{A}}}A\left( {s,{a}^{\prime };\theta ,\alpha }\right)a∗=arga′∈AmaxQ(s,a′;θ,α,β)=arga′∈AmaxA(s,a′;θ,α),我们得到Q(s,a∗;θ,α,β)= V(s;θ,β)Q\left( {s,{a}^{ * };\theta ,\alpha ,\beta }\right) = \; V\left( {s;\theta ,\beta }\right)Q(s,a∗;θ,α,β)=V(s;θ,β)。因此,流V(s;θ,β)V\left( {s;\theta ,\beta }\right)V(s;θ,β)提供价值函数的估计,而另一个流产生优势函数的估计。
另一种模块用平均值替换了最大值运算符:
Q(s,a;θ,α,β)=V(s;θ,β)+ Q\left( {s,a;\theta ,\alpha ,\beta }\right) = V\left( {s;\theta ,\beta }\right) + Q(s,a;θ,α,β)=V(s;θ,β)+
(A(s,a;θ,α)−1∣A∣∑a′A(s,a′;θ,α)).(9) \left( {A\left( {s,a;\theta ,\alpha }\right) - \frac{1}{\left| \mathcal{A}\right| }\mathop{\sum }\limits_{{a}^{\prime }}A\left( {s,{a}^{\prime };\theta ,\alpha }\right) }\right) . \tag{9} (A(s,a;θ,α)−∣A∣1a′∑A(s,a′;θ,α)).(9)
一方面,这失去了VVV和AAA的原始语义,因为它们现在偏离目标一个常数;但另一方面,它提高了优化的稳定性:使用式(9)时,优势只需以均值的速度变化,而不必像式(8)中那样补偿最优动作优势的任何变化。我们还尝试了式(8)的softmax版本,但发现其结果与式(9)的简单模块相似。因此,本文报告的所有实验均使用式(9)的模块。
注意,虽然式(9)中减去均值有助于解决可辨识性问题,但它不会改变AAA(进而QQQ)值的相对排序,从而保留了基于式(7)中QQQ值的任何贪婪或ϵ\epsilonϵ-贪婪策略。在执行动作时,只需评估优势流即可做出决策。
重要的是要注意,式(9)被视为并实现为网络的一部分,而非单独的算法步骤。与标准QQQ网络(例如Mnih等人(2015)的深度QQQ网络)一样,对决架构的训练只需反向传播。估计值V(s;θ,β)V\left( {s;\theta ,\beta }\right)V(s;θ,β)和A(s,a;θ,α)A\left( {s,a;\theta ,\alpha }\right)A(s,a;θ,α)会自动计算,无需任何额外监督或算法修改。
由于对决架构与标准QQQ网络具有相同的输入-输出接口,我们可以复用所有用于QQQ网络的学习算法(例如DDQN和SARSA)来训练对决架构。
4. 实验
6. 结论
我们提出了一种新的神经网络架构,该架构在深度QQQ网络中解耦价值和优势,同时共享一个公共的特征学习模块。这种新的竞争架构与一些算法改进相结合,在具有挑战性的Atari领域中,相对于现有的深度强化学习方法取得了显著的改进。本文所呈现的结果是该热门领域的最新技术水平。
7 总结与理解要点
7.1 Dueling DQN 核心思想总结
Dueling DQN 的核心创新:
- 价值-优势分解:将 Q 函数分解为状态价值 V(s)V(s)V(s) 和优势函数 A(s,a)A(s,a)A(s,a)
- 双流架构:使用两个独立的流分别估计价值和优势
- 聚合层:通过特殊聚合层组合价值和优势,生成 Q 值
- 可辨识性:通过减去优势均值解决可辨识性问题
为什么 Dueling DQN 能工作:
- 状态价值共享:许多状态下,动作选择不重要,只需学习状态价值
- 优势相对性:优势函数衡量动作的相对重要性,更稳定
- 跨动作泛化:状态价值在多个动作间共享,提高泛化能力
- 减少方差:优势函数相对 Q 值更稳定,减少训练方差
7.2 与项目实现的对应关系
算法组件对应:
- Q 网络 →
src/ddqn.py中的DDQN类(256→128→64→action_dim,LayerNorm + ReLU) - DDQN 智能体 →
src/ddqn.py中的DDQNAgent类(完整的 Double DQN 实现) - 双网络架构 →
policy_net(在线网络)和target_net(目标网络) - 经验回放 →
DDQNAgent.memory(deque,限长MEMORY_SIZE) - Double Q-Learning →
DDQNAgent.update()方法中的 TD 目标计算
关键代码位置:
- Double Q-Learning TD 目标(与 DQN 的区别):
# src/ddqn.py 中的 update() 方法 with torch.no_grad(): # 使用 policy_net 选择动作(而非 target_net) next_actions = self.policy_net(next_states_t).argmax(1) # 使用 target_net 评估动作(而非 policy_net) next_q = self.target_net(next_states_t).gather(1, next_actions.unsqueeze(1)).squeeze(1) target_q = rewards_t + (~dones_t) * self.gamma * next_q - 与 DQN 的对比(DQN 使用 target_net 选择动作和评估动作):
# DQN 的 TD 目标(src/dqn.py) next_q = self.target_net(next_states_t).max(1)[0] # 使用 target_net 选择并评估 - 经验回放存储:
# src/ddqn.py 中的 store_transition() 方法 self.memory.append(transition) # (state, action, reward, next_state, done) - epsilon-greedy 探索:
# src/ddqn.py 中的 act() 方法 if not eval_mode and np.random.rand() < self.epsilon: return np.random.randint(self.action_dim) # 探索 return q_values.argmax().item() # 利用
超参数对应:
- 学习率 →
config.py中的LR(默认 1e-4,DQN/DDQN 共享) - 经验回放大小 →
config.py中的MEMORY_SIZE(默认 100000) - 批量大小 →
config.py中的BATCH_SIZE(默认 512) - 目标网络更新频率 →
config.py中的TARGET_UPDATE(默认 500 步) - 初始探索率 →
config.py中的EPSILON_START(默认 1.0) - 探索率衰减 →
config.py中的EPSILON_DECAY(默认 0.997) - 最小探索率 →
config.py中的EPSILON_MIN(默认 0.01) - 折扣因子 →
config.py中的GAMMA(默认 0.99) - 梯度裁剪阈值 →
config.py中的GRAD_CLIP(默认 1.0)
项目应用场景:
- 车辆路径跟踪任务:离散动作空间(17 个预定义转向角)
- 状态空间:横向误差、航向误差(2 维归一化状态)
- 奖励函数:基于跟踪误差和控制平滑性(贴线奖励 + 朝向奖励 - 转向惩罚)
- 训练回合数:默认 500 回合(
config.py中的EPISODES_MAP["ddqn"]) - 优势:解决 Q 值高估问题,性能通常优于 DQN,实现简单(仅修改 TD 目标计算)
与 DQN 的区别:
- DQN:
next_q = target_net(next_states).max(1)[0](使用 target_net 选择并评估) - DDQN:
next_actions = policy_net(next_states).argmax(1),next_q = target_net(next_states).gather(1, next_actions)(使用 policy_net 选择,target_net 评估) - 优势:DDQN 减少 Q 值高估,提高学习稳定性和性能
7.3 关键设计决策的理解
为什么需要价值-优势分解?
- 许多状态下,动作选择不重要,只需学习状态价值
- 优势函数衡量动作的相对重要性,比绝对 Q 值更稳定
- 状态价值在多个动作间共享,提高泛化能力
如何解决可辨识性问题?
- 问题:Q(s,a)=V(s)+A(s,a)Q(s,a) = V(s) + A(s,a)Q(s,a)=V(s)+A(s,a) 中,VVV 和 AAA 不可唯一确定
- 解决方案:减去优势均值,Q(s,a)=V(s)+(A(s,a)−1∣A∣∑a′A(s,a′))Q(s,a) = V(s) + (A(s,a) - \frac{1}{|A|}\sum_{a'} A(s,a'))Q(s,a)=V(s)+(A(s,a)−∣A∣1∑a′A(s,a′))
- 效果:确保优势均值为 0,V(s)V(s)V(s) 提供状态价值估计
为什么使用均值而非最大值?
- 最大值:Q(s,a)=V(s)+(A(s,a)−maxa′A(s,a′))Q(s,a) = V(s) + (A(s,a) - \max_{a'} A(s,a'))Q(s,a)=V(s)+(A(s,a)−maxa′A(s,a′))
- 均值:Q(s,a)=V(s)+(A(s,a)−1∣A∣∑a′A(s,a′))Q(s,a) = V(s) + (A(s,a) - \frac{1}{|A|}\sum_{a'} A(s,a'))Q(s,a)=V(s)+(A(s,a)−∣A∣1∑a′A(s,a′))
- 优势:均值更稳定,优势只需以均值速度变化,优化更稳定
7.4 Dueling DQN vs DQN vs Double DQN vs Rainbow DQN 对比
| 特性 | DQN | Double DQN | Dueling DQN | Rainbow DQN |
|---|---|---|---|---|
| 网络架构 | 单流 | 单流 | 双流(价值+优势) | 双流(价值+优势) |
| Q 值高估 | 有 | 减少 | 有 | 减少 |
| 状态价值 | 隐式 | 隐式 | 显式 | 显式 |
| 优势函数 | 无 | 无 | 显式 | 显式 |
| 优先回放 | 无 | 无 | 无 | 有 |
| 多步学习 | 无 | 无 | 无 | 有 |
| 分布 RL | 无 | 无 | 无 | 有 |
| 跨动作泛化 | 弱 | 弱 | 强 | 强 |
| 实现复杂度 | 简单 | 简单 | 中等 | 复杂 |
| 性能提升 | 基线 | +10-20% | +20-30% | +50-100% |
7.5 常见问题与解答
Q1: Dueling DQN 与 DQN 的主要区别是什么?
- DQN:单流网络,直接输出 Q 值
- Dueling DQN:双流网络,分别估计价值和优势,然后组合
- 优势:Dueling DQN 在动作数量多时表现更好,跨动作泛化能力更强
Q2: 为什么 Dueling DQN 在大动作空间时表现更好?
- 状态价值在多个动作间共享,提高数据效率
- 优势函数相对 Q 值更稳定,减少训练方差
- 当动作价值相近时,优势函数能更好地区分动作
Q3: 如何实现 Dueling DQN?
- 在卷积层后,分成两个全连接流
- 价值流:输出标量 V(s)V(s)V(s)
- 优势流:输出 ∣A∣|A|∣A∣ 维向量 A(s,a)A(s,a)A(s,a)
- 聚合层:Q(s,a)=V(s)+(A(s,a)−1∣A∣∑a′A(s,a′))Q(s,a) = V(s) + (A(s,a) - \frac{1}{|A|}\sum_{a'} A(s,a'))Q(s,a)=V(s)+(A(s,a)−∣A∣1∑a′A(s,a′))
Q4: Dueling DQN 可以与 Double DQN 结合吗?
- 可以,称为 Dueling Double DQN
- 结合两者的优势:减少 Q 值高估 + 价值-优势分解
- 性能通常优于单独的 DQN、Double DQN 或 Dueling DQN
Q5: Dueling DQN 适用于哪些任务?
- 适用:大动作空间任务(如 Atari 游戏,动作数量 4-18)
- 适用:动作价值相近的任务
- 不适用:小动作空间任务(优势不明显)
- 项目对应:车辆控制任务动作空间较小(17 个离散动作),Dueling DQN 的优势可能不明显
- 动作空间:17 个预定义转向角(
config.py中的ACTION_SPACE_DEG) - 状态空间:横向误差、航向误差(2 维归一化状态)
- 奖励函数:基于跟踪误差和控制平滑性
- 训练流程:
main.py中的train()函数,每 100 回合打印一次平均奖励 - 模型保存:
model/ddqn_autodrive.pth(仅 policy_net 权重) - 注意:项目实现的是 Double DQN(DDQN),而非 Dueling DQN
- Double DQN 优势:解决 Q 值高估问题,性能通常优于 DQN
- 动作空间:17 个预定义转向角(
7.6 实践建议
训练技巧:
- 网络架构:在卷积层后分成两个流,每个流 1-2 个全连接层
- 聚合方式:使用均值聚合(公式 9),更稳定
- 梯度缩放:进入最后一个卷积层的梯度按 1/21/\sqrt{2}1/2 缩放,提高稳定性
- 梯度裁剪:将梯度裁剪到范数 ≤10\leq 10≤10,防止梯度爆炸
调参建议:
- 学习率:从 10−410^{-4}10−4 开始,如果训练不稳定则减小
- 批量大小:通常 32-512,越大越稳定但需要更多内存
- 目标网络更新频率:通常 500-1000 步,越大越稳定但可能越慢
- 经验回放大小:通常 10610^6106,越大越好但受内存限制
常见问题:
- 训练不稳定:减小学习率、增加梯度裁剪、检查网络初始化
- 性能不佳:检查网络架构、增加训练时间、尝试不同超参数
- 显存不足:减小批量大小、减小网络容量、使用梯度累积
7.7 进一步阅读
相关论文:
- Wang et al. (2016): “Dueling Network Architectures for Deep Reinforcement Learning”(Dueling DQN 原始论文)
- van Hasselt et al. (2016): “Deep Reinforcement Learning with Double Q-learning”(Double DQN 原始论文)
- Mnih et al. (2015): “Human-level control through deep reinforcement learning”(DQN 原始论文)
扩展算法:
- Rainbow DQN:结合多种改进(Double DQN、Dueling DQN、Prioritized Replay 等)
- Distributional DQN:学习 Q 值的分布而非期望值
- Noisy DQN:使用噪声网络进行探索
应用领域:
- 游戏 AI:Atari 游戏、围棋、星际争霸
- 机器人控制:离散动作控制任务
- 推荐系统:离散选择问题
7.8 算法选择指南
何时选择 Double DQN(DDQN)?
- ✅ 适用场景:
- 离散动作空间任务
- 需要解决 Q 值高估问题的场景
- 需要稳定训练的离散动作任务
- 需要简单实现的场景(仅修改 TD 目标计算)
- ❌ 不适用场景:
- 连续动作空间(应使用 DDPG)
- 需要快速实现的场景(标准 DQN 更简单,但性能可能较差)
- 项目对应:车辆路径跟踪任务可以使用 DDQN
- 动作空间:17 个预定义转向角(
config.py中的ACTION_SPACE_DEG) - 状态空间:横向误差、航向误差(2 维归一化状态)
- 奖励函数:基于跟踪误差和控制平滑性
- 训练流程:
main.py中的train()函数,每 100 回合打印一次平均奖励 - 模型保存:
model/ddqn_autodrive.pth(仅 policy_net 权重) - 优势:解决 Q 值高估问题,性能通常优于 DQN,实现简单(仅修改 TD 目标计算)
- 建议:对于车辆控制任务,DDQN 是很好的选择(相比 DQN 性能更好)
- 动作空间:17 个预定义转向角(
与其他算法的选择建议:
- Dueling DQN vs DQN:大动作空间用 Dueling DQN,小动作空间差异不大
- Dueling DQN vs Double DQN:可以结合使用(Dueling Double DQN)
- Dueling DQN vs Rainbow DQN:Rainbow 结合多种改进,性能更好
- Dueling DQN vs DDPG:离散动作用 Dueling DQN,连续动作用 DDPG
7.9 性能优化技巧
提高训练速度:
- 使用 GPU:价值流和优势流可以在 GPU 上并行计算
- 批量大小:增大批量大小可以提高 GPU 利用率
- 梯度缩放:进入最后一个卷积层的梯度按 1/21/\sqrt{2}1/2 缩放
- 经验回放采样:使用多线程或异步采样提高效率
提高样本效率:
- 结合 Double DQN:减少 Q 值高估,提高学习效率
- 结合优先回放:优先采样重要经验
- 网络容量:适当增加网络容量,提高表达能力
- 价值-优势分解:状态价值在多个动作间共享,提高数据效率
提高稳定性:
- 梯度裁剪:将梯度裁剪到范数 ≤10\leq 10≤10
- 聚合方式:使用均值聚合(公式 9)而非最大值聚合
- 网络初始化:使用合适的初始化方法
- 目标网络:确保目标网络更新频率合适
提高性能:
- 结合多种改进:结合 Double DQN、优先回放等
- 超参数调优:根据任务特点调整学习率、批量大小等
- 网络结构:尝试不同的网络结构
- 奖励设计:优化奖励函数设计
更多推荐

所有评论(0)