Double DQN(DDQN)详解与实现

Double DQN(DDQN)详解与实现

    • [0. 前言](#0. 前言)
    • [1. DDQN 原理](#1. DDQN 原理)
    • [2. 使用 Keras 实现 DDQN](#2. 使用 Keras 实现 DDQN)
    • [3. 结果分析](#3. 结果分析)

0. 前言

深度 Q 网络 (Deep Q-Network, DQN)中,目标 Q 网络负责选择并评估每个动作,这会导致 Q 值被高估。为解决此问题,Double DQN (DDQN) 提出使用 Q 网络选择动作,而用目标 Q 网络评估动作。在本节中,我们将介绍 DDQN 的基本原理,并使用 Keras 实现 DDQN

1. DDQN 原理

DQN 中,智能体使用相同的Q值来选择和评估一个动作。这可能会导致学习中的最大化偏差。例如,假设对于某个状态S,所有可能的动作的真实Q值都为零。此时,DQN 估计值将会有一些高于零的值和一些低于零的值,由于选择具有最大Q值的动作,并且后续使用相同(最大化的)估计值函数评估每个动作的Q值,智能体就会高估Q值,换句话说,智能体过于乐观,这可能导致训练不稳定和低质量的策略。为了解决这个问题,DeepMind 提出了 Double DQN 算法。在 Double DQN 中,有两个具有相同结构但权重不同的Q网络。其中一个Q网络使用ε-贪婪策略确定动作,另一个Q网络确定其值 ( Q t a r g e t Q_{target} Qtarget)。

DQN 中, Q t a r g e t Q_{target} Qtarget 目标计算方式如下:
Q t a r g e t = R t + 1 + γ max ⁡ A Q ( S t + 1 , A t ) Q_{target}=R_{t+1} + \gamma \max_A Q(S_{t+1}, A_t) Qtarget=Rt+1+γAmaxQ(St+1,At)

其中,动作 A A A 是使用相同的 DQN Q ( S , A ; W ) Q(S,A; W) Q(S,A;W) 选择的,其中 W W W 是网络的训练参数:
Q t a r g e t = R t + 1 + γ max ⁡ A Q ( S t + 1 , a r g m a x t Q ( S , A ; W ) ; W ) Q_{target}=R_{t+1} + \gamma \max_A Q(S_{t+1},argmax_tQ(S,A;W); W) Qtarget=Rt+1+γAmaxQ(St+1,argmaxtQ(S,A;W);W)

Double DQN 中,目标方程有所不同,DQN Q ( S , A ; W ) Q(S,A;W) Q(S,A;W) 用于确定动作,而 DQN Q ( S , A ; W ′ ) Q(S,A;W') Q(S,A;W′) 用于计算目标。因此,方程将改写为:
Q t a r g e t = R t + 1 + γ max ⁡ A Q ( S t + 1 , a r g m a x t Q ( S , A ; W ) ; W ′ ) Q_{target}=R_{t+1} + \gamma \max_A Q(S_{t+1},argmax_tQ(S,A;W); W') Qtarget=Rt+1+γAmaxQ(St+1,argmaxtQ(S,A;W);W′)

这一简单的更改减少高估Q值的可能性,并且能够更快、更可靠地训练智能体。

2. 使用 Keras 实现 DDQN

定义 DDQNAgent 类,该类继承自DQNAgent 类。我们仅需重写 get_target_q_value() 方法,即可实现对最大Q值计算方式的修改。

python 复制代码
class DDQNAgent(DQNAgent):
    def __init__(self,
                 state_space, 
                 action_space, 
                 episodes=500):
        super().__init__(state_space, 
                         action_space, 
                         episodes)
        # Q Network weights filename
        self.weights_file = 'ddqn_cartpole.h5'
        print("-------------DDQN------------")

    def get_target_q_value(self, next_state, reward):
        # max Q value among next state's actions
        # DDQN
        # current Q Network selects the action
        # a'_max = argmax_a' Q(s', a')
        action = np.argmax(self.q_model.predict(next_state)[0])
        # target Q Network evaluates the action
        # Q_max = Q_target(s', a'_max)
        q_value = self.target_q_model.predict(\
                                      next_state)[0][action]

        # Q_max = reward + gamma * Q_max
        q_value *= self.gamma
        q_value += reward
        return q_value

3. 结果分析

10 次运行的平均结果中,DDQN 算法在 971 个训练回合内解决 CartPole-v0 问题。DQNDDQN 都证明了深度学习能够增强Q学习的扩展能力,使其可以解决具有连续状态空间和离散动作空间的问题。

相关推荐
richard_first8 小时前
Transformer 与大语言模型:第9章 LayerNorm 归一化层
人工智能·深度学习·机器学习·transformer
咖啡星人k15 小时前
2026 多模态大模型:AI 如何“看图+读字+听音“三合一,MonkeyCode 免费上手
人工智能·深度学习·神经网络·计算机视觉·自然语言处理
johnsong16 小时前
深度拆解:150M循环模型如何用循环推理击败大Transformer
android·深度学习·transformer
txg66616 小时前
LLM 驱动漏洞传播验证:TransferFuzz-Pro 如何自动调试“继承“来的安全债
人工智能·深度学习·安全
Rocky Ding*17 小时前
【三年面试五年模拟】2026-08-18_哔哩哔哩_AI应用岗Agent开发一面面经(含完整答案)
论文阅读·人工智能·深度学习·机器学习·aigc·ai-native·ai agent
2601_9578793317 小时前
Seedance排队太久怎么办?2026免排队AI视频工具与替代方案怎么选
大数据·人工智能·深度学习
a1879272183118 小时前
从一条直线到大模型输出一个token(九):输出矩阵与多层堆叠
深度学习·ai·transformer·token·注意力机制·deepseek·多层堆叠
jay神18 小时前
YOLO模型什么时候应该加注意力机制?
人工智能·深度学习·yolo·分类·回归·毕业设计
sel_918 小时前
【多轮对话论文导读(二)】多轮对话与LLM Agent论文阅读:长期记忆、多轮评估与Agent训练
人工智能·深度学习·算法·语言模型·自然语言处理
AI云海18 小时前
深度学习_全连接网络实现回归任务
人工智能·深度学习·回归