从代码学习深度强化学习 - Double DQN PyTorch版

文章目录

  • 前言
  • 理论篇:为什么需要 Double DQN?
  • 代码实现篇:构建一个 Double DQN 智能体
    • 2.1 项目设置与辅助函数
    • 2.2 环境 (Environment)
    • 2.3 DQN 的核心组件
      • 2.3.1 Replay Buffer (经验回放池)
      • 2.3.2 Q-Network (Q网络)
      • 2.3.3 The Double DQN Agent (Double DQN 智能体)
  • 训练与结果
    • 3.1 训练主循环
    • 3.2 超参数设置与执行
    • 3.3 结果分析
  • 总结


前言

欢迎来到“从代码学习深度强化学习”系列!在强化学习(RL)的世界里,Deep Q-Network (DQN) 算法无疑是一个里程碑,它巧妙地将深度学习的强大感知能力与Q-Learning的决策能力相结合,解决了许多之前无法攻克的复杂问题。

然而,经典的DQN算法并非完美无瑕。它存在一个众所周知的问题——Q值过高估计 (Overestimation)。这个问题会导致智能体的学习过程不稳定,甚至无法收敛到最优策略。为了解决这一挑战,研究者们提出了Double DQN,一个对原始DQN的优雅而高效的改进。

本篇博客旨在带领大家深入理解Double DQN的核心思想,并通过一个完整的、带有详细注释的PyTorch代码实例,从零开始构建、训练并评估一个Double DQN智能体。我们将以经典的Pendulum-v1环境为例,一步步揭开Double DQN如何通过解耦“动作选择”与“价值评估”来缓解过高估计问题,最终实现更稳定、更高效的学习。

无论您是RL的初学者,还是希望深化对DQN家族算法理解的实践者,相信通过本文的理论讲解和代码剖析,您都能对Double DQN有一个更透彻的认识。让我们开始吧!

完整代码:下载链接


理论篇:为什么需要 Double DQN?

在深入代码之前,我们首先需要理解Double DQN所要解决的核心问题。普通的DQN算法在更新Q值时,通常会系统性地高估动作的价值,这个问题在动作空间较大的任务中尤为严重。

让我们通过下面这张图文并茂的理论讲解来一探究竟。

普通DQN算法通常会导致对Q值的过高估计 (overestimation)。传统DQN优化的TD误差目标为:

其中 max ⁡ a ′ Q ω − ( s ′ , a ′ ) \max_{a^{\prime}}Q_{\omega^{-}}\left(s^{\prime},a^{\prime}\right) maxaQω(s,a)由目标网络 (参数为ω⁻) 计算得出,我们还可以将其写成如下形式:

换句话说,max操作实际上可以被拆解为两部分:首先选取状态s’下的最优动作 a ∗ = arg ⁡ max ⁡ a ′ Q ω − ( s ′ , a ′ ) a^*=\arg\max_{a^{\prime}}Q_{\omega^-}\left(s^{\prime},a^{\prime}\right) a=argmaxaQω(s,a),接着计算该动作对应的价值 Q ω − ( s ′ , a ∗ ) Q_{\omega^-}\left(s^{\prime},a^*\right) Qω(s,a)。当这两部分采用同一套Q网络进行计算时,每次得到的都是神经网络当前估算的所有动作价值中的最大值。

问题在于,神经网络的估算值本身在某些时候会产生正向或负向的误差。在DQN的更新方式下,神经网络会正向误差累积。因为max操作会倾向于选择那些被“偶然”高估了价值的动作。因此,当我们用DQN的更新公式进行更新时,用于计算目标值的max Q本身就可能被高估了。同理,我们拿这个被高估的值来作为更新目标来更新上一步的值时,同样会过高估计,这样的误差将会逐步累积。对于动作空间较大的任务,DQN中的过高估计问题会非常严重,造成DQN无法有效工作。

为了解决这一问题,Double DQN算法提出利用两个独立训练的神经网络估算 max ⁡ a ′ Q ∗ ( s ′ , a ′ ) \max_{a^{\prime}}Q_*(s^{\prime},a^{\prime}) maxaQ(s,a)。具体做法是将原有的 max ⁡ a ′ Q ω − ( s ′ , a ′ ) \max_{a^{\prime}}Q_{\omega^{-}}\left(s^{\prime},a^{\prime}\right) maxaQω(s,a)更改为 Q ω − ( s ′ , arg ⁡ max ⁡ a ′ Q ω ( s ′ , a ′ ) ) Q_{\omega^-}\left(s^{\prime},\arg\max_{a^{\prime}}Q_\omega\left(s^{\prime},a^{\prime}\right)\right) Qω(s,argmaxaQω(s,a))

这个公式的核心思想是解耦(Decoupling)

  1. 动作选择 (Action Selection): 利用主网络(参数为ω)的输出来选取价值最大的动作,即 arg ⁡ max ⁡ a ′ Q ω ( s ′ , a ′ ) \arg\max_{a^{\prime}}Q_\omega\left(s^{\prime},a^{\prime}\right) argmaxaQω(s

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/85391.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/85391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四非鼠鼠计算机专业的保研分享

四非鼠鼠的计算机专业保研分享 1.前言 鼠鼠的本科学校是一所不怎么出名的四非院校,专业是计算机科学与技术。在写下这篇文章时,鼠鼠并不是为了炫耀什么,而是想把自己在保研路上的一些踩坑经历分享出来,尤其是写给那些和我一样&a…

【C++详解】STL-vector使用底层剖析和实现

文章目录 vector介绍vector和string的区别补充知识initializer_listemplace_back结构化绑定 vector的使用构造析构遍历修改insertfind流插入/流提取vector\<vector>(杨辉三角) vector模拟实现浅品STL源码构造函数拷贝构造多参数构造迭代器区间构造n个val初始化swapoperat…

MySql升级安装、socket 及密码重置

升级 项目需要使用Mysql8.0, 查看自己的ubuntu22.04上mysql版本为5.7&#xff0c; 使用以下命令自动升级到8.0版本。 sudo apt install Mysqlsock错误&#xff1a; Can’t connect to local MySQL server through socket 运行mysql -u -p 报以下错误&#xff1a; ERROR 200…

Python网络爬虫技术:从入门到实战

在当今数字化时代&#xff0c;网络爬虫技术已经成为数据挖掘和信息收集的重要工具。通过网络爬虫&#xff0c;我们可以高效地从互联网上获取大量有价值的数据&#xff0c;用于数据分析、市场研究、学术研究等多种场景。本文将带你从零开始&#xff0c;了解Python网络爬虫的基本…

偏微分方程初值问题求解

题目 问题 2. (a) u t + 3 u x − 2 u y = x ; u t + x u x + y u y = x ; u_t + 3u_x - 2u_y = x; \quad u_t + xu_x + yu_y = x; ut​+3ux​−2uy​=x;ut​+xux​+yuy​=x; u t + x u x − y u y = x ; u t + y u x + x u y = x ; u_t + xu_x - yu_y = x; \quad u_t + yu_…

【专业梳理】PMP知识体系,以SIPOC流程图为核心的质量工具扩展

​​1. SIPOC流程图:质量管理的起点​​ SIPOC(Supplier-Input-Process-Output-Customer)是六西格玛和流程管理中的核心工具,用于定义和优化跨职能流程。在PMBOK中,它与质量管理知识领域(尤其是质量规划、质量保证)紧密关联: ​​质量规划​​:通过SIPOC明确流程边界…

OpenCV指定pid和vid通过MSMF打开摄像头

在基于OpenCV的项目中&#xff0c;实际开发过程会面临设备上存在多个摄像头&#xff0c;需要指定摄像头的pid和vid打开摄像头。在OpenCV通过MSMF打开摄像头时&#xff0c;需要传入摄像头的index&#xff0c;因此需要在打开该摄像头前需要找出摄像头的index&#xff0c;下面给出…

STM32F103ZET6系统启动过程

STM32F103ZET6系统启动过程 一、概述 STM32F103ZET6启动过程指硬件选择启动模式后,执行固件程序之前的一系列动作。对于系统存储器模式,系统执行Bootloader程序升级状态,检测数据进行串口升级;对于内部Flash模式,系统执行启动文件,设置堆栈大小,配置系统时钟,最终调用…

[Data Pipeline] Kafka消息 | Redis缓存 | Docker部署(Lambda架构)

第七章&#xff1a;Kafka消息系统&#xff08;实时流处理&#xff09; 欢迎回到数据探索之旅&#xff01; 在前六章中&#xff0c;我们构建了强大的**批量处理流水线**。 通过Airflow DAG&#xff08;批量任务编排&#xff09;协调Spark作业&#xff08;数据处理&#xff09;…

jquery 赋值时不触发change事件解决——仙盟创梦IDE

一、传统方法jquey change $(#village_id).trigger(change);$("#village_id").val(99);$("#village_id").change(); 不生效 二、传统方法jquey $(#village_id).trigger(change); 四、传统方法jquey <input type"text" /> <button…

Android | 签名安全

检验和签名 校验开发者在数据传送时采用的一种校正数据的一种方式&#xff0c; 常见的校验有:签名校验(最常见)、dexcrc校验、apk完整性校验、路径文件校验等。 通过对 Apk 进行签名&#xff0c;开发者可以证明对 Apk 的所有权和控制权&#xff0c;可用于安装和更新其应用。…

Android14 耳机按键拍照

在相机拍照预览界面 通过耳机按键实现拍照功能 耳机按键定义 frameworks/base/core/java/android/view/KeyEvent.java public static final int KEYCODE_HEADSETHOOK 79;相机界面 拍照逻辑 DreamCamera2\src\com\android\camera\PhotoModule.java Override public bool…

【AI作画】第2章comfy ui的一般输入节点,文本框的类型和输入形式

目录 CLIP文本编码器 条件输出和文本输出 转换某一变量为输入 展示作品集 在默认的工作流之外&#xff0c;我们如何自己添加节点呢&#xff1f; 一般我们用到的sampler采样器在“鼠标右键——添加节点——采样——K采样器” 我们用的clip文本编码器在“鼠标右键——添加节…

vue3仿高德地图官网路况预测时间选择器

<template><div class"time-axis-container"><div class"time-axis" ref"axisRef"><!-- 刻度线 - 共25个刻度(0-24) --><divv-for"hour in 25":key"hour - 1"class"tick-mark":class&…

ZArchiver:高效解压缩,轻松管理文件

在数字时代&#xff0c;文件的压缩与解压已成为我们日常操作中不可或缺的一部分。无论是接收朋友分享的大文件&#xff0c;还是下载网络资源&#xff0c;压缩包的处理都极为常见。ZArchiver正是一款为安卓用户精心打造的解压缩软件&#xff0c;它以强大的功能、简洁的界面和高效…

1432.改变一个整数能得到的最大差值

贪心思想&#xff0c;为了得到最大差&#xff0c;想办法变成一个最大的数和一个最小的数。 这里有规则&#xff0c;从最高位开始&#xff0c; 变成最大&#xff0c;如果<9&#xff0c;则将该数位代表的数都变成9&#xff0c;如果该数位已经是9了&#xff0c;则将下一个数位…

前端跨域解决方案(4):postMessage

1 postMessage 核心 postMessage 是现代浏览器提供的跨域通信标准 API&#xff0c;允许不同源的窗口&#xff08;如主页面与 iframe、弹出窗口、Web Worker&#xff09;安全交换数据。相比其他跨域方案&#xff0c;它的核心优势在于&#xff1a; 双向通信能力&#xff1a;支持…

大语言模型指令集全解析

在大语言模型的训练与优化流程中&#xff0c;指令集扮演着关键角色&#xff0c;它直接影响模型对任务的理解与执行能力。以下对常见指令集展开详细介绍&#xff0c;涵盖构建方式、规模及适用场景&#xff0c;助力开发者精准选用 为降低指令数据构建成本&#xff0c;学术界和工…

OpenCV CUDA模块设备层-----用于封装CUDA纹理对象+ROI偏移量的一个轻量级指针类TextureOffPtr()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 TextureOffPtr<T, R> 是 OpenCV 的 CUDA 模块&#xff08;opencv_cudev&#xff09;中用于封装 CUDA 纹理对象 ROI 偏移量 的一个轻量级指…

Python 数据分析10

2.3.3其他 除了前面所介绍的常用语数据挖掘建模的库之外&#xff0c;还有许多库也运用于数据挖掘建模&#xff0c;如jieba、SciPy、OpenCV、Pillow等。 1.jieba jieba是一个被广泛使用的Python第三方中文分词库。jieba使用简单&#xff0c;并且支持Python、R、C等多种编程语言的…