提高深度Q网络(DQN)的性能可以涉及多种策略。双DQN等方法解决了Q值中的高估偏差,而另一种方法则侧重于修改神经网络本身的内在结构。考虑Q值,$Q(s, a)$。它隐含地包含两类信息:处于状态 $s$ 的总体好坏程度(状态值,$V(s)$),以及在该状态下执行动作 $a$ 比其他动作好多少(动作优势,$A(s, a)$)。在许多情况中,状态 $V(s)$ 的值可能不强烈依赖于所采取的具体动作。例如,在驾驶场景中,如果前方遥远有一处不可避免的障碍物,当前状态的值(可能较低)主要由障碍物本身决定,无论你现在是轻微向左还是向右转。反之,当即刻行动很要紧时(例如躲避突然出现的坑洞),某个动作相对于其他动作的优势变得很要紧。对偶网络架构明确承认这种分离。它没有一个直接计算所有动作 $Q(s, a)$ 的单一网络输出流,而是在一些初始共享层之后,将计算分为两条通路或“流”:价值流: 输出一个标量值,这是对状态价值函数 $V(s)$ 的一个估算。优势流: 输出一个维度等于动作数量的向量,每个元素估算针对特定动作 $a$ 的动作优势函数 $A(s, a)$。这两条流随后被结合起来,以生成每个动作的最终Q值估算。结合价值与优势回顾Q值、状态值和优势之间的关系:$$ Q(s, a) = V(s) + A(s, a) $$这个等式说明,在状态 $s$ 中执行动作 $a$ 的价值,是处于状态 $s$ 的整体价值,再加上选择动作 $a$ 所带来的额外价值(或优势)。对偶网络旨在分别学习 $V(s)$ 和 $A(s, a)$,然后将它们结合。然而,这里有一个需要注意的问题:仅凭贝尔曼更新中的目标Q值,我们无法唯一地恢复 $V(s)$ 和 $A(s, a)$。为什么?因为我们可以在 $V(s)$ 上加一个常数 $C$,并从所有 $A(s, a)$ 值中减去相同的常数 $C$,结果 $Q(s, a)$ 将保持不变:$$ Q(s, a) = (V(s) + C) + (A(s, a) - C) = V(s) + A(s, a) $$这被称为可识别性问题。如果没有限制,网络可能会学习到,例如,一个非常高的 $V(s)$ 和相应较低(负值)的 $A(s, a)$ 值,反之亦然,这会使 $V$ 和 $A$ 的单独估算可能不稳定或难以解释。稳定组合为了解决可识别性问题并稳定学习,我们需要对优势流施加一个限制。一种常见且有效的方法是强制所有动作的平均优势为零。这意味着优势表示偏离状态值的部分。组合公式变为:$$ Q(s, a) = V(s) + \left( A(s, a) - \frac{1}{|\mathcal{A}|} \sum_{a' \in \mathcal{A}} A(s, a') \right) $$这里,$|\mathcal{A}|$ 是可能动作的数量。通过减去平均优势,我们确保优势之和为零,有效地固定了 $V(s)$ 和 $A(s, a)$ 之间的尺度。这使得 $V(s)$ 成为对实际状态值更直接的估算,而 $A(s, a)$ 表示每个动作的相对偏好。另一种有时使用的方法是将平均值替换为最大优势:$$ Q(s, a) = V(s) + \left( A(s, a) - \max_{a' \in \mathcal{A}} A(s, a') \right) $$这会强制最佳动作的优势为零,所有其他动作都具有非正优势。均值减法方法通常更受青睐,因为它倾向于提高稳定性。下图展示了对偶网络架构内的流程。digraph G { rankdir=LR; node [shape=box, style=filled, fontname="sans-serif", fontsize=10]; edge [fontname="sans-serif", fontsize=10]; subgraph cluster_streams { label = "网络流"; style=filled; color="#e9ecef"; // gray[0] subgraph cluster_value { label = "价值流"; bgcolor="#a5d8ff"; // blue[0] node [fillcolor="#74c0fc"]; // blue[1] V_FC [label="全连接层"]; V_Out [label="V(s) (标量)", shape=ellipse, fillcolor="#4dabf7"]; // blue[2] V_FC -> V_Out; } subgraph cluster_advantage { label = "优势流"; bgcolor="#b2f2bb"; // green[0] node [fillcolor="#8ce99a"]; // green[1] A_FC [label="全连接层"]; A_Out [label="A(s, a) (向量)", shape=ellipse, fillcolor="#69db7c"]; // green[2] A_FC -> A_Out; } } Input [label="状态 (s)", shape= Mdiamond, style=filled, fillcolor="#ffec99"]; // yellow[0] SharedLayers [label="共享层 (例如, CNN/FC)", fillcolor="#ffe066"]; // yellow[1] Combine [label="组合 & 优势零均值化", shape=invhouse, style=filled, fillcolor="#bac8ff"]; // indigo[0] Q_Out [label="Q(s, a) (向量)", shape=ellipse, style=filled, fillcolor="#748ffc"]; // indigo[2] Input -> SharedLayers; SharedLayers -> V_FC [lhead=cluster_value]; SharedLayers -> A_FC [lhead=cluster_advantage]; V_Out -> Combine [label="V(s)"]; A_Out -> Combine [label="A(s,a)"]; Combine -> Q_Out; }对偶网络的结构。输入状态特征通过共享层,然后分成单独的流,用于估算状态值 $V(s)$ 和动作优势 $A(s, a)$。这些之后通过一个特殊的聚合层结合起来,生成最终的Q值。为何使用对偶架构?分离价值和优势估算带来多种好处:学习效率提升: 网络能更有效地学习状态值 $V(s)$,即使在该状态下许多动作的优势 $A(s, a)$ 很小或不相关。价值流的梯度直接更新 $V(s)$,而不会被所有动作输出所稀释。这在许多动作导致短期内相似的下一状态和回报的状态中,尤为有用。泛化能力更佳: 通过独立于动作效果学习状态值,网络可能具有更强的泛化能力。它能更清楚地了解哪些状态本身是好的或坏的。侧重动作关联性: 优势流学习在最需要时,专注于不同动作的相对重要性。与双DQN类似,对偶网络架构常与DQN的其他改进结合使用,例如优先经验回放。这种组合,常被称为“对偶DDQN”,同时使用了减少高估偏差和更高效网络结构的好处,在许多基准任务上取得了顶尖的表现。总之,对偶网络架构提供了一种更精巧的方式来组织Q值估算过程。通过将状态值 ($V(s)$) 与动作优势 ($A(s, a)$) 分离并仔细地重新组合它们,它使得网络能够更有效地学习,并且与标准DQN架构相比,通常能够带来更好的策略表现。